在过去的几天里,我一直在努力寻找一个好的解决方案来防止socks4/5代理上的DNS泄漏。
我研究了SocksiPy(-branch)模块,并尝试包装了许多东西(urllib、urllib2、dnstools),但它们似乎都仍然泄漏DNS请求。pyCurl也是如此。
我知道proxychains/proxyresolv可以通过socks4/5代理抛出DNS请求,它可以像SocksiPy一样用一些LD_PRELOAD库神奇地修补套接字的函数,但我似乎不明白它为什么不通过socks4或socks5代理发送DNS。
我想对于linux我可以使用CTypes和libproxychains.so来做我的解析,但是我正在寻找一种多平台的东西,所以我认为对套接字模块进行简单的修补是可行的。
有没有人想出一个好办法来解决这个问题?为了可移植性,我想在代码中完成所有这些工作,并且我不想求助于运行另一个代理服务器!
谢谢!
发布于 2012-11-04 06:40:54
好吧,我想通了。您需要在开始使用套接字之前设置默认代理(例如,在导入任何使用它的内容之前)。您还需要monkeypatch的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上找到更新的代码和东西
https://stackoverflow.com/questions/13184205
复制相似问题