SOCKS

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, auf wie folgt: Der Client verbindet sich zum Server und sendet solch ein Paket:

LängeBeschreibung
1 ByteVersion (für SOCKS4: 0x04)
1 ByteBefehl:
  • 0x01 = neue TCP/IP-Verbindung
  • 0x02 = bindet einen Port
2 BytesPortnummer
4 BytesIPv4-Adresse
unbestimmtUser-ID (optional; wenn keine Authentifizierung notwendig, diesen Abschnitt überspringen)
1 ByteAbschluss mit Null-Byte (0x00)

Antwort

LängeBeschreibung
1 ByteNull-Byte (0x00)
1 ByteAntwortcode:
  • 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 ByteBeliebige Daten.
4 ByteBeliebige 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:

VersionKommandoPortnummerAdresseUser-IDAbschluss
0x040x010x00 0x500x42 0x66 0x07 0x630x46 0x72 0x65 0x640x00

Bei der User-ID ist "Fred" als Zeichenfolge in ASCII formatiert.


Darauf antwortet der Server mit "OK":

Null-ByteAntwortcodeBeliebige DatenBeliebige Daten
0x000x5A0xXX0xXX

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:

  1. Der Client verbindet sich zum Server und begrüßt ihn mit Authentifizierungsmethoden die er selbst unterstützt.
  2. Der Server antwortet mit einer von den vom Client gesendeten Methoden.
  3. Abhängig von der Methode kann eine Reihe von Paketen versendet werden.
  4. Der Client sendet eine Verbindungsanfrage ähnlich wie bei SOCKS-4
  5. Der Server antwortet ähnlich wie bei SOCKS-4
Authentifizierungsmethoden
ByteNameErklärung
0x00NO AUTHENTICATION REQUIREDKeine Authentifizierung benötigt
0x01GSSAPIGSSAPI, siehe RFC 2743. Genutzt u. a. von Kerberos.
0x02USERNAME/PASSWORDAuthentifizierung mit Benutzername und Passwort, siehe RFC 1929
0x03 bis 0x7FIANA ASSIGNEDWerden von der IANA vergeben
0x80 bis 0xFERESERVED FOR PRIVATE METHODSFür nicht öffentliche Methoden reserviert
0xFFNO ACCEPTABLE METHODSKeine akzeptable Methode

Der Client sendet als erstes seine Authentifizierungsmethoden:

LängeBeschreibung
1 ByteVersion (für SOCKS-5: 0x05)
1 ByteAnzahl der unterstützten Authentifizierungsmethoden
BytesByte-Werte der unter 'Authentifizierungsmethoden' genannten Methoden, ein Byte pro Methode

Der Server gibt die Auswahl der Methode bekannt

LängeBeschreibung
1 ByteVersion (0x05)
1 ByteByte-Wert der Authentifizierungsmethode; 0xFF, wenn keine akzeptable Methode gefunden.

Die Verbindungsanfrage

So sieht die Verbindungsanfrage bei SOCKS-5 aus:

LängeBeschreibung
1 ByteVersion (für SOCKS-5: 0x05)
1 ByteBefehl:
  • 0x01: Eine TCP-Verbindung aufbauen
  • 0x02: Eine TCP-Verbindung entgegennehmen, d. h. einen Server öffnen.
  • 0x03: Eine UDP-Weiterleitung einrichten
1 ByteReserviert: Muss 0x00 sein
1 ByteAdress-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 BytePort in Byte-Reihenfolge Big-Endian

Die Serverantwort sieht so aus:

LängeBeschreibung
1 ByteVersion (0x05)
1 ByteAntwortcode (siehe Tabelle Antwortcodes)
1 ByteReserviert: Muss 0x00 sein
1 ByteAddress-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 BytePort in Byte-Reihenfolge Big-Endian
Antwortcodes
ByteNameErklärung
0x00succeededVerbindung erfolgreich hergestellt
0x01general SOCKS server failureServerfehler
0x02connection not allowed by rulesetVerbindung wegen der Serverkonfiguration nicht erlaubt.
0x03Network unreachableDas Zielnetzwerk ist nicht erreichbar
0x04Host unreachableDer Zielhost ist nicht erreichbar
0x05Connection refusedVerbindung abgelehnt
0x06TTL expiredZielrechner zu weit entfernt
0x07Command not supportedKommando der Anfrage wird nicht unterstützt
0x08Address type not supportedATYP der Anfrage wird nicht unterstützt
0x09 bis 0xFFNicht vergeben

SOCKS-Server

Liste von SOCKS-Servern:

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:

Spezifikationen

  • RFC 3089 – Ein SOCKS-basierender IPv4/IPv6-Gateway-Mechanismus
  • RFC 1961 – GSS-API-Authentifizierungsmethode für SOCKS V5
  • RFC 1929 – Benutzername/Passwort-Authentifizierung für SOCKS V5
  • RFC 1928 – SOCKS-Protokoll Version 5