diff --git a/app/internal/socks5/server.go b/app/internal/socks5/server.go index e451637..9c6ce24 100644 --- a/app/internal/socks5/server.go +++ b/app/internal/socks5/server.go @@ -254,7 +254,12 @@ func (s *Server) udpServer(udpConn *net.UDPConn, hyUDP client.HyUDPConn) error { if err != nil { continue } - addr = addr[1:] // Remove the leading length byte + if atyp == socks5.ATYPDomain { + // socks5.ParseAddress adds a leading byte for domains, + // but socks5.NewDatagram will add it again as it expects a raw domain. + // So we must remove it here. + addr = addr[1:] + } d := socks5.NewDatagram(atyp, addr, port, bs) _, _ = udpConn.WriteToUDP(d.Bytes(), clientAddr) } diff --git a/app/internal/socks5/server_test.py b/app/internal/socks5/server_test.py index 4515561..5dae4d2 100644 --- a/app/internal/socks5/server_test.py +++ b/app/internal/socks5/server_test.py @@ -6,33 +6,51 @@ ADDR = "127.0.0.1" PORT = 11080 -def test_tcp(size, count, it): +def test_tcp(size, count, it, domain=False): for i in range(it): s = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM) s.set_proxy(socks.SOCKS5, ADDR, PORT) - s.connect(("test_tcp", 12345)) + if domain: + s.connect(("test.tcp.com", 12345)) + else: + s.connect(("1.2.3.4", 12345)) + for j in range(count): payload = os.urandom(size) s.send(payload) rsp = s.recv(size) assert rsp == payload + s.close() -def test_udp(size, count, it): +def test_udp(size, count, it, domain=False): for i in range(it): s = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM) s.set_proxy(socks.SOCKS5, ADDR, PORT) for j in range(count): payload = os.urandom(size) - s.sendto(payload, ("test_udp", 12345)) + + if domain: + s.sendto(payload, ("test.udp.com", 12345)) + else: + s.sendto(payload, ("1.2.3.4", 12345)) + rsp, addr = s.recvfrom(size) - assert rsp == payload and addr == (b"test_udp", 12345) + assert rsp == payload + + if domain: + assert addr == (b"test.udp.com", 12345) + else: + assert addr == ("1.2.3.4", 12345) + s.close() if __name__ == "__main__": - test_tcp(1024, 1024, 10) - test_udp(1024, 1024, 10) + test_tcp(1024, 1024, 10, domain=False) + test_tcp(1024, 1024, 10, domain=True) + test_udp(1024, 1024, 10, domain=False) + test_udp(1024, 1024, 10, domain=True)