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.