DNS代理?

时间:2012-11-01 19:32:58

标签: python dns proxy

过去几天我一直在拔头发寻找一个好的解决方案来防止在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来做我的解决方案,但我正在寻找多平台的东西,所以我认为猴子修补套接字模块是要走的路。

有没有人想出一个解决这个问题的好方法?为了便携性,我想在代码中完成所有操作,并且我不想再使用另一个代理服务器!

谢谢!

1 个答案:

答案 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

上找到更新的代码和内容