youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc
Plus tard :
you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc
you@homepc$ ssh youatwork@localhost -p 23456
Ce que vous pouvez faire est le suivant : à l'étape 1, faites avancer un port distant à partir du PC de bureau vers le serveur (12345
est utilisé à titre d'exemple, n'importe quel port >1024 fera l'affaire). Maintenant, en vous connectant au port 12345 sur le serveur, vous devriez vous connecter au port 22 sur officepc.
À l'étape 2, faites avancer le port 23456 de votre machine à domicile vers 12345 sur le serveur (d'où il est transmis à officepc:22, comme configuré à l'étape 1)
À l'étape 3, vous vous connectez au port local 23456 avec votre connexion au PC de bureau. Cela est transmis par l'étape 2 au port 12345 sur votre serveur, puis par l'étape 1 à votre PC de bureau.
Remarquez que j'utilise autossh pour les transferts, car c'est un wrapper ssh qui reconnecte automatiquement le tunnel en cas de déconnexion ; cependant, ssh normal fonctionnerait aussi, tant que la connexion ne se coupe pas.
Il existe une vulnérabilité potentielle : quiconque peut se connecter à localhost:12345 sur serverpc peut maintenant se connecter à officepc:22 et essayer de s'y introduire. (Remarquez que si vous exécutez un serveur SSH, vous devriez de toute façon le sécuriser au-dessus des protections de base qui sont activées par défaut ; je recommande au moins de désactiver la connexion root et de désactiver l'authentification par mot de passe - voir par exemple ceci)
Édition : J'ai vérifié cela avec la même configuration, et cela fonctionne. GatewayPorts no
n'affecte que les ports ouverts au monde entier, pas les tunnels locaux. Voici les ports transférés :
homepc :
sortie ssh vers serverpc:22
écoute localhost:23456 transmise à travers le tunnel ssh
serverpc :
écoute ssh à *:22
tunnel ssh entrant localhost (de homepc) transmis à localhost:12345
tunnel ssh local entrant (de officepc) transmis de localhost:12345
officepc :
sortie ssh vers serverpc:22
tunnel entrant localhost via ssh (de serverpc) transmis à localhost:22
Ainsi, du point de vue de la pile réseau, il s'agit de trafic local sur les interfaces de bouclage respectives (plus les connexions ssh vers serverpc) ; par conséquent, GatewayPorts
n'est pas du tout vérifié.
Cependant, il existe la directive AllowTcpForwarding
: si celle-ci est no
, cette configuration échouera car aucun transfert n'est autorisé du tout, même à travers l'interface de bouclage.
Avertissements :
-
si vous utilisez autossh et un ssh récent, vous voudrez peut-être utiliser ServerAliveInterval
et ServerAliveCountMax
de ssh pour maintenir le tunnel actif. Autossh a une vérification intégrée, mais apparemment elle a des problèmes sur Fedora. -M0
la désactive, et -oServerAliveInterval=20 -oServerAliveCountMax=3
vérifie si la connexion est active - essaie toutes les 20 secondes, si elle échoue 3 fois de suite, arrête ssh (et autossh en crée un nouveau) :
autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
-
il peut être utile de redémarrer le tunnel SSH si le transfert échoue, en utilisant -oExitOnForwardFailure=yes
- si le port est déjà lié, vous pourriez obtenir une connexion SSH fonctionnelle, mais aucun tunnel transmis.
-
l'utilisation de ~/.ssh/config
pour les options (et ports) est conseillée, sinon les lignes de commande deviennent trop verbeuses. Par exemple :
Hôte fwdserverpc
Nom d'hôte serverpc
Utilisateur notroot
ServerAliveInterval 20
ServerAliveCountMax 3
ExitOnForwardFailure yes
LocalForward 23456 localhost:12345
Ensuite, vous pouvez utiliser simplement l'alias du serveur :
autossh -M0 fwdserverpc