Un connettore consapevole di SOCKS per socket TCP Python
Scegli un connettore di socket che comprenda il proxy e mantieni il suo ambito separato dall'implementazione dei socket a livello di processo di Python.
Un socket Python grezzo non negozia un proxy solo perché esiste http_proxy. Per un'applicazione che parla il proprio protocollo TCP, usa un connettore che comprenda il servizio all'endpoint del proxy.
Con PySocks già disponibile, crea la connessione esplicitamente:
import socks
with socks.socksocket() as connection:
connection.set_proxy(socks.SOCKS5, '203.0.113.10', 1080)
connection.settimeout(10)
connection.connect(('example.com', 12345))
# Exchange the destination protocol here.
Sostituisci l'indirizzo di documentazione e la porta di destinazione. Per una destinazione pubblica consentita, seleziona un candidato dalla lista di proxy SOCKS5 solo dopo aver verificato che consenta la porta di destinazione dell'applicazione. Controlla il pacchetto installato, i metodi supportati e i requisiti dell'endpoint rispetto all'interfaccia PySocks.
Il resto dell'applicazione scambia il suo protocollo su questa connessione stabilita. Se quel protocollo usa TLS, avvialo dopo la negoziazione del proxy e verifica il nome host reale della destinazione. L'autenticazione del proxy stabilisce il percorso; non fornisce l'accesso alla destinazione né la cifratura.
Un listener SOCKS ha bisogno della negoziazione SOCKS. Un servizio HTTP ha bisogno di un connettore compatibile CONNECT per una destinazione TCP arbitraria e può negare la sua porta. Scegli il connettore in base al servizio effettivamente offerto, invece di cambiare un indirizzo lasciando la stretta di mano sbagliata.
Mantieni la sostituzione locale. Assegnare una classe a socket.socket può influire su importazioni e librerie non correlate. Se un'altra libreria possiede la creazione dei socket, usa la sua factory di connessioni o opzione proxy documentata; un dizionario che non legge mai non può cambiare quella connessione.