Ein SOCKS-fähiger Connector für Python-TCP-Sockets
Wählen Sie einen proxyfähigen Socket-Connector und halten Sie seinen Geltungsbereich getrennt von Pythons prozessweiter Socket-Implementierung.
Ein roher Python-Socket verhandelt keinen Proxy, nur weil http_proxy existiert. Für eine Anwendung mit eigenem TCP-Protokoll verwenden Sie einen Connector, der den Dienst am Proxy-Endpunkt versteht.
Wenn PySocks bereits verfügbar ist, stellen Sie die Verbindung explizit her:
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.
Ersetzen Sie die Dokumentationsadresse und den Zielport. Für ein zulässiges öffentliches Ziel wählen Sie einen Kandidaten aus der SOCKS5-Proxy-Liste erst, nachdem Sie geprüft haben, ob er den Zielport der Anwendung zulässt. Prüfen Sie das installierte Paket, die unterstützten Methoden und die Endpunktanforderungen anhand der PySocks-Schnittstelle.
Der Rest der Anwendung tauscht sein Protokoll über diese hergestellte Verbindung aus. Wenn dieses Protokoll TLS verwendet, starten Sie es nach der Proxy-Aushandlung und prüfen Sie den echten Zielhostnamen. Die Proxy-Authentifizierung stellt die Route her; sie liefert nicht die Anmeldung am Ziel oder die Verschlüsselung.
Ein SOCKS-Listener benötigt eine SOCKS-Aushandlung. Ein HTTP-Dienst benötigt einen CONNECT-fähigen Connector für ein beliebiges TCP-Ziel und kann seinen Port verweigern. Wählen Sie den Connector nach dem tatsächlich angebotenen Dienst, statt eine Adresse zu ändern und den falschen Handshake zu belassen.
Halten Sie den Ersatz lokal. Das Zuweisen einer Klasse zu socket.socket kann unabhängige Importe und Bibliotheken beeinflussen. Wenn eine andere Bibliothek die Socket-Erstellung besitzt, verwenden Sie deren dokumentierte Verbindungsfabrik oder Proxy-Option; ein Wörterbuch, das sie nie liest, kann diese Verbindung nicht ändern.