DNS sobre proxy?

Durante los últimos días he estado sacándome el pelo buscando una buena solución para evitar fugas de DNS en un proxy socks4 / 5.

He buscado en el módulo SocksiPy (-branch) y he intentado envolver una serie de cosas (urllib, urllib2, dnstools), pero todas parecen seguir filtrando solicitudes de DNS. Lo mismo ocurre con PyCurl.

Sé que proxychains / proxyresolv puede lanzar solicitudes de DNS a través de un proxy socks4 / 5, y hace todo lo que es mágico con algunas bibliotecas LD_PRELOAD para las funciones del socket mono-patch, al igual que SocksiPy, pero parece que no entiendo por qué. no envía DNS a través de un proxy socks4 o socks5.

Supongo que para Linux puedo usar CTypes con libproxychains.so para hacer mi resolución, pero estoy buscando algo multiplataforma, así que creo que parchear el módulo de socket es el camino a seguir.

¿Alguien ha descubierto una buena manera de evitar esto? Quiero hacerlo todo en el código por la portabilidad, ¡y no quiero recurrir a ejecutar otro servidor proxy!

¡Gracias!

Bueno, lo he descubierto. Debe configurar su proxy predeterminado ANTES de comenzar a usar el socket (por ejemplo, antes de importar cualquier cosa que lo use). También es necesario que Monkeypatch la parte getaddrinfo de socket, entonces todo funciona bien.

import socks import socket # Can be socks4/5 socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,'127.0.0.1', 9050) socket.socket = socks.socksocket # Magic! def getaddrinfo(*args): return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))] socket.getaddrinfo = getaddrinfo import urllib 

Esto funciona y distribuye todas las solicitudes de DNS a través de cualquier módulo que importe en lugar de urllib. Espero que ayude a alguien por ahí!

EDITAR: Puedes encontrar código actualizado y cosas en mi blog