python - Python:stem.controller Tor 控制端口,用于配置 Tor 电路以进行流隔离
问题描述
这是关于通过套接字连接和控制 Tor 的 whonix 文档
我之前曾尝试使用 python 请求库向Tor 的官方链接发出 GET 请求,以检查whonix 工作站 VM 内的退出节点 IP 信息(在此处阅读有关 whonix 的信息)。该请求始终显示相同的 IP 信息,与我运行脚本、关闭它、再次运行它无关。在第一个链接中,作者描述了已经支持的应用程序。如果未列出,用户必须提供支持。
我试图在我自己的脚本中提供支持,方法是使用第一个套接字与特定的套接字通信,然后是 stem 库。套接字本身没有任何作用,现在 stem 库在运行时给我错误。
from stem import Signal
from stem.control import Controller
with Controller.from_port(port=9051) as controller:
controller.signal(Signal.NEWNYM)
controller.close()
此代码给出以下运行时错误:
Traceback (most recent call last):
File "/path/to/stem/connection.py", line 1018, in get_protocolinfo
protocolinfo_response = _msg(controller, 'PROTOCOLINFO 1')
File "/path/to/stem/connection.py", line 1036, in _msg
return controller.msg(message)
File "/path/to/stem/control.py", line 658, in msg
raise response
File "/path/to/stem/control.py", line 937, in _reader_loop
control_message = self._socket.recv()
File "/path/to/stem/socket.py", line 464, in recv
return self._recv(lambda s, sf: recv_message(sf))
File "/path/to/stem/socket.py", line 278, in _recv
return handler(my_socket, my_socket_file)
File "/path/to/stem/socket.py", line 464, in <lambda>
return self._recv(lambda s, sf: recv_message(sf))
File "/path/to/stem/socket.py", line 693, in recv_message
raise stem.SocketClosed('Received empty socket content.')
stem.SocketClosed: Received empty socket content.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/path/to/stem/connection.py", line 530, in authenticate
protocolinfo_response = get_protocolinfo(controller)
File "/path/to/stem/connection.py", line 1020, in get_protocolinfo
raise stem.SocketError(exc)
stem.SocketError: Received empty socket content.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "my_program.py", line 103, in <module>
controller.authenticate()
File "/path/to/stem/control.py", line 1100, in authenticate
stem.connection.authenticate(self, *args, **kwargs)
File "/path/to/stem/connection.py", line 534, in authenticate
raise AuthenticationFailure('socket connection failed (%s)' % exc)
stem.connection.AuthenticationFailure: socket connection failed (Received empty socket content.)
如何解决?有没有更好的解决方案来提供我尚未考虑的支持?
解决方案
无需使用阀杆或连接到控制端口即可为您的电路启用流隔离。流隔离由提供给 Tor 的 SOCKS 代理的凭据决定。
如果您使用的是 Python requests
,请参阅此答案。
要使用相同的 IP 进行连接,请在连接到 SOCKS 代理时使用相同的凭据。如果您想更改 IP(使用不同的电路),那么您只需要使用一组不同的凭据。
在下面的示例中,每个请求会话使用不同的电路并且应该具有不同的退出 IP 地址。
session1 = requests.session()
session1.proxies = {'http': 'socks5h://foo1:bar1@localhost:9050', 'https': 'socks5h://foo1:bar1@localhost:9050'}
r = session1.get('https://httpbin.org/ip')
session2 = requests.session()
session2.proxies = {'http': 'socks5h://foo2:bar2@localhost:9050', 'https': 'socks5h://foo2:bar2@localhost:9050'}
r = session2.get('https://httpbin.org/ip')
请记住,出口的数量是有限的,因此如果您快速创建许多流,最终您将构建使用与先前电路相同的出口 IP 的电路。
推荐阅读
- r - 如何在 R 中使用 for 基于更改条件创建组?
- typescript - 在 Jest + TS 中模拟多个导出
- c# - Visual Studio 2019 无法使用 GPU 使用率
- css - 延迟加载字体
- apache-flink - Flink Stateful Functions URL Path Template 支持哪些模板参数?
- casting - Unsigned char* 和 reinterpret_cast 问题
- azure - MSAL(桌面和移动)未使用正确的 redirect_uri
- django - Django/Docker:未检测到迁移且未应用
- mysql - AddWithValue MySqlType.Decimal
- django - 调试为假时,django 信号 post_save 不起作用