Asio braucht einen SOCKS5-Austausch, nachdem die Verbindung zum Proxy steht
SOCKS5 als Protokoll-Zustandsmaschine über dem Asio-Socket: vollständige Lesevorgänge, geprüfte Antworten und TLS zum Ziel erst nach erfolgreichem CONNECT.
Eine Asio-TCP-Socket mit einem SOCKS5-Listener zu verbinden, schließt einen Schritt ab: die TCP-Verbindung zu diesem Listener. Damit wird der Proxy nicht aufgefordert, eine Verbindung zum endgültigen Server aufzubauen. Für einen zulässigen Test gegen ein öffentliches Ziel bietet die SOCKS5-Proxy-Liste Kandidaten für diesen ersten TCP-Endpunkt; der Connector muss den Austausch unten trotzdem durchführen.
Ein SOCKS5-Connector muss anschließend den Protokollaustausch ausführen:
- Eine Begrüßung der Version 5 senden, die die unterstützten Authentifizierungsmethoden auflistet.
- Die gewählte Methode lesen und ihren Authentifizierungsaustausch ausführen, wenn er verlangt wird.
- CONNECT mit Adresstyp, Adresse und Port des Ziels in Netzwerk-Byte-Reihenfolge senden.
- Die Antwort lesen, ihre Version und den Ergebniscode prüfen und die vollständige gebundene Adresse variabler Länge samt Port aufnehmen.
- Den aufgebauten Strom an das Protokoll der Anwendung übergeben.
Ein Helfer namens socks5::async_proxy_connect gehört zur SOCKS-Implementierung, die diesen Helfer bereitstellt. Ihn neben boost::asio zu nennen, macht ihn nicht zu einem Teil der TCP-Socket-Schnittstelle von Asio.
TCP-Lesevorgänge können nur einen Teil einer Antwort liefern. Setzen Sie Lesevorgänge für die erforderlichen Byteanzahlen zusammen und wählen Sie die Restlänge dann aus dem Adresstyp-Feld. Nehmen Sie nicht an, dass jede Serverantwort das feste IPv4-Layout hat.
Für HTTPS führen Sie den TLS-Handshake zum Ziel erst nach erfolgreichem SOCKS CONNECT aus und bewahren dabei SNI und Hostnamenprüfung des Ziels. Eine erfolgreiche Proxy-Antwort allein authentifiziert die Website nicht.
Halten Sie Abbruch und Fristen über die gesamte Einrichtungssequenz hinweg ein. Läuft die Zeit für den TCP-Verbindungsaufbau ab, bleiben die späteren Begrüßungs-, Authentifizierungs- und CONNECT-Austausche sonst unbegrenzt.