Eine SOCKS5-Anfrage in einen HTTP-Tunnel übersetzen
Schließen Sie den CONNECT-Austausch mit dem Parent ab, senden Sie dem Client eine SOCKS-Antwort und leiten Sie erst danach Anwendungsbytes weiter.
Ein SOCKS5-Frontend kann einen HTTP-Proxy als weiterführenden Transport nutzen. Es tritt gegenüber dem Client als SOCKS-Server und gegenüber dem Parent als HTTP-CONNECT-Client auf. Beide Kontroll-Austausche enden, bevor der Anwendungsstrom beginnt.
Die SOCKS-CONNECT-Anfrage liefert bereits Zielhost bzw. -adresse und Port. Für einen beispielhaften HTTP/1.1-Austausch mit dem Parent:
client → adapter: SOCKS5 CONNECT service.example.net:443
adapter → parent:
CONNECT service.example.net:443 HTTP/1.1
Host: service.example.net:443
parent → adapter: HTTP/1.1 200 Connection Established
[end of headers]
adapter → client: SOCKS5 success reply
client ↔ adapter ↔ parent ↔ service: application bytes
Das Ergebnis an der Grenze übersetzen
Der Adapter erledigt jede erforderliche Authentifizierung beim Parent und wartet auf das CONNECT-Ergebnis. Eine erfolgreiche 2xx-Antwort errichtet den Parent-Tunnel. Erst dann sollte er die entsprechende SOCKS-Erfolgsantwort an den nachgelagerten Client zurücksenden.
Lehnt der Parent den Vorgang ab, senden Sie eine definierte SOCKS-Fehlerantwort und beenden Sie danach die Client-Verbindung umgehend. SOCKS5 verlangt diesen Abschluss innerhalb von zehn Sekunden nach Erkennen des Fehlers. Behalten Sie den HTTP-Status des Parents als Diagnoseinformation für den Adapter. Würde man diese Statuszeile als Anwendungsdaten weiterleiten, gelangte eine HTTP-Kontrollnachricht in einen Strom, dessen Client SOCKS-Rahmung erwartet.
Vor einem erfolgreichen CONNECT-Ergebnis spricht der Parent noch HTTP, einschließlich der Rahmung jeder Challenge- oder Fehlerantwort. Nach dem Header-Trennzeichen eines erfolgreichen Ergebnisses wird die Verbindung zum Tunnel; es gibt keinen HTTP-Antwortkörper, der zuerst verbraucht werden müsste.
Die Bytes nach den Headern bewahren
Ein Lesevorgang kann das Ende der Parent-Header und Bytes vom Ziel gemeinsam enthalten. Bewahren Sie diese zusätzlichen Bytes für die nachgelagerte Anwendung. Server-First-Protokolle können sofort nach dem Öffnen ihrer Verbindung grüßen.
Nachdem die SOCKS-Erfolgsantwort gesendet wurde, leiten Sie den Anwendungsstrom in beide Richtungen weiter. Der Adapter muss nicht eine Client-Nachricht mit einer Server-Nachricht abwechseln und muss TLS-Records nicht verstehen, um sie weiterzuleiten. Seine Protokollarbeit war das Herstellen und Übersetzen der beiden Tunnelaushandlungen.