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
This commit is contained in:
Jonathan Zernik 2021-09-08 12:13:12 -07:00 committed by GitHub
parent 29e8720532
commit 8c8a039ba2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 23 additions and 2 deletions

View file

@ -12,6 +12,7 @@ importlib_resources==1.4.0
mypy-protobuf
protobuf
psycopg2
PySocks
pyzmq
requests
SQLAlchemy

View file

@ -119,6 +119,7 @@ setup(
'Flask-WTF',
'flask-cors',
'alembic',
'PySocks',
],
extras_require={"test": ["pytest", "coverage"]},
entry_points={

View file

@ -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')

View file

@ -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()

View file

@ -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()