Python - 通过代理使用socket.gethostbyname

时间:2013-12-11 20:47:10

标签: python sockets proxy tor

我正在使用TOR代理连接,但是在通过socket.gethostbyname("www.yahoo.com")代理DNS查找时遇到了困难 - 我了解到它没有通过使用wireshark嗅探流量来通过代理发送DNS流量。这是我正在使用的代码的副本

import StringIO
import socket
import socks  # SocksiPy module
import stem.process
from stem.util import term

SOCKS_PORT = 7000

socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', SOCKS_PORT)

socket.socket = socks.socksocket

def getaddrinfo(*args):
    return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))]
socket.getaddrinfo = getaddrinfo

socket.gethostbyname("www.yahoo.com") <--- This line is not sending traffic via proxy

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

您正在gethostbyname模块中调用socket。它对你的SOCKS套接字一无所知;它只是与您的操作系统的名称解析机制进行交互。设置socket.socket = socks.socksocket可能会影响通过socket模块建立的网络连接,但模块不会直接连接到DNS服务器以执行名称解析,因此替换socket.socket对此行为没有影响。< / p>

如果您只是使用主机名调用connect(...)对象上的socks.socksocket方法,代理将通过SOCKS执行名称解析:

s = socks.socksocket()
s.connect(('www.yahoo.com', 80))

如果您确实想要通过SOCKS连接执行原始DNS查询,则需要找到可以提供socksocket对象的Python DNS模块。

答案 1 :(得分:0)

如果您使用Socks5自行解决DNS,则可能会泄露有关您自己计算机的信息。而是尝试使用Proxifier进行隧道传输,然后尝试使用Tor。或者,您可以使用SocksiPy的Socks4A扩展。这将确保信息不会泄露。