J'ai une connexion réseau non fiable entre deux machines: parfois les connexions TCP actives sont interrompues pour des raisons indépendantes de ma volonté. Je veux établir une connexion TCP fiable entre les deux machines.
Si le réseau était fiable, je courrais simplement ssh -L 1234:localhost:1234 remotehost
, avec le serveur écoutant sur le port 1234 remotehost
, et pointerais le client localhost:1234
. Mais si la connexion ssh meurt, la connexion transférée le sera également. Comment organiser la restauration automatique de la connexion entre le client et le serveur?
Non-solutions:
- Ce n'est pas pour les applications interactives, donc l' écran ne s'applique pas.
- Il ne s'agit pas seulement de reconnecter automatiquement un tunnel SSH, la autossh . Je veux continuer à utiliser la même connexion TCP tunnelée, pas en démarrer une nouvelle.
- En principe, un VPN ferait l'affaire. Mais il semble exagéré quand je veux juste une connexion TCP, et j'aimerais une solution qui fonctionne même si je n'ai pas d'autorisations root de chaque côté.
J'ai une faible mémoire d'un programme appelé rocks
qui a fait exactement cela, mais il semble être tombé du visage du Web. Je suis principalement intéressé par Linux des deux côtés (même si je m'attendrais à ce qu'un programme à ce niveau soit portable pour d'autres unités), mais si vous connaissez un programme qui fonctionne entre QNX et VMS, tant mieux.
scp
. Je répondais w / ssh keepalives basé sur votre exemple de transfert de port. Re: saut en aval instable, il n'y a pas grand-chose que vous puissiez faire, à part créer une session ssh avec des keepalives plus tolérantes (c'est-à-dire permettre plus de keepalives abandonnées avecServerAliveInterval > 0
etServerAliveCountMax > 3
). NAT nécessite des intervalles de conservation inférieurs. La question clé est d'identifier quel est le problème et de l'adapter en conséquence. Mettez les options.ssh/config
pour qu'elles soient toujours là pour vousrocks
implémentation ... bien que ce soit évidemment un vrai coup de foudreRéponses:
Est-ce que le vieux un Reliable Sockets ( Rocks ) non entretenu que vous recherchez?
la source
Le seul protocole standard que je connaisse avec cette capacité est MPTCP . Il est transparent pour la couche application, donc SSH au-dessus de MPTCP devrait simplement fonctionner. Il peut exécuter les connexions TCP sous-jacentes sur différents chemins avec différentes IP, donc en principe, il pourrait être utilisé pour migrer votre connexion SSH vers et depuis la connexion VPN selon que la connexion VPN est établie.
Je ne sais pas grand-chose sur la maturité des implémentations MPTCP, mais la conception du protocole semble assez robuste.
Il devrait protéger vos connexions SSH de se perdre en raison de la connectivité réseau fragile. Il ne vous protégera pas contre un mitm qui veut rompre votre connexion SSH. Un mitm peut toujours injecter des données corrompues, que SSH détectera et rompra la connexion.
Une méthode de reconnexion de type MPTCP intégrée au protocole SSH serait la méthode que j'imagine garder une connexion vivante le plus longtemps possible. Mais je ne pense pas qu'une telle fonctionnalité ait été conçue pour le protocole SSH.
la source
Vous pouvez utiliser
daemontools
pour garder le port ssh en avant; il ne gardera pas nécessairement les programmes en fonction de la connexion en vie (comme probablement lorsque ssh se déconnecte, le port local commencera à refuser leurs connexions), mais c'est un début.Je soupçonne qu'il y a quelques
iptables
astuces, comme faire en sorte que ce port supprime les paquets dès que le ssh forward disparaît, de sorte que les programmes de connexion savent juste que les paquets disparaissent, sans être refusés. Je suis juste en train dedaemontools
m'apprendre (encore une fois), donc je ne sais pas si vous pouvez exécuter un script personnalisé lorsqu'un service meurt, mais je pense que vous le pouvez.la source
TCP le fait automatiquement. Vous avez seulement besoin de désactiver ou d'affaiblir les hacks de nettoyage pratiques typiques utilisés pour tuer les connexions TCP moribondes. Désactivez TCP keepalive pour votre connexion et augmentez considérablement la limite des retransmissions excessives. Sous Linux, par exemple, écrivez un grand nombre dans
/proc/sys/net/ipv4/tcp_retries2
.Cependant, dans un réseau moderne, un pare-feu d'inspection des paquets avec état est susceptible d'oublier une connexion TCP qui ne parvient pas à échanger des paquets régulièrement, il peut donc pleuvoir sur votre défilé.
la source
reasons beyond my control
, que je lis comme IP dynamique ou boîtiers intermédiaires avec état. Dans de tels scénarios, TCP keepalive peut aider un peu. Mais peu importe la façon dont vous configurez TCP keepalive, il ne suffira pas de maintenir la connexion en vie lorsqu'un état de perte du boîtier de médiation en raison du redémarrage.