使用 Python 通过 Tor (SOCKS5) 发送 UDP 请求
Sending UDP requests through Tor (SOCKS5) with Python
所以我有一个 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 连接也不起作用,我宁愿保持无连接状态,因为这使我的预期用途更简单,因为端口不一定 active/open 在任何给定时间。下面可以看到我用来尝试发送数据包的脚本。我添加了但注释掉了我正在使用的无连接和连接方法。忽略顶部所有额外的导入,这些是稍后在脚本开发中使用的。
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 数据包?
更新
我最初安装的是 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/
等网站的响应 return 与我的实际 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。在 Tor 上使用 UDP 将不起作用,只能使用 TCP 连接。
所以我有一个 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 连接也不起作用,我宁愿保持无连接状态,因为这使我的预期用途更简单,因为端口不一定 active/open 在任何给定时间。下面可以看到我用来尝试发送数据包的脚本。我添加了但注释掉了我正在使用的无连接和连接方法。忽略顶部所有额外的导入,这些是稍后在脚本开发中使用的。
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 数据包?
更新
我最初安装的是 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/
等网站的响应 return 与我的实际 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。在 Tor 上使用 UDP 将不起作用,只能使用 TCP 连接。