L’une des meilleures pratiques sécurité 2026 pour un VPS : fermer le port 22 sur l’IP publique et n’autoriser SSH que depuis votre tailnet Tailscale. Plus aucun brute-force possible, plus de scan de port qui réussit, plus de risque de fuite de credentials. Tailscale SSH va même plus loin en remplaçant l’authentification clef par identité utilisateur. Voici le tutoriel complet.
Voir notre guide Tailscale.
Architecture recommandée
Trois approches possibles, du plus simple au plus sophistiqué :
- SSH classique restreint au tailnet : OpenSSH écoute uniquement sur l’IP Tailscale du VPS. Authentification par clef SSH classique.
- Tailscale SSH : remplace OpenSSH par le serveur Tailscale qui authentifie via identité Tailscale (Google/GitHub/SSO).
- Bastion central : un seul VPS « jump host » en tailnet, tous les autres VPS accessibles uniquement depuis le bastion.
Recommandation : approche 2 (Tailscale SSH) pour la simplicité, ou 3 (bastion) pour les architectures avec strict audit.
Approche 2 : Tailscale SSH
Étape 1 — Activer sur le VPS
# Sur le VPS
sudo tailscale up --ssh
# Vérifier
tailscale status
Étape 2 — Connecter depuis votre laptop
# Via tailscale CLI
tailscale ssh user@web-prod-01
# Ou via SSH classique (Tailscale gère le port)
ssh user@web-prod-01
# Avec hostname court (Magic DNS)
ssh deploy@web-prod-01.tailnet-name.ts.net
L’authentification se fait par votre identité Tailscale. Plus besoin de copier des clefs publiques sur chaque VPS.
Étape 3 — Restreindre OpenSSH au tailnet
# Trouver l'IP tailscale du VPS
ip a show tailscale0
# inet 100.x.y.z/32
# Modifier /etc/ssh/sshd_config
ListenAddress 100.x.y.z
# Et supprimer/commenter les autres ListenAddress
systemctl restart ssh
# Vérifier que SSH n'écoute plus sur l'IP publique
ss -tlnp | grep :22
Étape 4 — Fermer port 22 sur Hetzner Firewall
- Console Hetzner Cloud → Firewalls
- Éditer la règle entrante TCP 22 → la supprimer
- Sauvegarder
Désormais le port 22 est inaccessible depuis Internet. SSH n’est joignable que via Tailscale.
Approche 3 : Bastion central
Pour une infrastructure avec 5-10+ VPS, un bastion centralise les accès :
# Architecture
laptop --(tailscale)--> bastion --(tailscale ou réseau privé)--> web/db/etc
# Bastion : Tailscale + ACL stricte
sudo tailscale up --ssh --hostname=bastion --advertise-tags=tag:bastion
# Web servers : Tailscale, ACL n'autorise que tag:bastion comme source SSH
sudo tailscale up --advertise-tags=tag:web
Configurez les ACLs (voir notre tutoriel ACLs) pour que seul le bastion puisse SSH vers les autres VPS.
Audit log SSH
Tailscale enregistre toutes les sessions SSH dans le dashboard (Logs → SSH). Vous voyez : qui s’est connecté, depuis quel device, à quel hôte, quand, durée. Pratique pour conformité et détection d’anomalies.
Recovery en cas de panne Tailscale
Tailscale est un service externe. Que faire si login.tailscale.com est down ?
- Les nœuds déjà connectés restent connectés (peer-to-peer)
- Les nouvelles connexions ne marchent pas pendant la panne
- Mitigation : garder un accès « break-glass » — par exemple console KVM Hetzner, ou un compte SSH local sur une IP whitelistée temporaire
- Alternative : Headscale (auto-hébergé) — voir tutoriel
Adaptation Afrique de l’Ouest
Pour une équipe distribuée Sénégal/CI/Mali avec VPS Hetzner européens, Tailscale SSH bastion supprime totalement le risque de brute-force depuis les bots qui scannent en permanence vos IPs publiques. La latence ajoutée est minime (~10-20 ms vs SSH direct).
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| SSH lockout après fermeture port | Tailscale pas encore actif côté laptop | Console KVM Hetzner pour rouvrir temporairement |
| Tailscale SSH refuse connection | –ssh pas activé | tailscale up –ssh |
| OpenSSH n’écoute plus | ListenAddress mauvaise IP | Vérifier ip a show tailscale0 |
| « Permission denied » via Tailscale SSH | ACLs mal configurées | Vérifier policy ssh dans tailnet ACLs |