过去几天我一直在拔头发寻找一个好的解决方案来防止在socks4 / 5代理上发生DNS泄漏。
我查看了SocksiPy(-branch)模块,并尝试包装了许多内容(urllib,urllib2,dnstools),但它们似乎仍然泄漏了DNS请求。 pyCurl也是如此。
我知道proxychains / proxyresolv可以通过socks4 / 5代理抛出DNS请求,并且它通过一些LD_PRELOAD库来完成所有它的魔术,以便修补套接字的功能,就像SocksiPy那样,但我似乎无法想象为什么它不通过socks4或socks5代理发送DNS。
我想对于Linux我可以使用libproxychains.so的CType来做我的解决方案,但我正在寻找多平台的东西,所以我认为猴子修补套接字模块是要走的路。
有没有人想出一个解决这个问题的好方法?为了便携性,我想在代码中完成所有操作,并且我不想再使用另一个代理服务器!
谢谢!
答案 0 :(得分:17)
好吧我明白了。您需要在开始使用套接字之前设置默认代理(例如,在导入使用套接字的任何内容之前)。你还需要monkeypatch socket的getaddrinfo部分,然后一切正常。
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
这可以通过您导入的任何模块代替urllib来处理和代理所有DNS请求。希望它可以帮助那里的人!
编辑:您可以在blog
上找到更新的代码和内容