在两台机器之间有一个不可靠的networking连接:有时候活动的TCP连接因为我无法控制的原因而掉线。 我想在两台机器之间build立一个可靠的TCP连接 。
如果networking是可靠的,我只要运行ssh -L 1234:localhost:1234 remotehost ,服务器在远程主机上的端口1234上侦听,并将客户端指向localhost:1234 。 但是,如果SSH连接死亡,转发的连接也会死亡。 如何安排自动恢复客户端和服务器之间的连接?
非解决scheme:
我对一个叫做“ 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连接不能定期交换数据包,所以可能会在游行中下雨。