From 8c8a039ba222fcd458d277d9ca50c1d05e40ccb7 Mon Sep 17 00:00:00 2001 From: Jonathan Zernik Date: Wed, 8 Sep 2021 12:13:12 -0700 Subject: [PATCH] Use socks5 proxy for outbound connection when available (#1226) * Use socks5 proxy for outbound connection when available * Remove log lines in peer client for tox proxy --- requirements.txt | 1 + setup.py | 1 + squeaknode/config/config.py | 4 ++++ squeaknode/network/network_manager.py | 4 ++++ squeaknode/network/peer_client.py | 15 +++++++++++++-- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1a3a9c2f..493183f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ importlib_resources==1.4.0 mypy-protobuf protobuf psycopg2 +PySocks pyzmq requests SQLAlchemy diff --git a/setup.py b/setup.py index e3b84eeb..978ae763 100644 --- a/setup.py +++ b/setup.py @@ -119,6 +119,7 @@ setup( 'Flask-WTF', 'flask-cors', 'alembic', + 'PySocks', ], extras_require={"test": ["pytest", "coverage"]}, entry_points={ diff --git a/squeaknode/config/config.py b/squeaknode/config/config.py index 5dc777bf..5f27a832 100644 --- a/squeaknode/config/config.py +++ b/squeaknode/config/config.py @@ -142,6 +142,10 @@ class NodeConfig(Config): cast=int, required=False, default=DEFAULT_OFFER_DELETION_INTERVAL_S) interest_block_interval = key( cast=int, required=False, default=DEFAULT_INTEREST_BLOCK_INTERVAL) + tor_proxy_ip = key( + cast=str, required=False, default="") + tor_proxy_port = key( + cast=int, required=False, default=0) @section('db') diff --git a/squeaknode/network/network_manager.py b/squeaknode/network/network_manager.py index e0ebc26b..8d938f77 100644 --- a/squeaknode/network/network_manager.py +++ b/squeaknode/network/network_manager.py @@ -54,6 +54,8 @@ class NetworkManager(object): self.local_port = self.config.server.rpc_port or squeak.params.params.DEFAULT_PORT self.peer_server = None self.peer_client = None + self.tor_proxy_ip = self.config.node.tor_proxy_ip + self.tor_proxy_port = self.config.node.tor_proxy_port self.connection_manager = ConnectionManager() def start(self, squeak_controller): @@ -67,6 +69,8 @@ class NetworkManager(object): ) self.peer_client = PeerClient( peer_handler, + self.tor_proxy_ip, + self.tor_proxy_port, ) self.peer_server.start() diff --git a/squeaknode/network/peer_client.py b/squeaknode/network/peer_client.py index 1ea11b38..e49698a2 100644 --- a/squeaknode/network/peer_client.py +++ b/squeaknode/network/peer_client.py @@ -23,6 +23,8 @@ import logging import socket import threading +import socks + from squeaknode.core.peer_address import PeerAddress @@ -36,13 +38,15 @@ class PeerClient(object): """Creates outgoing connections to other peers in the network. """ - def __init__(self, peer_handler): + def __init__(self, peer_handler, tor_proxy_ip, tor_proxy_port): self.peer_handler = peer_handler + self.tor_proxy_ip = tor_proxy_ip + self.tor_proxy_port = tor_proxy_port def make_connection(self, address: PeerAddress): logger.info('Making connection to {}'.format(address)) try: - peer_socket = socket.socket() + peer_socket = self.get_socket() logger.info('Trying to connect socket to {}'.format(address)) peer_socket.settimeout(SOCKET_CONNECT_TIMEOUT) peer_socket.connect(address) @@ -60,3 +64,10 @@ class PeerClient(object): args=(address,), name="peer_client_connection_thread", ).start() + + def get_socket(self): + if self.tor_proxy_ip: + s = socks.socksocket() # Same API as socket.socket in the standard lib + s.set_proxy(socks.SOCKS5, self.tor_proxy_ip, self.tor_proxy_port) + return s + return socket.socket()