Pour ceux qui ne veulent pas (ou) ne peuvent pas utiliser AutoSSH...
J'ai un NAS auquel je veux accéder depuis internet, je ne peux pas utiliser le renvoi de port car mon FAI utilise le CGNAT (mon adresse IP publique n'est pas vraiment celle publique, je suis derrière un autre routeur dont je n'ai aucun contrôle). Par conséquent, pour atteindre mon NAS, j'ai un VPS (que je loue chez OVH pour un coût mensuel très bas), et qui a une adresse IP publique fixe. Donc pour atteindre mon NAS depuis internet, je dois simplement créer un tunnel SSH entre mon NAS et mon VPS, qui reste ouvert de manière fiable tout le temps (pour un accès 24h/24 et 7j/7). Cependant, j'ai souffert du tunnel SSH qui était "fermé" en raison de l'inactivité (malgré le processus ssh restant actif). Cela peut facilement être surmonté en utilisant l'option de maintien de la connexion (keep alive) pour que le client (dans mon cas, le VPS) "ping" le serveur (dans mon cas, le NAS).
Pour créer un tunnel SSH, j'exécute la commande suivante (depuis le NAS) :
ssh -NT -o ServerAliveInterval=60 -o ServerAliveCountMax=10 -o ExitOnForwardFailure=yes -i /var/services/homes/foouser/.ssh/id_rsa -R 8080:localhost:80 -R 4443:localhost:443 foouser@
Pour expliquer cette commande :
-N
- Ne pas exécuter de commande à distance; cela est utile pour simplement faire suivre les ports.
-T
- Désactive l'allocation de pseudo-tty.
-R 8080:localhost:80
- Indique que le port donné sur l'hôte distant (serveur) doit être transmis à l'hôte et au port donnés du côté local. Dans ce cas, cela signifie transmettre le port 80 du serveur distant au port 8080 du client.
-i /chemin/vers/clé
- Spécifie le chemin de la clé ssh utilisée pour établir la session ssh, sans cela vous devrez saisir le nom d'utilisateur (si non fourni) et le mot de passe pour établir la session ssh.
ServerAliveInterval
- le nombre de secondes que le client attendra avant d'envoyer un message "en vie" au serveur pour maintenir la connexion active.
ServerAliveCountMax
- le nombre de messages "en vie" qui peuvent être envoyés sans réponse du serveur. Si ce seuil est atteint, ssh se déconnectera du serveur, mettant fin à la session.
ExitOnForwardFailure
- si défini sur "yes", la connexion sera terminée si ssh ne peut pas mettre en place toutes les translations de ports dynamiques, tunnel, locales et à distance demandées (par exemple, si une extrémité ne peut pas se lier et écouter sur un port spécifié).
foouser@
- Spécifie le compte utilisateur foouser
utilisé pour établir la session ssh de redirection de port distant avec le serveur .
Il vaut également la peine d'ajouter quelques options de configuration ssh au serveur (dans mon cas, sur mon VPS) ; en ajoutant le fichier suivant s'il n'existe pas déjà :
[foouser@vps ~]$ cat /home/foouser/.ssh/config
Host *
TCPKeepAlive yes
ClientAliveInterval 30
ClientAliveCountMax 9999
Remarque : vous pourriez remplacer le *
(qui signifie appliquer cette configuration à "tous les hôtes") par un hôte spécifique - Dans mon cas, mon NAS (c'est-à-dire l'hôte qui se connecte à mon VPS) est derrière mon routeur ; l'adresse IP publique de mon routeur change fréquemment car elle est attribuée en DHCP (par mon FAI) donc j'ai opté pour "tous les hôtes".
Processus SystemD (NAS Synology)
J'ai également cette commande (celle qui démarre le tunnel SSH en tant que processus systemd, si cela intéresse quelqu'un, voici le script :
foouser@nas:~$ cat /etc/systemd/system/sshtunnel-web.service
[Unit]
Description=Tunnel SSH pour WebStation
After=network.target
[Service]
Restart=always
RestartSec=1
User=foouser
ExecStart=/bin/ssh \
-NT \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=10 \
-o ExitOnForwardFailure=yes \
-i /var/services/homes/foouser/.ssh/id_rsa \
-R 8080:localhost:80 \
-R 4443:localhost:443 \
foouser@
[Install]
WantedBy=multi-user.target
Pour démarrer et activer le service du tunnel SSH :
foouser@nas:~$ sudo systemctl daemon-reload
foouser@nas:~$ sudo systemctl start sshtunnel-web.service
foouser@nas:~$ sudo systemctl enable sshtunnel-web.service
Cela a fonctionné de manière fiable pour moi pendant plusieurs mois. Cela inclut une fiabilité sur plusieurs redémarrages de mon routeur domestique, du serveur VPS et du NAS.
0 votes
Est-ce que votre tunnel est mort à cause de l'inactivité? J'ai rencontré ce problème lors du tunneling des ports depuis mon téléphone, j'ai donc finalement lancé des commandes factices sur la connexion pour le maintenir "actif" en utilisant la commande
watch
comme ceci :watch -n1 60 echo "wiiiii"
. Le tunnel ne mourra pas à moins que le réseau soit compromis ou que vous ne l'utilisiez pas.2 votes
Lié : unix.stackexchange.com/q/200239