【问题标题】:Sending UDP requests through Tor (SOCKS5) with Python使用 Python 通过 Tor (SOCKS5) 发送 UDP 请求
【发布时间】:2016-08-18 10:46:09
【问题描述】:

所以我有一个 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 数据包?

更新

我最初安装了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))

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

【问题讨论】:

  • 看起来你拥有的 socks 模块不支持通过 SOCKS 进行 UDP 端口绑定,但它有一个分支 here 支持,尽管它没有提供任何很好的示例。但我检查了代码,它确实支持 SOCKS 命令来绑定原始不支持的 UDP 端口。
  • 我原本以为我有 PySocks,但结果我确实有原始的 SocksiPy 模块。我已经删除了 SocksiPy 并用 PySocks 替换它——而不是“不支持命令”错误,我现在收到“断管”错误。查看日志等主要问题中的更新。
  • 据我所知,“Tor only works for TCP streams”,不是 UDP。

标签: python sockets networking udp tor


【解决方案1】:

正如@gwyn 所指出的,Tor 仅支持 TCP 流,as specified on their website。在 Tor 上使用 UDP 将不起作用,只能使用 TCP 连接。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多