Socat

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Relais réseau / port forwarding
Commande socat
Contexte Relais TCP/UDP userspace multi-usages, sans dépendance à iptables
Voir aussi Netcat (équivalent simplifié, une seule connexion à la fois)

socat ("SOcket CAT") relie deux "adresses" bidirectionnelles entre elles : sockets TCP/UDP, sockets UNIX, fichiers, entrée/sortie standard, sous-processus, connexions SSL, proxy SOCKS... C'est un couteau suisse réseau bien plus riche que netcat, notamment utile pour du relais/forwarding de port en espace utilisateur (sans toucher à iptables) ou pour déboguer un protocole texte en interactif.

Syntaxe de base

socat <adresse1> <adresse2>

Chaque adresse suit la forme TYPE:PARAM1:PARAM2,option1,option2. Les types les plus courants : TCP4/TCP6, UDP4, TCP4-LISTEN (écoute en attente d'une connexion entrante), UNIX-CONNECT/UNIX-LISTEN, EXEC, - (stdio), OPENSSL.

Relais TCP (port forwarding)

Le cas d'usage le plus fréquent : rediriger un port local vers une IP/port distant, en userspace, sans règle NAT.

# Relais simple : tout ce qui arrive sur le port local 8080 est renvoyé vers backend:80
socat TCP4-LISTEN:8080,fork TCP4:backend.example.com:80

# Idem avec réutilisation immédiate du port après un arrêt/relance (évite "Address already in use")
socat TCP-LISTEN:80,fork,reuseaddr TCP:203.0.113.5:80

# Relais borné à une IP locale précise (utile sur une machine multi-interfaces)
socat TCP4-LISTEN:9090,bind=192.168.1.10,fork TCP4:203.0.113.5:9090

⚠️ Sans l'option fork, socat ne traite qu'une seule connexion puis s'arrête : indispensable pour tout relais destiné à plusieurs clients/connexions successives.

Test et debug interactifs

# Connexion façon netcat, entrée/sortie standard reliées à une socket TCP
socat - TCP:example.com:80

# Client HTTP interactif avec historique de commandes (readline) et mode verbeux (-d -d)
socat -d -d READLINE,history=$HOME/.socat_history TCP4:www.example.com:80,crnl

Chaque -d supplémentaire augmente le niveau de verbosité (jusqu'à -d -d -d -d), utile pour voir le détail des connexions/déconnexions et diagnostiquer un relais qui ne fonctionne pas comme prévu.

Relais via proxy SOCKS

Exemple de relais faisant transiter le trafic par un proxy SOCKS local (type Tor) avant d'atteindre la cible :

socat -d -d TCP4-LISTEN:4242,fork SOCKS4A:localhost:$TARGET_HOST:$TARGET_PORT,socksport=9050

Pour rediriger le trafic entrant sur ce relais depuis une autre interface (au lieu de s'y connecter directement), combiner avec une redirection iptables :

iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.1.254 --dport 9090 -j REDIRECT --to-port 4242
iptables -I INPUT 1 -p tcp -i eth0 --dport 4242 -j ACCEPT

Socket UNIX et autres types d'adresses

# Exposer une socket UNIX (ex. socket applicative) sur un port TCP
socat TCP4-LISTEN:9000,fork,reuseaddr UNIX-CONNECT:/var/run/app.sock

# Relayer un port TCP vers une commande exécutée à chaque connexion
socat TCP4-LISTEN:2000,fork EXEC:/usr/local/bin/handler.sh

Voir aussi

  • Netcat — équivalent plus simple, une connexion à la fois, sans les types d'adresses avancés (SOCKS, UNIX, EXEC, SSL...)