DNS代理?

Fit*_*lip 13 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来做我的解决方案,但我正在寻找多平台的东西,所以我认为猴子修补套接字模块是要走的路.

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

谢谢!

Fit*_*lip 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
Run Code Online (Sandbox Code Playgroud)

这可以通过您导入的任何模块代替urllib来处理和代理所有DNS请求.希望它可以帮助那里的人!

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

  • 啊,好的电话!对于那个很抱歉.它被忽略了,你激励我在星期六晚上实际做点什么.http://fitblip.pub/2012/11/13/proxying-dns-with-python/(请原谅任何疯狂的CSS事情将会发生) (2认同)