サンプルコード:
#!/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 [警告] あなたのアプリケーション (ポート 80 に socks4 を使用) は、Tor に IP アドレスのみを与えています。DNS 解決を行うアプリケーションは、情報を漏洩する可能性があります。代わりに Socks4A (privoxy または socat 経由など) を使用することを検討してください。詳細については、 https://wiki.torproject.org/TheOnionRouter/TorFAQ#SOCKSAndDNSを参照してください。"
つまり、DNS ルックアップはプロキシを経由しません。しかし、それが setdefaultproxy の 4 番目のパラメーターが行うべきことですよね?
http://socksipy.sourceforge.net/readme.txtから:
setproxy(proxytype, addr[, port[, rdns[, username[, password]]]])
rdns - これはブール値のフラグで、DNS 解決に関する動作を変更します。True に設定されている場合、DNS 解決はサーバー上でリモートで実行されます。
PROXY_TYPE_SOCKS4 と PROXY_TYPE_SOCKS5 の両方を選択しても同じ効果があります。
このコンピューターが以前にアクセスしたことのないドメインに URL を変更すると発生するため、ローカル DNS キャッシュにすることはできません (urllib2 がそれをサポートしている場合)。