Skip to content
Sistema

Socat sous Linux : relayer un port TCP sans monter un proxy complet

Avatar illustré de Julien Macé 2 min read
Illustration d’un relais TCP entre deux serveurs Linux
Illustration d’un relais TCP entre deux serveurs Linux

Vous devez relier un port TCP local à un service distant pour un test, un dépannage ou un accès temporaire ? socat sait faire ce relais directement depuis le terminal, sans installer un proxy complet. La commande est puissante, mais elle ne chiffre pas le flux et n’ajoute pas de contrôle d’accès par magie.

Installer socat et préparer le test

Sur Debian ou Ubuntu, installez le paquet :

sudo apt update
sudo apt install socat

Pour l’exemple, le serveur Linux écoute sur le port local 8080 et relaie les connexions vers 192.0.2.20:80. Remplacez cette adresse de documentation par votre service réel. Ne lancez pas la commande sur un port déjà utilisé : vérifiez d’abord l’écoute locale.

ss -ltnp | grep ':8080' || true

Relayer un port TCP avec socat

La forme la plus simple relie une écoute TCP à une destination TCP :

sudo socat TCP-LISTEN:8080,reuseaddr,fork TCP:192.0.2.20:80

TCP-LISTEN:8080 ouvre le port local. reuseaddr évite certains blocages après un arrêt rapide, tandis que fork crée un processus pour chaque connexion. La destination est définie par TCP:hôte:port.

Par défaut, l’écoute peut être accessible sur les interfaces du serveur. Pour limiter le relais à la machine locale, liez-le à l’adresse de loopback :

sudo socat TCP-LISTEN:8080,bind=127.0.0.1,reuseaddr,fork TCP:192.0.2.20:80

C’est préférable pour un test local ou un tunnel d’administration. Si d’autres machines doivent accéder au relais, utilisez l’adresse d’interface voulue et ajoutez une règle de pare-feu adaptée. N’exposez pas un port d’écoute sur 0.0.0.0 sans avoir vérifié qui peut l’atteindre.

Voir ce que fait le relais

Ajoutez -d -d pour afficher davantage d’informations dans le terminal :

sudo socat -d -d TCP-LISTEN:8080,bind=127.0.0.1,reuseaddr,fork TCP:192.0.2.20:80

Dans un second terminal, vérifiez que le processus écoute, puis envoyez une requête de test :

ss -ltnp | grep ':8080'
curl -v http://127.0.0.1:8080/

Si la connexion locale est refusée, le relais n’écoute pas ou un pare-feu bloque le port. Si socat accepte la connexion mais ne joint pas la destination, contrôlez la route, le port distant et les journaux du service cible. Un relais TCP ne transforme pas un service HTTP en service HTTPS et ne corrige pas une erreur TLS.

Limiter l’exposition et arrêter socat

Pour arrêter un relais lancé au premier plan, utilisez Ctrl+C. Pour retrouver un processus lancé ailleurs :

pgrep -a socat
sudo ss -ltnp | grep ':8080'

Ne laissez pas cette commande tourner comme un service permanent sans journalisation, utilisateur dédié et règles de pare-feu. socat ne chiffre pas la connexion : pour un accès sensible, ajoutez une couche TLS correctement configurée ou préférez un tunnel SSH selon le besoin. Le contrôle des utilisateurs doit rester assuré par le service cible, le pare-feu ou un proxy prévu pour cela.

Pour aller plus loin, comparez ce relais avec le transfert de port SSH et vérifiez les sockets avec l’article sur les ports ouverts sous Linux. La commande socat dans sa page de manuel détaille les options disponibles.

Illustration d’un relais TCP entre deux serveurs Linux
Un relais TCP relie une écoute locale à un service distant.
Share Facebook X WhatsApp LinkedIn Pinterest Reddit Email