使用Python通过Tor(SOCKS5)发送UDP请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python通过Tor(SOCKS5)发送UDP请求相关的知识,希望对你有一定的参考价值。

所以我有一个python脚本需要将数据包发送到我的服务器'x.x.x.x'。通过设置SOCKS5代理,我已经能够通过Python成功初始化Tor,但在尝试将数据包发送到我的服务器时,我得到错误:

Traceback (most recent call last):
File "test.py", line 18, in <module>
sock.sendto(bytes, ("x.x.x.x", 6000))
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 338, in sendto
self.bind(("", 0))
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 325, in bind
_, relay = self._SOCKS5_request(self._proxyconn, UDP_ASSOCIATE, dst)
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 494, in _SOCKS5_request
raise SOCKS5Error("{0:#04x}: {1}".format(status, error))
socks.SOCKS5Error: 0x07: Command not supported, or protocol error

从我所看到的,socket / SOCKS5不支持无连接UDP,因此我尝试连接到端口,然后在连接后发送数据包。我仍然得到与上面相同的错误,输出可以在下面看到。

Traceback (most recent call last):
File "test.py", line 18, in <module>
sock.connect(("x.x.x.x", 6000))
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 698, in connect
self.bind(("", 0))
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 325, in bind
_, relay = self._SOCKS5_request(self._proxyconn, UDP_ASSOCIATE, dst)
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 494, in _SOCKS5_request
raise SOCKS5Error("{0:#04x}: {1}".format(status, error))
socks.SOCKS5Error: 0x07: Command not supported, or protocol error

看到UDP连接也不起作用,我宁愿保持无连接,因为这使得我的预期用途更简单,因为端口在任何给定时间都不一定是活动/打开的。我用来尝试发送数据包的脚本如下所示。我添加了但是注释了我正在使用的无连接和连接方法。忽略顶部的所有额外导入,这些将在稍后的脚本开发中使用。

import socks
import socket
import requests
from TorCtl import TorCtl
import urllib2
import random
import math
import time

socks.setdefaultproxy(proxy_type=socks.PROXY_TYPE_SOCKS5, addr="127.0.0.1", port=9050)

socket.socket = socks.socksocket

print requests.get("http://icanhazip.com").text

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
bytes=random._urandom(1024)

# UDP CONNECTION METHOD
#sock.connect(("x.x.x.x", 6000))
#sock.send(bytes)

# UDP CONNECTIONLESS METHOD
#sock.sendto(bytes, ("x.x.x.x", 6000))

这让我想到了我的问题 - 有没有办法通过无连接方法通过python中的SOCKS5代理发送UDP数据包?

UPDATE

我最初安装了SocksiPy而不是PySocks,所以我已经更换了模块并删除了原始脚本中的monkeypatch。但现在,我反而得到'Broken Pipe'错误,如下所示。

Traceback (most recent call last):
File "test.py", line 19, in <module>
s.sendto(bytes, ("x.x.x.x", 6000))
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 336, in sendto
return _BaseSocket.sendto(self, bytes, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/socks.py", line 223, in <lambda>
return lambda self, *pos, **kw: self._savedmethods[name](*pos, **kw)
socket.error: [Errno 32] Broken pipe

我已经仔细检查以确保Tor实际工作且代理已启动,因为我可以通过Tor代理接收HTTP请求和响应 - 对http://icanhazip.com/这样的网站的响应返回与我的实际IP不同的IP,表明Tor确实在运作。我还认为删除monkeypatch可能会使它更好地兼容,看到OLD脚本上的新PySocks模块,它仍然失败,上面看到的原始错误。

新脚本:

import socks
import socket
import random
import math

s = socks.socksocket()
s.set_proxy(socks.SOCKS5, "localhost", 9050)

bytes=random._urandom(1024)

# UDP CONNECTION METHOD
#sock.connect(("x.x.x.x", 6000))
#sock.send(bytes)

# UDP CONNECTIONLESS METHOD
#s.sendto(bytes, ("x.x.x.x", 6000))

我上面描述的错误是使用无连接方法 - 使用连接方法似乎可能有效,但是当连接到端口时它会挂起(这是预期的,因为端口未打开)。

答案

正如@gwyn指出的那样,Tor只支持TCP流,as specified on their website。使用UDP over Tor将无法正常工作,只能使用TCP连接。

以上是关于使用Python通过Tor(SOCKS5)发送UDP请求的主要内容,如果未能解决你的问题,请参考以下文章

python Python请求+ Tor(Socks5)

通过 SOCKS5 c++ 发送和接收

如何在python的请求中禁用代理socks5?

tor 不能使用 sqlmap

推送:啥是socks5代理ip

如何在Android SDK Manager上使用tor