Aller au contenu

changer le port d'écoute sur Debian 13 (`ssh.socket`)

Le problème

Après avoir configuré un port SSH personnalisé (ici 1234) dans /etc/ssh/sshd_config, la connexion échoue :

$ ssh openvpn
ssh: connect to host 192.168.1.13 port 1234: Connection refused

Pourtant, la configuration côté client (~/.ssh/config) est correcte :

Host openvpn
    HostName 192.168.0.45
    Port 1234
    User fred

Côté serveur, sshd_config contient bien :

Port 1234

Et pourtant, sshd continue d'écouter sur le port 22 :

# ss -tlnp | grep ssh
LISTEN 0  4096  *:22  *:*  users:(("sshd",pid=127,fd=3))

Piège sur la commande de test

Une commande comme ssh -P 1234 [email protected] semble fonctionner, mais le -P majuscule n'est pas l'option de port de ssh (c'est celle de scp). Elle est ignorée pour la connexion, qui se fait alors sur le port 22 par défaut. L'option correcte est -p en minuscule : ssh -p 1234 [email protected].

L'origine

Sur Debian 13, le serveur SSH est démarré par activation par socket (ssh.socket) :

  • systemd ouvre lui-même le port d'écoute, défini dans ssh.socket (ListenStream, par défaut le port 22) ;
  • ssh.service est lancé par systemd à la demande, en recevant le socket déjà ouvert.

Dans ce mode, la directive Port de sshd_config est ignorée : ce n'est pas sshd qui choisit le port, mais systemd.

On peut le constater avec :

# systemctl status ssh.socket
...
     Listen: [::]:22 (Stream)
     Triggers: * ssh.service

La résolution

Il y a deux approches possibles.

Option 1 : désactiver l'activation par socket (la plus simple)

On revient au fonctionnement classique : sshd est lancé directement et respecte sshd_config.

sudo systemctl disable --now ssh.socket
sudo systemctl restart ssh.service
sudo systemctl enable ssh.service

Vérification :

ss -tlnp | grep ssh

Le port 1234 doit apparaître, géré par sshd.

Option 2 : configurer le port dans ssh.socket

On conserve l'activation par socket et on modifie le port d'écoute du socket via un fichier de surcharge :

sudo systemctl edit ssh.socket

Contenu à ajouter :

[Socket]
ListenStream=
ListenStream=1234

Note

La première ligne ListenStream= vide est indispensable : elle réinitialise la valeur par défaut (port 22). Sans elle, le socket écouterait sur les deux ports.

Il faut ensuite arrêter les deux unités avant de relancer le socket :

sudo systemctl stop ssh.service ssh.socket
sudo systemctl daemon-reload
sudo systemctl start ssh.socket

Erreur « Socket service ssh.service already active, refusing »

Si on arrête uniquement ssh.socket, le sshd lancé précédemment reste actif et garde le port 22 ouvert. systemd refuse alors de démarrer le socket :

ssh.socket: Socket service ssh.service already active, refusing.
Failed to listen on ssh.socket - OpenBSD Secure Shell server socket.

La solution est d'arrêter aussi ssh.service (et, au besoin, de repérer un démon orphelin avec pgrep -a sshd).

Vérification

Depuis le poste client, dans un nouveau terminal (sans fermer la session en cours) :

ssh -p 1234 [email protected]
# ou, avec l'entrée du fichier ~/.ssh/config :
ssh openvpn

Bonnes pratiques

  • Garder une session SSH ouverte (ou la console Proxmox/VM à portée de main) pendant la manipulation, pour ne pas se retrouver bloqué dehors.
  • Penser à ouvrir le nouveau port dans le pare-feu de la VM s'il y en a un.
  • Utiliser -p (minuscule) avec ssh et -P (majuscule) avec scp.

Résumé

Symptôme Connection refused sur le port personnalisé, sshd écoute toujours sur le 22
Cause ssh.socket (activation par socket) impose le port, Port de sshd_config est ignoré
Solution Désactiver ssh.socket ou définir ListenStream dans une surcharge de ssh.socket