14

私は過去数日間、socks4/5プロキシを介したDNSリークを防ぐための良い解決策を探して髪を引っ張ってきました。

SocksiPy(-branch)モジュールを調べて、いくつかのもの(urllib、urllib2、dnstools)をラップしようとしましたが、それらはすべてDNS要求をリークしているようです。pyCurlもそうです。

proxychains /proxyresolvがsocks4/5プロキシを介してDNS要求をスローできることは知っています。また、SocksiPyと同じように、いくつかのLD_PRELOADライブラリを使用してモンキーパッチソケットの機能を実行しますが、その理由がわかりません。 socks4またはsocks5プロキシを介してDNSを送信しません。

Linuxの場合、libproxychains.soでCTypeを使用して解決できる可能性があると思いますが、マルチプラットフォームのものを探しているので、ソケットモジュールにモンキーパッチを適用するのが良い方法だと思います。

誰かがこれを回避するための良い方法を考え出しましたか?移植性のためにすべてをコード内で実行したいのですが、別のプロキシサーバーを実行することに頼りたくありません。

ありがとう!

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 に答える