# socat — Bidirektionale Netzwerk-Relays auf der Kommandozeile

> Praxis-Guide zu socat — Netcat auf Steroiden: bidirektionale Relays für Portweiterleitung, Tunneling und Debugging über TCP, UDP, TLS und UNIX-Sockets.

Source: https://www.jpkc.com/db/cheatsheets/networking/socat/

<!-- PROSE:intro -->
socat ist das Netcat auf Steroiden: Es verbindet nicht nur TCP-Sockets, sondern beliebige Datenkanäle – TCP, UDP, UNIX-Sockets, Dateien, Pipes, serielle Schnittstellen und TLS-Verbindungen – bidirektional miteinander. Mit einem einzigen Befehl baust du Portweiterleitungen, TLS-Tunnel oder inetd-Dienste, kannst Protokolle im Klartext inspizieren und Daten zwischen Netzwerk-Sockets und lokalen Prozessen routen. Dieser Guide zeigt dir die wichtigsten socat-Muster für den Alltag.
<!-- PROSE:intro:end -->

## TCP-Verbindungen

`socat TCP-LISTEN:<port>,reuseaddr,fork -` — Erstellt einen einfachen TCP-Server, der auf einem Port lauscht.

```bash
socat TCP-LISTEN:8080,reuseaddr,fork -
```

`socat - TCP:<host>:<port>` — Verbindet dich mit einem TCP-Server (wie netcat).

```bash
socat - TCP:localhost:8080
```

`socat TCP-LISTEN:<port>,reuseaddr,fork TCP:<host>:<port>` — TCP-Portweiterleitung (Proxy).

```bash
socat TCP-LISTEN:8080,reuseaddr,fork TCP:backend:3000
```

`socat TCP-LISTEN:<port>,reuseaddr,fork,bind=<ip> TCP:<host>:<port>` — Portweiterleitung an eine bestimmte Netzwerkschnittstelle gebunden.

```bash
socat TCP-LISTEN:8080,reuseaddr,fork,bind=127.0.0.1 TCP:remote:80
```

## UDP & UNIX-Sockets

`socat UDP-LISTEN:<port> -` — Lauscht auf UDP-Pakete.

```bash
socat UDP-LISTEN:5000 -
```

`socat - UDP:<host>:<port>` — Sendet Daten per UDP.

```bash
echo 'test' | socat - UDP:localhost:5000
```

`socat UNIX-LISTEN:<path>,fork TCP:<host>:<port>` — Leitet einen UNIX-Socket auf eine TCP-Verbindung weiter.

```bash
socat UNIX-LISTEN:/tmp/myapp.sock,fork TCP:localhost:3306
```

`socat TCP-LISTEN:<port>,fork UNIX:<path>` — Macht einen UNIX-Socket über TCP erreichbar — exponiert den Docker-Daemon **ungesichert**; nur in lokalen/Test-Umgebungen, niemals öffentlich erreichbar.

```bash
socat TCP-LISTEN:2375,fork UNIX:/var/run/docker.sock
```

## SSL/TLS

`socat OPENSSL-LISTEN:<port>,cert=<cert>,key=<key>,fork TCP:<host>:<port>` — SSL/TLS-Terminierungsproxy.

```bash
socat OPENSSL-LISTEN:443,cert=server.pem,key=server.key,reuseaddr,fork TCP:localhost:8080
```

`socat - OPENSSL:<host>:<port>` — Verbindet dich mit einem SSL/TLS-Server.

```bash
socat - OPENSSL:example.com:443
```

`socat TCP-LISTEN:<port>,fork OPENSSL:<host>:<port>` — Fügt einer unverschlüsselten Verbindung TLS hinzu.

```bash
socat TCP-LISTEN:3307,fork OPENSSL:db.example.com:3306
```

## Dateiübertragung

`socat TCP-LISTEN:<port> OPEN:<file>,creat` — Empfängt eine Datei über TCP.

```bash
socat TCP-LISTEN:9999 OPEN:received.tar.gz,creat
```

`socat OPEN:<file> TCP:<host>:<port>` — Sendet eine Datei über TCP.

```bash
socat OPEN:backup.tar.gz TCP:remote:9999
```

`socat EXEC:'tar czf - /data' TCP-LISTEN:<port>` — Streamt ein tar-Archiv über das Netzwerk.

```bash
socat EXEC:'tar czf - /data' TCP-LISTEN:9999
```

`socat TCP:<host>:<port> EXEC:'tar xzf -'` — Empfängt einen tar-Stream und entpackt ihn.

```bash
socat TCP:remote:9999 EXEC:'tar xzf - -C /restore'
```

## Debugging & Tests

`socat -v TCP-LISTEN:<port>,fork TCP:<host>:<port>` — Verbose-Proxy: zeigt alle durchlaufenden Daten an.

```bash
socat -v TCP-LISTEN:8080,fork TCP:api.example.com:80
```

`socat -x TCP-LISTEN:<port>,fork TCP:<host>:<port>` — Hex-Dump-Proxy: zeigt Daten als Hexadezimal.

```bash
socat -x TCP-LISTEN:8080,fork TCP:localhost:3000
```

`socat READLINE TCP:<host>:<port>` — Interaktive Verbindung mit Readline (Zeilenbearbeitung und History).

```bash
socat READLINE TCP:localhost:6379
```

`socat /dev/null TCP:<host>:<port>` — Schneller TCP-Konnektivitätstest.

```bash
socat /dev/null TCP:db.example.com:5432,connect-timeout=5
```

## Typische Muster

`socat TCP-LISTEN:<port>,reuseaddr,fork EXEC:<program>` — Startet ein Programm für jede TCP-Verbindung (inetd-Stil).

```bash
socat TCP-LISTEN:8080,reuseaddr,fork EXEC:/usr/local/bin/handler.sh
```

`socat PTY,link=<path>,raw,echo=0 TCP:<host>:<port>` — Erstellt einen virtuellen seriellen Port über TCP.

```bash
socat PTY,link=/dev/vmodem,raw,echo=0 TCP:192.168.1.100:5000
```

`socat TCP-LISTEN:<port>,reuseaddr,fork SYSTEM:'echo HTTP/1.1 200 OK; echo; echo Hello'` — Schneller HTTP-Antwort-Server zum Testen.

```bash
socat TCP-LISTEN:8080,reuseaddr,fork SYSTEM:'echo HTTP/1.1 200 OK; echo; echo Hello World'
```

<!-- PROSE:outro -->
## Fazit

socat deckt ein breites Spektrum ab, das kein anderes Kommandozeilen-Werkzeug allein schließt: Ob Portweiterleitung, TLS-Tunnel oder inetd-Dienst mit einer Zeile – es lohnt sich, die Adress-Syntax zu verinnerlichen. Für schnelle Verbindungstests bleibt netcat die einfachere Wahl; sobald du Protokoll-Transformationen oder TLS brauchst, greifst du zu socat.

## Weiterführende Links

- [socat – Wikipedia](https://en.wikipedia.org/wiki/Socat) – Hintergrund und Einsatzgebiete (englisch)
- [socat(1) – Manpage](http://www.dest-unreach.org/socat/doc/socat.html) – alle Optionen im Überblick (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [nc](https://www.jpkc.com/db/cheatsheets/networking/nc/) – einfache TCP/UDP-Verbindungen und schnelle Konnektivitätstests
- [ssh](https://www.jpkc.com/db/cheatsheets/networking/ssh/) – sichere Tunnel und Remote-Portweiterleitung über SSH
- [tcpdump](https://www.jpkc.com/db/cheatsheets/networking/tcpdump/) – Netzwerkverkehr mitschneiden und analysieren

