socat (SOcket CAT) to scyzoryk sieciowy potężniejszy od netcat. Otwiera dwa niezależne strumienie danych i łączy je dwukierunkowym tunelem — a „strumień” to u niego niemal wszystko: port TCP/UDP, gniazdo uniksowe, plik, urządzenie, pseudoterminal, standardowe wejście/wyjście, a nawet uruchomiony program. Dzięki temu jednym poleceniem zrobisz przekierowanie portu, prosty serwer, tunel czy debugowanie protokołu, zamiast pisać do tego skrypt. Cena tej mocy to składnia, która na początku wygląda jak zaklęcie.
Składnia i najważniejsze opcje
Podstawowa forma to socat [opcje-globalne] ADRES1 ADRES2 — oba adresy to punkty, które socat spina ze sobą.
TCP-LISTEN:— nasłuchuje na porcie TCP i czeka na połączenie (skrót:TCP-L).TCP:— łączy się jako klient z danym hostem i portem.: UDP-LISTEN/UDP— odpowiedniki dla UDP.fork— po każdym połączeniu forkuje proces potomny, więc serwer obsługuje wiele klientów zamiast kończyć po pierwszym.reuseaddr— pozwala natychmiast wznowić nasłuch na porcie bez czekania na zwolnienie gniazda.EXEC:— uruchamia program i podpina jego wejście/wyjście do strumienia.STDIO(albo po prostu-) — standardowe wejście i wyjście terminala.-v— tryb gadatliwy: wypisuje przesyłane dane nastderr, świetne do podglądu ruchu.
Przykłady użycia
socat TCP-LISTEN:8080,fork,reuseaddr TCP:localhost:80— przekierowanie portu: wszystko z 8080 leci na lokalny port 80, obsługując wielu klientów naraz.socat TCP-LISTEN:9000,reuseaddr,fork EXEC:cat— prosty serwer echo: odsyła to, co dostanie.socat - TCP:example.com:80— łączysz swój terminal z portem 80 zdalnego hosta, jak ręczny klient (-to STDIO).socat -v TCP-LISTEN:1234,fork TCP:backend:5678— proxy podsłuchujące: przekazuje ruch do backendu i wypisuje go na ekran do debugowania.socat UNIX-LISTEN:/tmp/app.sock,fork TCP:localhost:3306— wystawia gniazdo uniksowe i mostkuje je do portu TCP (np. do MySQL).
Częste błędy i pułapki
Najczęstszy zgrzyt to pominięcie fork — bez niego serwer obsłuży jedno połączenie i się zamknie, więc drugi klient dostaje ciszę. Brak reuseaddr przy szybkim restarcie daje klasyczne Address already in use. Pamiętaj, że przecinki oddzielają opcje adresu, a dwukropki jego części — literówka tutaj to zwykle błąd składni, nie logiki.
socat nie jest instalowany domyślnie (apt install socat / dnf install socat). Adresy są też rozróżniane wielkością liter i różnią się między wersjami — na starszych zamiast TCP bywa TCP4. I ostrożnie z EXEC wystawionym publicznie: podpięcie powłoki do otwartego portu to gotowy backdoor, nie serwer.
Powiązane komendy: nc (netcat), ncat, ssh (tunelowanie), iptables, curl.