====== autossh ======
**autossh** permet de garder des tunnels ssh ouvert et de les remonter en cas de déconnexion.
Installer **autossh**
apt install autossh
Comme le dit le **man autossh** il est préférable d'utiliser les options **ServerAliveInternal** et **ServerAliveCountMax** plutôt que d'utiliser le echo port pour le monitoring, je vais donc écrire les commandes dans ce contexte.
Exemple: J'ai besoin d'un accès à une base de données distante en local
La commande ssh serait
ssh -L 3307:localhost:3306 username@toto-public.com
La commande autossh serait
autossh -M 0 -q -f -N -oServerAliveInterval=60 -oServerAliveCountMax=3 -L 3307:localhost:3306 username@toto-public.com
===== Lancement automatique =====
Pour que cette connexion se lance au démarrage de la machine, utiliser **systemd**
==== Pour un tunnel ====
Créez un fichier de configuration pour votre tunnel (remplacez mon-tunnel par le nom de votre choix) :
vi /etc/systemd/system/autossh-tunnel.service
Copiez et adaptez le contenu suivant :
[Unit]
Description=AutoSSH Tunnel Service
After=network-online.target
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
Environment="AUTOSSH_GATETIME=0"
User=votre_utilisateur
# -M 0 désactive le monitoring d'autossh pour laisser SSH gérer ses propres timeouts
ExecStart=/usr/bin/autossh -M 0 -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 8080:localhost:80 user@remote-server -i /home/votre_utilisateur/.ssh/id_rsa
[Install]
WantedBy=multi-user.target
Exécutez ces commandes pour prendre en compte le nouveau service et l'activer au démarrage :
systemctl daemon-reload
systemctl enable autossh-tunnel.service
systemctl start autossh-tunnel.service
Points clés à vérifier :
* Authentification par clé : Assurez-vous que votre clé SSH n'a pas de passphrase, sinon le service bloquera au démarrage.
* Droits : Le dossier .ssh et la clé privée doivent appartenir à l'utilisateur défini dans le fichier service.
* Logs : En cas de problème, utilisez ''journalctl -u autossh-tunnel.service'' pour diagnostiquer.
==== Pour plusieurs tunnels ====
Pour gérer plusieurs tunnels proprement sans multiplier les fichiers manuellement, la meilleure pratique est d'utiliser les fichiers de service instanciés (templates) de systemd.
=== Créer un template de service ===
Créez un fichier générique avec un @ dans le nom :
vi /etc/systemd/system/autossh@.service
=== Configurer le template ===
Utilisez la variable ''%i'' qui sera remplacée par le nom du fichier de configuration que nous allons créer plus loin :
[Unit]
Description=AutoSSH tunnel pour %i
After=network-online.target
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
EnvironmentFile=/etc/default/autossh-%i
ExecStart=/usr/bin/autossh -M 0 -N $SSH_OPTIONS $TUNNEL_CONFIG $REMOTE_HOST
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
=== Créer les fichiers de configuration ===
Pour chaque tunnel, créez un fichier d'environnement spécifique. Par exemple, pour un tunnel "Web" et un tunnel "DB" :
Fichier ''/etc/default/autossh-web'' :
SSH_OPTIONS="-o 'ServerAliveInterval 30' -o 'ServerAliveCountMax 3'"
TUNNEL_CONFIG="-L 8080:localhost:80"
REMOTE_HOST="user@serveur-web.com"
Fichier ''/etc/default/autossh-db'' :
SSH_OPTIONS="-o 'ServerAliveInterval 30' -o 'ServerAliveCountMax 3'"
TUNNEL_CONFIG="-L 5432:localhost:5432"
REMOTE_HOST="user@serveur-db.com"
=== Activer chaque tunnel individuellement ===
Il suffit maintenant d'appeler le service en ajoutant le nom défini après l'arobase :
systemctl daemon-reload
Activer le tunnel Web
systemctl enable --now autossh@web
Activer le tunnel DB
systemctl enable --now autossh@db
Avantages :
Maintenance simplifiée : Un seul fichier service pour tous vos tunnels.
Isolation : Vous pouvez redémarrer autossh@web sans couper autossh@db.
Clarté : La commande systemctl status "autossh*" vous donnera l'état de chaque tunnel distinctement.
==== Le cas avec Docker ====
Pour que votre container docker puisse accéder au port de son hôte, il faut modifier les options pour le tunnel
Changer ça
-L 33060:localhost:3306
par ça
-L 172.17.0.1:33060:localhost:3306
L'ip 172.17.0.1 est l'ip de l'hôte vu par les containers docker
Vérifier
# ss -ln4t
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 172.17.0.1:33060 0.0.0.0:*
# docker exec -ti myapp sh
/app # ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: seq=0 ttl=64 time=0.073 ms
64 bytes from 172.17.0.1: seq=1 ttl=64 time=0.069 ms
^C
--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.069/0.071/0.073 ms
mysql_waitpid mysqlcheck mysqlimport
/app # mysql -h 172.17.0.1 -P 33060 -u user -p