Skip to content

frp似乎会代替TCP服务端回复[FIN ACK]? #4766

@Curtion

Description

@Curtion

Bug Description

frp在收到客户端FIN后会好像直接回复[FIN ACK], 从而导致后续数据包服务端无法正常发送给客户端。这里给出一个客户端和服务端的示例代码,如果在本地连接则正常,如果通过FRP转发则异常

frpc Version

0.62.0

frps Version

0.62.0

System Architecture

frps:linux/amd64; frpc:windows/amd64

Configurations

服务端代码:

package main

import (
	"fmt"
	"net"
)

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:21000")
	if err != nil {
		fmt.Println("Error listening:", err.Error())
		return
	}
	defer listener.Close()
	fmt.Println("Server listening on :21000")

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error accepting:", err.Error())
			continue
		}
		go handleRequest(conn)
	}
}

func handleRequest(conn net.Conn) {
	defer conn.Close()

	buf := make([]byte, 1024)
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println("Error reading:", err.Error())
		return
	}

	data := string(buf[:n])
	fmt.Printf("Received from client: %s\n", data)

	_, err = conn.Write([]byte("Server received: " + data))
	if err != nil {
		fmt.Println("Error writing:", err.Error())
	}
}

客户端代码:

package main

import (
	"fmt"
	"net"
)

func main() {
	// conn, err := net.Dial("tcp", "127.0.0.1:21000")
	conn, err := net.Dial("tcp", "server:21666")
	if err != nil {
		fmt.Println("Error connecting:", err.Error())
		return
	}
	defer conn.Close()

	message := "hello"
	_, err = conn.Write([]byte(message))
	if err != nil {
		fmt.Println("Error sending:", err.Error())
		return
	}

	// Close write side to signal we're done sending
	tcpConn := conn.(*net.TCPConn)
	tcpConn.CloseWrite()

	buf := make([]byte, 1024)
	n, err := conn.Read(buf)
	if err != nil {
		fmt.Println("Error receiving:", err.Error())
		return
	}

	fmt.Printf("Server response: %s\n", string(buf[:n]))
}

Logs

Image

Image

Image

Steps to reproduce

TCP客户端在发送数据后立即关闭写入, 例如:

	tcpConn := conn.(*net.TCPConn)
	tcpConn.CloseWrite()

Affected area

  • Docs
  • Installation
  • Performance and Scalability
  • Security
  • User Experience
  • Test and Release
  • Developer Infrastructure
  • Client Plugin
  • Server Plugin
  • Extensions
  • Others

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions