示例代码:
#!/usr/bin/python
import socks
import socket
import urllib2
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "127.0.0.1", 9050, True)
socket.socket = socks.socksocket
print urllib2.urlopen("http://almien.co.uk/m/tools/net/ip/").read()
TOR 在端口 9050(默认)上运行 SOCKS 代理。该请求通过 TOR,出现在我自己以外的 IP 地址上。但是,TOR 控制台会发出警告:
“Feb 28 22:44:26.233 [警告] 您的应用程序(使用 socks4 到端口 80)只给 Tor 一个 IP 地址。执行 DNS 解析的应用程序可能会泄漏信息。考虑使用 Socks4A(例如通过 privoxy 或 socat)。有关更多信息,请参阅 https://wiki.torproject.org/TheOnionRouter/TorFAQ#SOCKSAndDNS。”
即DNS 查找不通过代理。但这就是 setdefaultproxy 的第四个参数应该做的,对吧?
来自http://socksipy.sourceforge.net/readme.txt:
setproxy(proxytype, addr[, port[, rdns[, username[, password]]]])
rdns - 这是一个布尔标志,用于修改有关 DNS 解析的行为。如果设置为 True,DNS 解析将在服务器上远程执行。
选择 PROXY_TYPE_SOCKS4 和 PROXY_TYPE_SOCKS5 的效果相同。
它不能是本地 DNS 缓存(如果 urllib2 甚至支持它),因为它发生在我将 URL 更改为该计算机以前从未访问过的域时。