使用Python

时间:2016-08-18 10:46:10

标签: python sockets networking udp tor

所以我有一个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))

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

1 个答案:

答案 0 :(得分:0)

正如@gwyn所指出的,Tor仅支持TCP流as specified on their website。在Tor上使用UDP无效,只有TCP连接无效。