2

以下の例では、Python で tor を使用できますが、.onion サイトに接続しようとすると、「名前またはサービスが不明です」などのエラーが表示されます。これを修正するにはどうすればよいですか?

サンプルコード:

import socket
import socks
import httplib

def connectTor():
    socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1",9050,True)
    socket.socket = socks.socksocket
    print "Connected to tor"

def newIdentity():
    HOST = '127.0.0.1'
    socks.setdefaultproxy()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST,9051))
    s.send("AUTHENTICATE\r\n")
    response = s.recv(128)
    if response.startswith("250"):
        s.send("SIGNAL NEWNYM\r\n"),
    s.close()
    connectTor()

def readPage(page):
    conn = httplib.HTTPConnection(page)
    conn.request("GET","/")
    response = conn.getresponse()
    print (response.read())

def main():
    connectTor()
    print "Tor Ip Address :"
    readPage("my-ip.heroku.com")
    print "\n\n"
    readPage("od6j46sy5zg7aqze.onion")
    return 0

if __name__ == '__main__':
    main()
4

2 に答える 2

1

これはあなたの問題だと思いますが、私は間違っているかもしれません。

モンキーパッチを使用して、SOCKS5プロキシを使用してTORと通信socket.socketするように強制します。HTTPConnectionただし、をHTTPConnection呼び出します。これにより、ソケットを作成するために呼び出す前に、名前を解決するために呼び出されます。そして、を使用しません。つまり、パッチが適用されていないため、SOCKS5プロキシと通信していないため、デフォルトの名前リゾルバーが使用されています。socket.create_connectionsocket.getaddrinfosocket.socketgetaddrinfosocket

これは、通常のインターネットホストへの接続をプロキシする場合に正常に機能します。これは、TORが「my-ip.heroku.com」に対して通常の名前リゾルバーと同じDNS結果を返すためです。ただし、通常の名前リゾルバーには.onion TLDがないため、「od6j46sy5zg7aqze.onion」では機能しません。

興味がある場合は、、、、および(Cの最後HTTPConnection.connectで、プラットフォームに応じてモジュール全体に散在している)のソースを確認できます。socket.create_connectiongetaddrinfo

では、これをどのように解決しますか?さて、呼び出されるSOCKS5モジュールの2つを見るとsocks、1つは代わりに直接monkeypatchedできる関数を持っていますcreate_connection(そのAPIは同一ではありませんが、HTTPConnection必要なものには十分に近いです)。もう1つはそうではありませんが、1つを簡単に作成できます(呼び出しsocks.socksocketてからそのconnectメソッドを呼び出すだけです)。または、HTTPConnectionを作成してそのメソッドsocket.socketを呼び出すように変更することもできます。connect

socks最後に、さまざまなモジュールのほとんどに、 DNS解決が実際には機能しないのに、DNS解決がリモートで実行されることを明確に主張するsetdefaultproxy名前のパラメーターを持つ関数があるのはなぜか疑問に思われるかもしれません。remote_dnsを使用すると機能しますが、を使用すると機能しないsocks.socksocket可能性がありますsocket.getaddrinfo

ちなみに、DnsResolverとTorifyHOWTOをまだ読んでいない場合は、進む前に読んでください。なぜ機能するのかわからないまま機能するコードをたたくだけで、あなた(またはユーザー)が情報を漏らしてしまうことがほぼ確実だからです。あなたは自分が匿名だと思っていました。

于 2013-02-20T19:16:36.420 に答える
0

ポート 80 をオニオン アドレスに追加して、DNS ルックアップを回避できます。例 readPage("od6j46sy5zg7aqze.onion:80")

urllib2 では、プロトコル (つまり http) も指定する必要があります。

urllib2 をインポート

print urllib2.urlopen(" http://od6j46sy5zg7aqze.onion:80 ").read()

于 2014-03-10T15:29:20.093 に答える