Redirection locale (-L) : le port est occupé sur votre machine
Avec ssh -L 8080:localhost:80 user@server, vous pouvez voir :
bind [127.0.0.1]:8080: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 8080
Could not request local forwarding.
Cherchez qui occupe le port. Cela fonctionne sur macOS et Linux :
lsof -nP -iTCP:8080 -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 4242 user 4u IPv4 ... 0t0 TCP 127.0.0.1:8080 (LISTEN)
Sous Windows, utilisez netstat -ano | findstr :8080.
ssh: un tunnel précédent tourne encore, souvent lancé avec-fpuis oublié. Lancezkill 4242avec le PID affiché, ou lisez la section sur les connexions partagées plus bas.- Un serveur de développement, Docker ou une base de données : choisissez un autre port local. Seul le nombre de gauche change :
ssh -L 18080:localhost:80 user@server. - Sous macOS,
ControlCesur le port 5000 ou 7000 est le récepteur AirPlay. Prenez un autre port, ou désactivez le récepteur AirPlay dans Réglages Système.
Vous hésitez sur l'option ? Tunnels SSH : redirection locale, distante et dynamique compare les trois.
Seule la première ligne apparaît
Si vous ne voyez que bind [127.0.0.1]:8080: Address already in use et que la session s'ouvre, SSH a réussi à lier le côté IPv6 mais pas le côté IPv4. -L 8080:... essaie les deux. Le port ne fonctionne qu'à moitié : les clients qui utilisent 127.0.0.1 atteignent l'autre programme, pas votre tunnel. Indiquez l'adresse, et SSH signalera correctement l'échec :
ssh -o ExitOnForwardFailure=yes -L 127.0.0.1:8080:localhost:80 user@server
Redirection distante (-R) : le port est occupé sur le serveur
Avec ssh -R 8080:localhost:80 user@server :
Warning: remote port forwarding failed for listen port 8080
La session s'ouvre quand même, et l'avertissement passe facilement inaperçu. La cause est sur le serveur, et son journal contient la même ligne bind. Regardez qui occupe le port là-bas :
ssh user@server "ss -ltnp | grep ':8080'"
Le nom du processus n'apparaît que pour vos propres processus, sauf si vous utilisez sudo. Parfois le propriétaire est sshd ou sshd-session : la connexion précédente depuis votre portable, ou votre script de tunnel, est morte sans que le serveur s'en aperçoive, et elle garde le port. Trouvez et terminez cette session sur le serveur :
sudo ss -ltnp | grep ':8080'
sudo kill PID
Pour que le serveur nettoie ces sessions lui-même, ajoutez ceci à sshd_config et rechargez le service. Un client silencieux depuis environ 90 secondes est alors déconnecté :
ClientAliveInterval 30
ClientAliveCountMax 3
Un port occupé n'est pas la seule raison de cet avertissement. Si le port est libre, le serveur interdit peut-être la redirection, ce que traite administratively prohibited.
Si vous n'avez pas besoin d'un port fixe, laissez le serveur en choisir un. Le client affiche le port obtenu :
ssh -R 0:localhost:80 user@server
Allocated port 38587 for remote forward to localhost:80
Faire échouer franchement un tunnel en échec
Par défaut, SSH se connecte même quand la redirection a échoué ; les scripts continuent donc et échouent plus tard pour une raison déroutante. Avec cette option, il s'arrête avec le code 255 :
ssh -o ExitOnForwardFailure=yes -N -L 127.0.0.1:8080:localhost:80 user@server
Pour -R, le message devient alors :
Error: remote port forwarding failed for listen port 8080
Utilisez cette option dans tout ce qui est automatisé, y compris autossh. Ainsi, une boucle de reconnexion voit l'échec et réessaie quand le port est libre.
Les connexions partagées gardent aussi des ports
Avec ControlMaster, la redirection appartient au processus maître en arrière-plan : fermer votre terminal ne libère donc pas le port. Vous pouvez parler au maître, avec le même hôte et la même configuration :
ssh -O check user@server
ssh -O cancel -L 127.0.0.1:8080:localhost:80 user@server
ssh -O exit user@server
Voir le multiplexage SSH pour en savoir plus.
Questions
Comment trouver le processus qui utilise un port ?
Sur macOS et Linux, lancez lsof -nP -iTCP:8080 -sTCP:LISTEN, ou ss -ltnp sous Linux. Sous Windows, utilisez netstat -ano | findstr :8080. La sortie indique le programme et son PID.
Pourquoi SSH se connecte-t-il alors que la redirection de port a échoué ?
Par défaut, une redirection ratée n'est qu'un avertissement. Ajoutez -o ExitOnForwardFailure=yes et ssh quitte avec le code 255, ce que les scripts détectent.
Comment fermer un tunnel SSH lancé en arrière-plan ?
Trouvez son processus ssh avec lsof et lancez kill avec son PID. S'il dépend d'une connexion ControlMaster, utilisez ssh -O cancel ou ssh -O exit avec le même hôte.