Das SOCKS-Protokoll ist ein Internet-Protokoll, das Client-Server-Anwendungen erlaubt, protokollunabhängig und transparent die Dienste eines Proxyservers zu nutzen. SOCKS ist eine Abkürzung für „SOCKetS“.
Clients hinter einer Firewall, die eine Verbindung zu einem externen Server aufbauen wollen, verbinden sich stattdessen zu einem SOCKS-Proxy. Dieser Proxyserver überprüft die Berechtigung des Clients, den externen Server zu kontaktieren, und leitet die Anfrage an den Server weiter.
Das SOCKS-Protokoll wurde ursprünglich von NEC entwickelt (SOCKS-4). Die aktuelle Version 5 des Protokolls, wie beschrieben in RFC 1928, erweitert die vorherigen Versionen um Unterstützung für UDP, Authentifizierung, Namensauflösung am SOCKS-Server und IPv6.
Im TCP/IP-Modell ist es eine Zwischenschicht zwischen der Anwendungsschicht und der Transportschicht.
Das SOCKS-4-Protokoll
Anfrage Eine typische SOCKS-4 Verbindung baut sich, via TCP, wie folgt auf: Der Client verbindet sich zum Server und sendet solch ein Paket: Länge Beschreibung 1 Byte Version (für SOCKS4: 0x04) 1 Byte Befehl: 0x01 = neue TCP/IP-Verbindung 0x02 = bindet einen Port 2 Bytes Portnummer 4 Bytes IPv4-Adresse unbestimmt User-ID (optional; wenn keine Authentifizierung notwendig, diesen Abschnitt überspringen) 1 Byte Abschluss mit Null-Byte (0x00)
Antwort Länge Beschreibung 1 Byte Null-Byte (0x00) 1 Byte Antwortcode: 0x5A = Anfrage bewilligt 0x5B = Anfrage abgelehnt oder fehlgeschlagen 0x5C = Anfrage fehlgeschlagen, da der Client nicht identd ausführt (oder nicht vom Server erreichbar ist) 0x5D = Anfrage fehlgeschlagen, da identd die ID nicht bestätigen konnte 2 Byte Beliebige Daten. 4 Byte Beliebige Daten.
Beispiel Fred möchte sich via SOCKS4 zu der IP 66.102.7.99 auf Port 80 verbinden. Dafür verbindet er sich via TCP zu dem SOCKS4-Proxy seiner Wahl und sendet folgende Anfrage: Version Kommando Portnummer Adresse User-ID Abschluss 0x04 0x01 0x00 0x50 0x42 0x66 0x07 0x63 0x46 0x72 0x65 0x64 0x00
Bei der User-ID ist "Fred" als Zeichenfolge in ASCII formatiert.
Darauf antwortet der Server mit "OK": Null-Byte Antwortcode Beliebige Daten Beliebige Daten 0x00 0x5A 0xXX 0xXX
0xXX ist hier ein Platzhalter für je ein beliebiges Byte.
Von da an werden alle Daten, die der Client (Fred) an den SOCKS-Proxy schickt, an 66.102.7.99 weitergeleitet und umgekehrt.
Das SOCKS-5-Protokoll SOCKS-5 unterscheidet sich von SOCKS-4 vor allem durch bessere Authentifizierung, UDP und IPv6-Unterstützung.
Der Aufbau funktioniert nun so:
Der Client verbindet sich zum Server und begrüßt ihn mit Authentifizierungsmethoden, die er selbst unterstützt. Der Server antwortet mit einer von den vom Client gesendeten Methoden. Abhängig von der Methode kann eine Reihe von Paketen versendet werden. Der Client sendet eine Verbindungsanfrage ähnlich wie bei SOCKS-4 Der Server antwortet ähnlich wie bei SOCKS-4
+ Authentifizierungsmethoden Byte Name Erklärung 0x00 NO AUTHENTICATION REQUIRED Keine Authentifizierung benötigt 0x01 GSSAPI GSSAPI, siehe RFC 2743. Genutzt u. a. von Kerberos. 0x02 USERNAME/PASSWORD Authentifizierung mit Benutzername und Passwort, siehe RFC 1929 0x03 bis 0x7F IANA ASSIGNED Werden von der IANA vergeben 0x80 bis 0xFE RESERVED FOR PRIVATE METHODS Für nicht öffentliche Methoden reserviert 0xFF NO ACCEPTABLE METHODS Keine akzeptable Methode
Der Client sendet als erstes seine Authentifizierungsmethoden:
Länge Beschreibung 1 Byte Version (für SOCKS-5: 0x05) 1 Byte Anzahl der unterstützten Authentifizierungsmethoden Bytes Byte-Werte der unter 'Authentifizierungsmethoden' genannten Methoden, ein Byte pro Methode
Der Server gibt die Auswahl der Methode bekannt
Länge Beschreibung 1 Byte Version (0x05) 1 Byte Byte-Wert der Authentifizierungsmethode; 0xFF, wenn keine akzeptable Methode gefunden.
Die Verbindungsanfrage
So sieht die Verbindungsanfrage bei SOCKS-5 aus:
Länge Beschreibung 1 Byte Version (für SOCKS-5: 0x05) 1 Byte Befehl: 0x01: Eine TCP-Verbindung aufbauen 0x02: Eine TCP-Verbindung entgegennehmen, d. h. einen Server öffnen. 0x03: Eine UDP-Weiterleitung einrichten 1 Byte Reserviert: Muss 0x00 sein 1 Byte Adress-Typ (Typ der Zieladresse): 0x01: IPv4-Adresse 0x03: Domainname 0x04: IPv6-Adresse Abhängig vom gewählten Adress-Typ: IPv4: 4 Bytes Domainname: 1 Byte (Länge der Domain) + Domain IPv6: 16 Bytes 2 Byte Port in Byte-Reihenfolge Big-Endian
Die Serverantwort sieht so aus:
Länge Beschreibung 1 Byte Version (0x05) 1 Byte Antwortcode (siehe Tabelle Antwortcodes) 1 Byte Reserviert: Muss 0x00 sein 1 Byte Address-Typ: 0x01: IPv4-Adresse 0x03: Domainname 0x04: IPv6-Adresse Abhängig vom Adress-Typ: IPv4: 4 Bytes Domainname: 1 Byte (Länge der Domain) + Domain IPv6: 16 Bytes 2 Byte Port in Byte-Reihenfolge Big-Endian
+ Antwortcodes Byte Name Erklärung 0x00 succeeded Verbindung erfolgreich hergestellt 0x01 general SOCKS server failure Serverfehler 0x02 connection not allowed by ruleset Verbindung wegen der Serverkonfiguration nicht erlaubt. 0x03 Network unreachable Das Zielnetzwerk ist nicht erreichbar 0x04 Host unreachable Der Zielhost ist nicht erreichbar 0x05 Connection refused Verbindung abgelehnt 0x06 TTL expired Zielrechner zu weit entfernt 0x07 Command not supported Kommando der Anfrage wird nicht unterstützt 0x08 Address type not supported ATYP der Anfrage wird nicht unterstützt 0x09 bis 0xFF Nicht vergeben
SOCKS-Server Liste von SOCKS-Servern: Delegate universaler Proxy-Server, unter anderem Socks-Server, Open Source mitmproxy universaler Proxy-Server, unter anderem Socks-Server, Open Source Dante Socks-Server Java Socks-Server, Open Source Socks4-Server mocks CuteSocks SSH als Socks-Server
SOCKS-Clients/SOCKS-Wrapper Es existieren Programme, die es anderen Programmen ermöglichen, externe Netzwerke über SOCKS zu erreichen, ohne dass sie spezielle Unterstützung dafür mitbringen müssen:
Liste von SOCKS-Clients: Dante client FreeCap WideCap Open Text SOCKS Client (Nachfolger von „Hummingbird SOCKS“) ProxyCap SocksCap (Google Link) tsocks socat redsocks proxychains proxifier tun2socks
Spezifikationen
Einzelnachweise
Kategorie:IT-Architektur Kategorie:Internet-Anwendungsprotokoll Kategorie:Abkürzung