J'utilise un tunnel SSH depuis le travail pour contourner divers pare-feu idotiques (ça va avec mon patron :)). Le problème, c’est qu’après un certain temps, la connexion SSH se bloque et que le tunnel est rompu.
Si je pouvais au moins surveiller le tunnel automatiquement, je pourrais le redémarrer quand il se bloque, mais je n'ai même pas trouvé le moyen de le faire.
Des points bonus pour celui qui peut me dire comment empêcher ma connexion SSH de rester suspendue, bien sûr!
watch
commande comme:watch -n1 60 echo "wiiiii"
. Le tunnel ne mourra pas sauf si le réseau est en panne ou si vous ne l'utilisez pas.Réponses:
On dirait que vous avez besoin d' autossh . Ceci surveillera un tunnel ssh et le redémarrera au besoin. Nous l'utilisons depuis quelques années et cela semble bien fonctionner.
Plus de détails sur le paramètre -M ici
la source
autossh
dans la réponse?autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 [email protected]
Vous remarquerez peut-être que j'ai configuré cela à l'aide de -nNT, qui ne crée pas de terminal distant, ce qui me permet de placer autossh en arrière-plan, et l'option -i permettant à SSH d'utiliser un fichier .pem. Si vous souhaitez garder une connexion ouverte tout le temps, je vous recommande vivement de passer par la configuration supplémentaire.-M
paramètre: bugs.debian.org/cgi-bin/bugreport.cgi?bug=351162Tous les pare-feu avec état oublient une connexion après ne pas avoir vu un paquet pour cette connexion pendant un certain temps (pour éviter que les tables d'état ne se remplissent de connexions où les deux extrémités sont mortes sans fermer la connexion). La plupart des implémentations TCP envoient un paquet keepalive après une longue période sans avoir à entendre de l'autre côté (2 heures est une valeur commune). Si, toutefois, il existe un pare-feu avec état qui oublie la connexion avant que les paquets keepalive puissent être envoyés, une connexion longue durée mais inactive mourra.
Si tel est le cas, la solution consiste à éviter que la connexion ne devienne inactive. OpenSSH a une option appelée ServerAliveInterval qui peut être utilisée pour empêcher la connexion de rester inactive pendant trop longtemps (en prime, elle détectera le moment où l'homologue est décédé plus tôt, même si la connexion est inactive).
la source
Sur votre propre ordinateur Mac ou Linux, configurez votre SSH pour maintenir le serveur SSH en vie toutes les 3 minutes. Ouvrez un terminal et installez votre .ssh invisible chez vous:
puis créez un fichier de configuration d'une ligne avec:
vous devriez aussi ajouter:
la valeur par défaut est 3; ServerAliveInterval 180 cesse alors d'envoyer des messages après 9 minutes (3 des 3 minutes spécifiées par ServerAliveInterval).
la source
ServerAliveInterval 180
nous donne 6 minutes? intuition me fait essayer ceci:180/60 == 3
. Alors, est-ce queServerAliveInterval
travailler en multiples de 30 secondes?J'ai utilisé le script Bash suivant pour continuer à générer de nouveaux tunnels SSH lorsque le précédent est mort. L'utilisation d'un script est pratique lorsque vous ne voulez pas ou ne pouvez pas installer de paquets supplémentaires ni utiliser le compilateur.
Notez que cela nécessite un fichier de clés pour établir la connexion automatiquement, mais c'est également le cas avec autossh.
la source
Systemd convient parfaitement pour cela.
Créez un fichier de service
/etc/systemd/system/sshtunnel.service
contenant:(Modifiez la commande ssh à votre convenance)
sshtunnel
alors assurez-vous que cet utilisateur existe en premiersystemctl enable sshtunnel
de le configurer pour démarrer au démarragesystemctl start sshtunnel
pour commencer immédiatementMise à jour janvier 2018 : certaines distributions (par exemple Fedora 27) peuvent utiliser la stratégie SELinux pour empêcher l'utilisation de SSH à partir de systemd init. Dans ce cas, une stratégie personnalisée devra être créée pour fournir les exemptions nécessaires.
la source
systemd
système. Si l’on utiliseRestart=on-failure
alors tuer manuellement le client SSH n’entraînera pas un redémarrage par système en tant que client SSH avec une sortie réussie.ExecStart
par exemple pour construire lassh
liste d'arguments, effectuez les vérifications de base, puis appelez-le à partir du script de la manière suivanteexec /bin/ssh -N ...
. Voici ma commande:exec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}"
oùTUNNEL_INLET="127.0.0.1:3307"
etTUNNEL_OUTLET="127.0.0.1:3306"
Il me semble que vous interprétez mal ServerAliveCountMax. Si je comprends bien la documentation, c'est le nombre de messages actifs du serveur qui peuvent rester sans réponse sans que la connexion soit interrompue. Donc, dans les cas comme ceux dont nous discutons ici, définir une valeur élevée garantira simplement qu’une connexion bloquée ne sera ni détectée ni interrompue!
Le simple fait de définir ServerAliveInterval devrait suffire à résoudre le problème avec un pare-feu qui oublie la connexion. Si vous laissez ServerAliveCountMax low, l’auteur de l’origine peut constater l’échec et s’arrêter si la connexion échoue quand même.
Ce que vous souhaitez, c’est 1) que la connexion reste ouverte en permanence dans des circonstances normales, 2) que l’échec de la connexion soit détecté et que le côté d’origine quitte en cas d’échec, et 3) que la commande ssh soit ré-émise chaque fois exits (la manière dont vous faites cela dépend beaucoup de la plate-forme, le script "while true" suggéré par Jawa est un moyen, sous OS XI, de configurer un élément de lancement).
la source
Utilisez toujours l'
ServerAliveInterval
option SSH dans le cas où les problèmes de tunnel sont générés par des sessions NAT expirées.Utilisez toujours une méthode de réapparition au cas où la connectivité cesserait complètement, vous avez au moins trois options ici:
while true do ssh ...; sleep 5; done
) ne supprime pas la commande de veille,ssh
risque d'échouer rapidement et de réapparaître trop de processus/etc/inittab
, pour avoir accès à une boîte livrée et installée dans un autre pays, derrière NAT, sans transfert de port vers la boîte, vous pouvez le configurer pour créer un tunnel ssh de nouveau à vous:script de démarrage sur Ubuntu, où
/etc/inittab
n'est pas disponible:ou utilisez toujours les deux méthodes.
la source
J'ai résolu ce problème avec ceci:
Modifier
Et ajouter
Selon la page de manuel de ssh_config:
la source
ExitOnForwardFailure yes
est un bon complément aux autres suggestions. S'il se connecte mais ne peut pas établir la redirection de port, il est tout aussi inutile pour vous que s'il ne s'était pas connecté du tout.la source
J'ai eu besoin de maintenir un tunnel SSH à long terme. Ma solution fonctionnait à partir d'un serveur Linux, et il ne s'agit que d'un petit programme en C qui rappelle ssh en utilisant l'authentification par clé.
Je ne suis pas sûr de la pendaison, mais des tunnels sont morts suite à des délais trop longs.
J'adorerais fournir le code au répondant, mais je n'arrive pas à le trouver pour le moment.
la source
Bien qu'il existe des outils comme autossh qui aident à redémarrer la session SSH ... ce que je trouve vraiment utile, c'est de lancer la commande "screen". Il vous permet de reprendre vos sessions SSH même après votre déconnexion. Particulièrement utile si votre connexion n’est pas aussi fiable qu’elle devrait l’être.
... n'oubliez pas de cocher la réponse "correcte" si cela vous aide à k! ;-)
la source
Un peu de bidouille, mais j'aime bien utiliser screen pour le garder. J'ai actuellement une avance à distance qui fonctionne depuis des semaines.
Exemple, en commençant localement:
Lorsque le transfert à distance est appliqué et que vous avez un shell sur l'ordinateur distant:
Vous avez maintenant un transfert à distance ininterrompu. L'astuce consiste à lancer l'écran des deux côtés
la source
J'ai récemment eu ce problème moi-même, car ces solutions vous obligent à ressaisir le mot de passe chaque fois que vous utilisez un identifiant de mot de passe. J'ai utilisé sshpass dans une boucle avec une invite de texte pour éviter d'avoir le mot de passe dans le fichier de commandes.
Je pensais partager ma solution sur cette thead au cas où quelqu'un d'autre aurait le même problème:
la source
J'ai eu des problèmes similaires avec mon précédent fournisseur de services Internet. Pour moi, c'était la même chose avec n'importe quelle connexion TCP, visite de sites Web ou envoi de courrier.
La solution consistait à configurer une connexion VPN sur UDP (j'utilisais OpenVPN). Cette connexion était plus tolérante vis-à-vis de la cause des déconnexions. Ensuite, vous pouvez exécuter n'importe quel service via cette connexion.
Il peut toujours y avoir des problèmes avec la connexion, mais puisque le tunnel sera plus tolérant, toute session SSH ressentira un bref blocage plutôt que d'être déconnectée.
Pour ce faire, vous aurez besoin d’un service VPN en ligne que vous pouvez configurer sur votre propre serveur.
la source
Comme
autossh
cela ne répond pas à nos besoins (il existe une erreur s'il ne parvient pas à se connecter au serveur dès la première tentative), nous avons écrit une application pure bash: https://github.com/aktos-io/link- avec serveurIl crée un tunnel inverse pour le port sshd (22) du NODE sur le serveur par défaut. Si vous devez effectuer d'autres actions (telles que le transfert de ports supplémentaires, l'envoi de mails en connexion, etc.), vous pouvez placer vos scripts
on-connect
et voson-disconnect
dossiers.la source