Un conector compatible con SOCKS para sockets TCP de Python
Elija un conector de sockets que entienda el proxy y mantenga su alcance separado de la implementación de sockets global de Python.
Un socket Python en bruto no negocia un proxy porque exista http_proxy. Para una aplicación que habla su propio protocolo TCP, use un conector que entienda el servicio en el extremo del proxy.
Con PySocks ya disponible, cree la conexión explícitamente:
import socks
with socks.socksocket() as connection:
connection.set_proxy(socks.SOCKS5, '203.0.113.10', 1080)
connection.settimeout(10)
connection.connect(('example.com', 12345))
# Exchange the destination protocol here.
Sustituya la dirección de documentación y el puerto de destino. Para un destino público permitido, seleccione un candidato de la lista de proxies SOCKS5 solo después de comprobar que permite el puerto objetivo de la aplicación. Compruebe el paquete instalado, los métodos admitidos y los requisitos del extremo con la interfaz de PySocks.
El resto de la aplicación intercambia su protocolo sobre esta conexión establecida. Si ese protocolo usa TLS, inícielo después de la negociación del proxy y verifique el nombre de host real del destino. La autenticación del proxy establece la ruta; no proporciona el inicio de sesión en el destino ni el cifrado.
Un receptor SOCKS necesita negociación SOCKS. Un servicio HTTP necesita un conector compatible con CONNECT para un destino TCP arbitrario y puede denegar su puerto. Elija el conector según el servicio que realmente se ofrece, en lugar de cambiar una dirección dejando el saludo inicial equivocado.
Mantenga la sustitución local. Asignar una clase a socket.socket puede afectar a importaciones y bibliotecas no relacionadas. Si otra biblioteca controla la creación de sockets, use su fábrica de conexiones u opción de proxy documentada; un diccionario que nunca lee no puede cambiar esa conexión.