From 7e1770c45065a19da40adefeb6c9148645c153d4 Mon Sep 17 00:00:00 2001 From: HisShadow Date: Sun, 1 Mar 2026 14:03:39 +0300 Subject: [PATCH] Use returned IP address for UDP datagrams when possible Not all SOCKS servers listen for UDP datagrams on the same IP where the TCP server is located. Change completely ignoring returned address from associate command to checking whether the address is global, and if it is - using it to send datagrams to the server. This is in accordance with SOCKS5 RFC, which states, that client should use the address returned by server for UDP communications. --- socks.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/socks.py b/socks.py index 83b1435..cda5dc8 100644 --- a/socks.py +++ b/socks.py @@ -12,6 +12,7 @@ import socket import struct import sys +import ipaddress __version__ = "1.7.1" @@ -111,7 +112,6 @@ class HTTPError(ProxyError): DEFAULT_PORTS = {SOCKS4: 1080, SOCKS5: 1080, HTTP: 8080} - def set_default_proxy(proxy_type=None, addr=None, port=None, rdns=True, username=None, password=None): """Sets a default proxy. @@ -350,12 +350,23 @@ def bind(self, *pos, **kw): self._proxyconn.connect(proxy) UDP_ASSOCIATE = b"\x03" - _, relay = self._SOCKS5_request(self._proxyconn, UDP_ASSOCIATE, dst) + ret, relay = self._SOCKS5_request(self._proxyconn, UDP_ASSOCIATE, dst) - # The relay is most likely on the same host as the SOCKS proxy, - # but some proxies return a private IP address (10.x.y.z) - host, _ = proxy - _, port = relay + # check if returned ip address is private + bind_ip = relay[0] + use_bind_ip = True + try: + bind_ip_parsed = ipaddress.ip_address(bind_ip) + use_bind_ip = bind_ip_parsed.is_global + except ValueError: + use_bind_ip = False + + # use IP returned by relay, if it's not private, otherwise use relay's address + if use_bind_ip: + host, port = relay + else: + host, _ = proxy + _, port = relay super(socksocket, self).connect((host, port)) super(socksocket, self).settimeout(self._timeout) self.proxy_sockname = ("0.0.0.0", 0) # Unknown