簡體   English   中英

使用Python通過Tor(SOCKS5)發送UDP請求

[英]Sending UDP requests through Tor (SOCKS5) with Python

因此,我有一個python腳本,需要將數據包發送到服務器“ xxxx”。 通過設置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 ,所以我把它換成模塊並刪除原劇本的猴補丁。 但是現在,我得到的是“斷管”錯誤,如下所示。

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流。 在Tor上使用UDP無效,僅TCP連接有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM