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:

  1. Eine Begrüßung der Version 5 senden, die die unterstützten Authentifizierungsmethoden auflistet.
  2. Die gewählte Methode lesen und ihren Authentifizierungsaustausch ausführen, wenn er verlangt wird.
  3. CONNECT mit Adresstyp, Adresse und Port des Ziels in Netzwerk-Byte-Reihenfolge senden.
  4. Die Antwort lesen, ihre Version und den Ergebniscode prüfen und die vollständige gebundene Adresse variabler Länge samt Port aufnehmen.
  5. 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.

Ähnliche Artikel