自动重新连接TCP隧道

在两台机器之间有一个不可靠的networking连接:有时候活动的TCP连接因为我无法控制的原因而掉线。 我想在两台机器之间build立一个可靠的TCP连接

如果networking是可靠的,我只要运行ssh -L 1234:localhost:1234 remotehost ,服务器在远程主机上的端口1234上侦听,并将客户端指向localhost:1234 。 但是,如果SSH连接死亡,转发的连接也会死亡。 如何安排自动恢复客户端和服务器之间的连接?

非解决scheme:

  • 这不适用于交互式应用程序,因此屏幕不适用。
  • 这不仅仅是自动重新连接SSH隧道。 我想继续使用相同的隧道TCP连接,而不是启动一个新的连接。
  • 原则上,一个虚拟专用网将会诀窍。 但是,当我只想要一个TCP连接时,似乎有点过分,我想要一个解决scheme,即使我没有任何一方的root权限。

我对一个叫做“ rocks ”的程序有点模糊的记忆,但是它似乎已经从networking上掉下来了。 我主要对Linux感兴趣(尽pipe我希望这个级别的程序可以移植到其他unices),但是如果你知道QNX和VMS之间的程序,那就更好了。

旧的是一个无法维系的可靠sockets( 岩石 )你在找什么?

我知道这个function的唯一标准协议是MPTCP 。 它对于应用层是透明的,所以在MPTCP之上的SSH应该是正常的。 它可以通过不同IP的不同path运行底层TCP连接,所以原则上它可以用来根据VPN连接是否启动将SSH连接迁入和迁出VPN连接。

我不太了解MPTCP实现的成熟性,但协议的devise看起来相当强大。

它应该保护您的SSH连接不会因为片状networking连接而丢失。 它不会保护你免受想要破坏你的SSH连接的mitm。 mitm仍然可以注入损坏的数据,SSH将检测并中断连接。

在SSH协议中构build的类似于重新连接方法的MPTCP将是我可以想象的在最长的时间内保持连接的方法。 但我不认为这样的function是为SSH协议devise的。

你可以使用daemontools来保持ssh端口向前; 它不一定会保持程序依赖于活动时连接的活动(假设当ssh断开本地端口将开始拒绝它们的连接),但这是一个开始。

我怀疑有一些iptables技巧,比如一旦ssh向前消失就导致该端口丢包,所以连接程序只知道包正在消失,不被拒绝。 我只是自己学习daemontools所以我不知道在服务死后是否可以运行一个自定义的脚本,但我怀疑你可以。

TCP自动执行此操作。 您只需要禁用或削弱用于杀死垂死的TCP连接的典型的实际清理黑客。 为您的连接禁用TCP保持连接,并大大增加过多重新传输的限制。 例如,在Linux上,向/proc/sys/net/ipv4/tcp_retries2写入大量数据。

但是,在现代networking中,有状态的数据包检测防火墙可能会忘记TCP连接不能定期交换数据包,所以可能会在游行中下雨。