Improve the response to UDP Associate in Socks5

This commit is contained in:
RPRX 2021-01-09 16:36:20 +00:00 committed by GitHub
parent 7427a55ef1
commit 700966508f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 14 deletions

View File

@ -39,10 +39,10 @@ var addrParser = protocol.NewAddressParser(
) )
type ServerSession struct { type ServerSession struct {
config *ServerConfig config *ServerConfig
address net.Address address net.Address
port net.Port port net.Port
clientAddress net.Address localAddress net.Address
} }
func (s *ServerSession) handshake4(cmd byte, reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) { func (s *ServerSession) handshake4(cmd byte, reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) {
@ -192,14 +192,11 @@ func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer io.Wri
//nolint:gocritic // Use if else chain for clarity //nolint:gocritic // Use if else chain for clarity
if request.Command == protocol.RequestCommandUDP { if request.Command == protocol.RequestCommandUDP {
if s.config.Address != nil { if s.config.Address != nil {
// Use configured IP as remote address in the response to UdpAssociate // Use configured IP as remote address in the response to UDP Associate
responseAddress = s.config.Address.AsAddress() responseAddress = s.config.Address.AsAddress()
} else if s.clientAddress == net.LocalHostIP || s.clientAddress == net.LocalHostIPv6 {
// For localhost clients use loopback IP
responseAddress = s.clientAddress
} else { } else {
// For non-localhost clients use inbound listening address // Use conn.LocalAddr() IP as remote address in the response by default
responseAddress = s.address responseAddress = s.localAddress
} }
} }
if err := writeSocks5Response(writer, statusSuccess, responseAddress, responsePort); err != nil { if err := writeSocks5Response(writer, statusSuccess, responseAddress, responsePort); err != nil {

View File

@ -89,10 +89,10 @@ func (s *Server) processTCP(ctx context.Context, conn internet.Connection, dispa
} }
svrSession := &ServerSession{ svrSession := &ServerSession{
config: s.config, config: s.config,
address: inbound.Gateway.Address, address: inbound.Gateway.Address,
port: inbound.Gateway.Port, port: inbound.Gateway.Port,
clientAddress: inbound.Source.Address, localAddress: net.IPAddress(conn.LocalAddr().(*net.TCPAddr).IP),
} }
reader := &buf.BufferedReader{Reader: buf.NewReader(conn)} reader := &buf.BufferedReader{Reader: buf.NewReader(conn)}