Ce que cela protège, et ce que cela ne protège pas
Un nouveau port arrête les scans automatiques qui n'essaient que le port 22 : vos journaux deviennent beaucoup plus calmes. C'est tout l'intérêt. Un scan de tous les ports trouve quand même SSH, car le serveur s'annonce dès que quelque chose s'y connecte. Les mots de passe faibles restent faibles sur n'importe quel port. Faites d'abord ce qui compte vraiment : désactivez la connexion par mot de passe et revoyez la configuration de sshd.
Cela a aussi de petits coûts : chaque outil a maintenant besoin du port, et votre known_hosts traite le nouveau port comme une nouvelle entrée, donc vous confirmez de nouveau l'empreinte.
Choisissez un port que rien d'autre n'utilise. Les ports inférieurs à 1024 ne peuvent être ouverts que par root, ce qui est un petit avantage si sshd tombe un jour.
1. Garder un chemin de retour
Gardez votre session actuelle ouverte jusqu'à la dernière étape. Une session existante survit normalement à un redémarrage de sshd : c'est votre chemin de retour. Si vous pouvez accéder à une console chez votre hébergeur, repérez-la avant de commencer.
2. Ouvrir d'abord le nouveau port
Avec ufw :
sudo ufw allow 2222/tcp
Avec firewalld, sur RHEL, Rocky, AlmaLinux et Fedora :
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
Un serveur cloud a aussi généralement un pare-feu ou un groupe de sécurité dans le panneau de l'hébergeur. Ouvrez-y aussi le port. C'est la cause la plus fréquente d'un délai dépassé après ce changement.
SELinux
Sur les systèmes de la famille RHEL avec SELinux en mode enforcing, sshd ne peut pas utiliser un nouveau port tant que vous ne l'avez pas étiqueté. Le sshd_config par défaut de ces systèmes le dit aussi. Vérifiez, puis ajoutez l'étiquette :
getenforce
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh
Si getenforce répond Disabled, passez cette étape. Dans cet état, semanage échoue avec SELinux policy is not managed or store cannot be accessed, ce qui est sans conséquence. Si semanage manque, il vient avec le paquet policycoreutils-python-utils.
3. Ajouter le nouveau port à côté de l'ancien
Ne remplacez pas encore l'ancien port. Créez un petit fichier, ce qui laisse la configuration principale intacte :
printf 'Port 22\nPort 2222\n' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -t
Si sshd -t n'affiche rien, la syntaxe est valide. Les systèmes plus anciens sans ce dossier ont besoin des mêmes deux lignes dans /etc/ssh/sshd_config.
4. Appliquer : cela dépend du système
Demandez d'abord dans quel cas vous êtes :
systemctl is-active ssh.socket
Il répond active (Ubuntu 24.04 et 26.04 par défaut). Le socket détient le port et il est généré à partir de votre configuration : redémarrer le service ne suffit donc pas :
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
C'est le piège habituel. Dans notre test, sudo systemctl restart ssh seul laissait les anciens ports en écoute sans aucune erreur.
Il répond inactive (Debian, Ubuntu 22.04) :
sudo systemctl restart ssh
Famille RHEL, où le service porte un autre nom :
sudo systemctl restart sshd
Ubuntu 22.10 à 23.10 utilisaient le socket différemment et ne sont plus pris en charge. Dans ce cas, vérifiez systemctl cat ssh.socket avant de vous fier à ces étapes.
Vérifiez maintenant que les deux ports écoutent :
ss -tln | grep -E ':(22|2222)\b'
5. Tester depuis un nouveau terminal
Laissez l'ancienne session ouverte et, depuis votre propre machine, lancez :
ssh -p 2222 user@server
Un délai dépassé signifie qu'un pare-feu bloque encore. Connection refused signifie que rien n'écoute, ou que SELinux a empêché sshd de se lier au port. Corrigez maintenant, tant que le port 22 fonctionne encore.
6. Fermer le port 22
Seulement une fois le test réussi :
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -t
Si le fichier principal /etc/ssh/sshd_config contient une ligne Port 22 non commentée, commentez-la aussi, sinon sshd continue d'écouter sur ce port. Appliquez comme à l'étape 4, confirmez avec sudo sshd -T | grep -i ^port, puis supprimez l'ancienne règle du pare-feu, en utilisant celle qui s'applique :
sudo ufw delete allow 22/tcp
sudo ufw delete allow OpenSSH
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
Testez encore une fois dans un nouveau terminal, et ne fermez l'ancienne session qu'ensuite.
Mettre à jour votre client
Enregistrez le port pour ne plus avoir à le taper :
Host server
HostName 203.0.113.10
Port 2222
User user
Pour d'autres réglages à garder par hôte, voyez ces exemples de fichier ssh config.
Notez que scp utilise un -P majuscule pour le port, contrairement à ssh. Si vous utilisez fail2ban, indiquez-lui aussi le nouveau port. Voir fail2ban pour SSH.
Questions
Changer le port SSH en vaut-il la peine ?
Cela réduit le bruit des robots qui n'essaient que le port 22. Cela n'arrête pas une attaque ciblée : la connexion par clé seule et un serveur à jour comptent davantage.
Pourquoi le nouveau port SSH ne marche-t-il pas sous Ubuntu 24.04 ?
Ubuntu 24.04 démarre sshd via ssh.socket. Après avoir changé Port, lancez sudo systemctl daemon-reload et sudo systemctl restart ssh.socket, puis vérifiez avec ss -tln.
Comment se connecter en SSH sur un autre port ?
Utilisez ssh -p 2222 utilisateur@serveur, ou ajoutez Port 2222 sous l'entrée Host du serveur dans ~/.ssh/config. scp prend le port avec un -P majuscule.
Sources
- sshd_config(5), manuel OpenBSD
- Bug Launchpad 2069041 : changer Port exige un daemon-reload
- Configuring SELinux for non-standard configurations, Red Hat
- ufw(8), manuel Ubuntu