1

对于某些需要,我想要一个 python 应用程序连接到一个 tor 代理,但我想使用静态 IP 而不是 DNS。确实当我

我无法实现它。当我想连接到数据库时,请求总是超时。

这是我的 docker-compose 文件:

version: "3.9"
services:
  test:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.18.18.9

  app:
    build: ./python
    depends_on:
      - tor

  tor:
    build:
      context: ./tor
    container_name: tor
    environment:
      - TOR_INSTANCES=1
      - TOR_HASHED_PASSWORD=16:D87F66F5B5E2A6BC605544DBB4720DAD433C1E8CE7D18F835D58A4353E
      - TOR_PROXIES_CONTROLLER_AUTH_PASSWORD=testtor
      - TOR_CONTROLLER_HOST=172.18.18.10
    ports:
      - "9050-9060:9050-9060"
      - "10000-10050:10000-10050"
    networks:
      app_net:
        ipv4_address: 172.18.18.10

networks:
  app_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.18.18.0/24
          gateway: 172.18.18.1

我的python代码很简单,这就是我想要做的:

  • 从请求中获取 IP(没有代理)
  • 相同但有代理
  • 续订代理
  • 再次执行请求

第一个请求顺利通过,但随后代理超时。显然,我也无法更新 IP,因为 ip 所以没有解决。

^[[Dapp_1   | After request ::  https://ifconfig.io/ip 200 82.123.30.131
app_1   | 
app_1   | SOCKSHTTPSConnectionPool(host='ifconfig.io', port=443): Max retries exceeded with url: /ip (Caused by NewConnectionError('<urllib3.contrib.socks.SOCKSHTTPSConnection object at 0xffffbcb16940>: Failed to establish a new connection: [Errno -2] Name or service not known'))
app_1   | Traceback (most recent call last):
app_1   |   File "/usr/local/lib/python3.8/site-packages/stem/socket.py", line 535, in _make_socket
app_1   |     control_socket.connect((self.address, self.port))
app_1   | TimeoutError: [Errno 110] Connection timed out

但是,如果我只执行 tor docker-container,并将 tor 代理替换为“localhost”,它就可以正常工作:

    def add_proxies(self):
        self.http.proxies['http'] = 'socks5://localhost:9051'
        self.http.proxies['https'] = 'socks5://localhost:9051'

    def renew_proxy_ip(self):
        with Controller.from_port(port=10001) as controller:
            controller.authenticate(password="testtor")
            print("Authentication :: ", controller.is_authenticated())
            controller.signal(Signal.NEWNYM)

预期输出

After request ::  https://ifconfig.io/ip 200 2a01:cb04:be0:b300:d44d:f8d3:6328:b2f1

After request ::  https://ifconfig.io/ip 200 2a00:1768:6001:28:2236::1

Authentication ::  True
After request ::  https://ifconfig.io/ip 200 2a03:4000:37:645::

我添加了一个 ifconfig busybox 来查看 ip 是否正确映射,是这样的:

test_1  | eth0      Link encap:Ethernet  HWaddr 02:42:AC:12:12:09  
test_1  |           inet addr:172.18.18.9  Bcast:172.18.18.255  Mask:255.255.255.0
test_1  |           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
test_1  |           RX packets:2 errors:0 dropped:0 overruns:0 frame:0
test_1  |           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
test_1  |           collisions:0 txqueuelen:0 
test_1  |           RX bytes:200 (200.0 B)  TX bytes:0 (0.0 B)
test_1  | 
test_1  | lo        Link encap:Local Loopback  
test_1  |           inet addr:127.0.0.1  Mask:255.0.0.0
test_1  |           UP LOOPBACK RUNNING  MTU:65536  Metric:1
test_1  |           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
test_1  |           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
test_1  |           collisions:0 txqueuelen:1000 
test_1  |           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

我创建了一个仓库,您可以在其中重现该问题:https ://github.com/thibault-lr/docker-static-ip只需使用docker-compose up

我有点不得不继续这样做,控制器身份验证需要一个 IP 才能连接。我已经坚持了一段时间,我想知道是否有人已经遇到过这个问题?我在 macos 上并在 linux 服务器上尝试过,它保持不变

如果这是不可能的,我还没有探索其他解决方案:

  • 使用 telnet 通过 DNS 连接到 Tor 网络
  • 使用套接字文件进行身份验证

非常感谢提前!TL

4

0 回答 0