From b4cfe4f12239491a9641316ab1f719998a92d91d Mon Sep 17 00:00:00 2001 From: Fangliding Date: Wed, 17 Jun 2026 20:27:26 +0800 Subject: [PATCH] chore --- proxy/socks/protocol.go | 7 +++---- proxy/socks/server.go | 13 ++++++++++--- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/proxy/socks/protocol.go b/proxy/socks/protocol.go index 8d3fa268..a10dde34 100644 --- a/proxy/socks/protocol.go +++ b/proxy/socks/protocol.go @@ -196,9 +196,6 @@ func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer net.Co var tempUDPConn *TempUDPConn //nolint:gocritic // Use if else chain for clarity if request.Command == protocol.RequestCommandUDP { - if request.Address.Family().IsDomain() { - return nil, nil, errors.New("domain name in UDP associate is illegal") - } if s.config.Address != nil { // Use configured IP as remote address in the response to UDP Associate responseAddress = s.config.Address.AsAddress() @@ -212,7 +209,9 @@ func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer net.Co } responsePort = net.Port(udpHub.LocalAddr().(*net.UDPAddr).Port) expectedRemote := &gonet.UDPAddr{} - if request.Address.IP().IsUnspecified() { + // if request address is a domain(udp associate should not have request domain) + // treat it as unspecified + if request.Address.Family().IsDomain() || request.Address.IP().IsUnspecified() { expectedRemote.IP = writer.RemoteAddr().(*net.TCPAddr).IP // unix? } else { expectedRemote.IP = request.Address.IP() diff --git a/proxy/socks/server.go b/proxy/socks/server.go index 53049dfe..02e2d421 100644 --- a/proxy/socks/server.go +++ b/proxy/socks/server.go @@ -4,6 +4,7 @@ import ( "context" goerrors "errors" "io" + "sync" "time" "github.com/xtls/xray-core/common" @@ -216,18 +217,24 @@ func (s *Server) handleUDPPayload(ctx context.Context, conn stat.Connection, dis defer udpServer.RemoveRay() inbound := session.InboundFromContext(ctx) - if inbound != nil && inbound.Source.IsValid() { - errors.LogInfo(ctx, "client UDP connection from ", inbound.Source) - } var dest *net.Destination reader := buf.NewPacketReader(conn) + var changeRemote sync.Once for { mpayload, err := reader.ReadMultiBuffer() if err != nil { return err } + changeRemote.Do(func() { + if inbound != nil { + // change source to real remote UDP address + inbound.Source = net.DestinationFromAddr(conn.RemoteAddr()) + inbound.Local = net.DestinationFromAddr(conn.LocalAddr()) + errors.LogInfo(ctx, "client UDP connection from ", inbound.Source) + } + }) for _, payload := range mpayload { request, err := DecodeUDPPacket(payload)