From a27b3cc344f7fcc95848531c8c87e03560f8eb53 Mon Sep 17 00:00:00 2001 From: hossinasaadi Date: Sat, 27 Jun 2026 16:14:38 +0100 Subject: [PATCH 1/3] allow UDP source port changes for same client IP --- proxy/socks/temp_udp_listen.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/proxy/socks/temp_udp_listen.go b/proxy/socks/temp_udp_listen.go index 5e0dab03d977..34665faaa67d 100644 --- a/proxy/socks/temp_udp_listen.go +++ b/proxy/socks/temp_udp_listen.go @@ -37,15 +37,11 @@ func (c *TempUDPConn) Read(b []byte) (n int, err error) { remote := remote.(*net.UDPAddr) expected := c.ExpectedRemote.Load() if remote.IP.Equal(expected.IP) { - if remote.Port == expected.Port { - c.Timer.Update() - return - } - if expected.Port == 0 { + if remote.Port != expected.Port { c.ExpectedRemote.Store(remote) - c.Timer.Update() - return } + c.Timer.Update() + return } } } From 8a1a651443e82a7f466f496e2de2f179e699777b Mon Sep 17 00:00:00 2001 From: hossinasaadi Date: Sat, 27 Jun 2026 16:39:17 +0100 Subject: [PATCH 2/3] track UDP associate endpoint by client IP --- proxy/socks/protocol.go | 1 - proxy/socks/temp_udp_listen.go | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/proxy/socks/protocol.go b/proxy/socks/protocol.go index 5d4cfd9d9b34..7d982f0c835d 100644 --- a/proxy/socks/protocol.go +++ b/proxy/socks/protocol.go @@ -214,7 +214,6 @@ func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer net.Co expectedRemote.IP = writer.RemoteAddr().(*net.TCPAddr).IP // unix? } else { expectedRemote.IP = request.Address.IP() - expectedRemote.Port = int(request.Port) // 0 is allowed } tempUDPConn = NewTempUDPConn(udpHub, writer, expectedRemote) } diff --git a/proxy/socks/temp_udp_listen.go b/proxy/socks/temp_udp_listen.go index 34665faaa67d..d1459c67bc9c 100644 --- a/proxy/socks/temp_udp_listen.go +++ b/proxy/socks/temp_udp_listen.go @@ -37,9 +37,7 @@ func (c *TempUDPConn) Read(b []byte) (n int, err error) { remote := remote.(*net.UDPAddr) expected := c.ExpectedRemote.Load() if remote.IP.Equal(expected.IP) { - if remote.Port != expected.Port { - c.ExpectedRemote.Store(remote) - } + c.ExpectedRemote.Store(remote) c.Timer.Update() return } From c541b41098f7c11f6a3d20e94bffb380a4415ca0 Mon Sep 17 00:00:00 2001 From: hossinasaadi Date: Sat, 27 Jun 2026 18:08:45 +0100 Subject: [PATCH 3/3] fix port --- proxy/socks/protocol.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/proxy/socks/protocol.go b/proxy/socks/protocol.go index 7d982f0c835d..829d9a571616 100644 --- a/proxy/socks/protocol.go +++ b/proxy/socks/protocol.go @@ -215,6 +215,9 @@ func (s *ServerSession) handshake5(nMethod byte, reader io.Reader, writer net.Co } else { expectedRemote.IP = request.Address.IP() } + if request.Port != 0 { + expectedRemote.Port = int(request.Port) + } tempUDPConn = NewTempUDPConn(udpHub, writer, expectedRemote) } if err := writeSocks5Response(writer, statusSuccess, responseAddress, responsePort); err != nil {