使用python连接到.onion网络

时间:2013-02-20 18:48:47

标签: python proxy tor

我想让make python从控制台进入.onion网站,下面的例子可以在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()

2 个答案:

答案 0 :(得分:2)

我认为这是你的问题,但我可能错了。

您依靠monkeypatching socket.socket强制HTTPConnection使用您的SOCKS5代理与TOR交谈。但HTTPConnection调用socket.create_connection,在调用socket.getaddrinfo创建套接字之前调用socket.socket来解析名称。并getaddrinfo不使用socket。所以,它没有打补丁,所以它不与你的SOCKS5代理交谈,因此它使用你的默认名称解析器。

这适用于代理连接到普通互联网主机的连接,因为TOR将返回与“普通名称解析器”相同的“my-ip.heroku.com”DNS结果。但它不适用于“od6j46sy5zg7aqze.onion”,因为您的普通名称解析器中没有.onion TLD。

如果您感到好奇,可以看到HTTPConnection.connectsocket.create_connectiongetaddrinfo的来源(C中的最后一个,并且根据您的平台分散在整个模块中)。

那么,你怎么解决这个问题?好吧,看看两个名为socks的SOCKS5模块,其中一个模块可以直接用monkeypatched代替create_connection(它的API不相同,但它足够接近HTTPConnection socks.socksocket 1}}需要);另一个没有,但你可以很容易地写一个(只需调用connect然后调用它的HTTPConnection方法)。或者,您可以修改socket.socket以创建connect并调用其socks方法。

最后,您可能想知道为什么大多数不同的setdefaultproxy模块都有一个remote_dns函数,其中一个名为socks.socksocket的参数明确声称它会导致远程执行DNS解析,什么时候实际上没有用。好吧,如果您使用socket.getaddrinfo 会有效,但如果您使用{{1}}则无法正常工作。

顺便说一句,如果你还没有读过DnsResolverTorifyHOWTO,那么在进一步阅读之前先阅读它们,因为只是试图将一些有效的代码拼凑起来而不知道它为什么会起作用几乎可以保证当您认为自己是匿名时,会导致您(或您的用户)泄露信息。

答案 1 :(得分:0)

您可以将端口80添加到洋葱地址以避免DNS查找。 例如readPage( “od6j46sy5zg7aqze.onion:80”)

使用urllib2你还需要指定协议(即http) e.g。

import urllib2

print urllib2.urlopen(“http://od6j46sy5zg7aqze.onion:80”)。read()