14

在过去的几天里,我一直在寻找一个好的解决方案来防止通过 socks4/5 代理的 DNS 泄漏。

我查看了 SocksiPy(-branch) 模块,并试图包装一些东西(urllib、urllib2、dnstools),但它们似乎仍然泄露了 DNS 请求。pyCurl 也是如此。

我知道 proxychains/proxyresolv 可以通过 socks4/5 代理抛出 DNS 请求,并且它使用一些 LD_PRELOAD 库来猴子补丁套接字的功能,就像 SocksiPy 一样,但我似乎无法弄清楚为什么它不通过 socks4 或 socks5 代理发送 DNS。

我想对于 linux,我可能可以将 CTypes 与 libproxychains.so 一起使用来解决问题,但我正在寻找多平台的东西,所以我认为猴子修补套接字模块是要走的路。

有没有人想出一个解决这个问题的好方法?为了可移植性,我想在代码中完成这一切,我不想求助于运行另一个代理服务器!

谢谢!

4

1 回答 1

19

好吧,我想通了。您需要在开始使用套接字之前设置您的默认代理(例如,在您导入任何使用它的东西之前)。您还需要对套接字的 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 请求。希望它可以帮助那里的人!

编辑:您可以在我的博客上找到更新的代码和内容

于 2012-11-03T22:40:53.633 回答