自动重新连接TCP隧道


9

我的两台计算机之间的网络连接不可靠:有时活动的TCP连接由于我无法控制的原因而掉线。我想在两台机器之间建立可靠的TCP连接

如果网络可靠,我将运行ssh -L 1234:localhost:1234 remotehost,服务器侦听端口1234 remotehost,并将客户端指向localhost:1234。但是,如果ssh连接断开,则转发连接也将断开。如何安排自动恢复客户端和服务器之间的连接?

非解决方案:

  • 这不适用于交互式应用程序,因此屏幕不适用。
  • 这不只是自动地重新连接一个SSH隧道,拉autossh。我想继续使用相同的隧道式TCP连接,而不是开始新的连接。
  • 原则上,VPN可以解决问题。但是,当我只想要一个TCP连接时,这似乎有些矫kill过正,而且我希望即使我在任一端都没有root权限,该解决方案也能起作用。

我对一个叫做rocks那样的程序记忆犹新,但这似乎已经从网络上消失了。我对双方都对Linux最感兴趣(尽管我希望这个级别的程序可以移植到其他unices上),但是如果您知道一个在QNX和VMS之间工作的程序,那就更好了。


Gilles,您是否通过ssh连接使用tcp keepalive?如果没有,赶快试试这个第一......一些NAT实现时间连接了
迈克·潘宁顿

@麦克:谢谢你的提示。我没有迫切需要,但我既遇到了一些中间路线来去去去的情况(因此TCP Keepalive弊大于利),也遇到了NAT使我超载而丢下我的情况(因此TCP Keepalive可能会有所帮助)。无论如何,TCP保持连接对于连续流都无关紧要(例如scp),对吗?无论如何,我都想保持这种概括:下次当我遇到任何口味的片状网络时,我该怎么办?
吉尔(Gilles)'所以

吉尔斯(Gilles),对于像这样的恒定流,解决方案是不同的scp。我根据您的端口转发示例响应ssh keepalive。回复:不稳定的下游跃点,除了创建一个具有宽容的keepalive的ssh会话(即使用ServerAliveInterval > 0和允许更多丢弃的keepalive ServerAliveCountMax > 3)之外,您无能为力。NAT需要较低的Keepalive间隔。关键问题是确定问题所在并进行相应调整。放置选项,.ssh/config使它们随时为您服务
Mike Pennington

@Mike:我的用例之一包括客户端从过载的NAT获取IP,而不是随机丢弃甚至是活动的连接(认为P2P比应该有的多)。几秒钟后,客户端设法重新连接,但可能会获得其他IP地址。在这种情况下,TCP连接将无法生存。Rocks可以应付,但是我更喜欢在当今系统上可以直接使用的编译功能。
吉尔(Gilles)'所以

在NAT给你新的IPS的情况下,有没有什么可以比获得NAT固定或另一个希望做rocks执行......尽管这显然是一个真正的杂牌
迈克·潘宁顿

Answers:


5

您正在寻找旧的未维护的可靠插座(Rocks)吗?


1
谢谢,岩石确实是我想起的。当然,我希望保留一些东西。
吉尔(Gilles)'所以

@ Gilles'SO-stopbeingevil'不但不需要维护,而且似乎已经完全摆脱了互联网的面貌!
Michael

1

我知道具有此功能的唯一标准协议是MPTCP。它对应用程序层是透明的,因此MPTCP之上的SSH应该可以正常工作。它可以在具有不同IP的不同路径上运行基础TCP连接,因此,原则上,它可以用于将SSH连接迁移到VPN连接中以及从VPN连接中迁移出来,具体取决于VPN连接是否建立。

我对MPTCP实现的成熟程度了解不多,但是协议的设计看起来相当健壮。

它应该保护您的SSH连接不因不稳定的网络连接而丢失。它不会保护您免受想要断开SSH连接的攻击。mitm仍然可以注入损坏的数据,SSH会检测到该数据并断开连接。

我可以想象,SSH协议中内置的类似于MPTCP的重新连接方法将是使连接保持尽可能长的生存时间的方法。但是我不认为这种功能是为SSH协议设计的。


0

您可以daemontools用来保持ssh端口向前。它不一定会在连接断开时根据连接保持活动状态(因为ssh断开本地端口连接时,它将开始拒绝其连接),但这只是一个开始。

我怀疑有一些iptables技巧,例如在ssh转发消失后立即导致该端口丢弃数据包,因此连接程序只知道数据包正在消失,不会被拒绝。我只是在重新学习daemontools自己,所以不确定在服务终止时是否可以运行自定义脚本,但是我怀疑可以。


-2

TCP自动执行此操作。您只需要禁用或削弱用于终止垂死的TCP连接的典型实用清理技巧即可。对您的连接禁用TCP keepalive,并大大增加了过度重传的限制。例如,在Linux上,将大量写入/proc/sys/net/ipv4/tcp_retries2

但是,在现代网络中,有状态的数据包检查防火墙可能会忘记无法定期交换数据包的TCP连接,因此可能会使您的游行队伍下雨。


1
只要每个端点都有一个静态IP地址并且没有有状态的中间盒,TCP就可以处理这种情况。问题提到了reasons beyond my control,我将其称为动态IP或有状态中间盒。在这种情况下,TCP keepalive可以有所帮助。但是,无论如何配置TCP Keepalive,当中间盒由于重新启动而丢失状态时,仅通过这种方式不足以保持连接有效。
kasperd 2014年

@kasperd,我同意。但是,在这种情况下尝试保持TCP连接打开是徒劳的。因此,我假设发问者没有面临那些特殊的挑战。
aecolley 2014年

如果您控制两个端点并可以将它们升级到具有MPTCP支持的堆栈,那将是徒劳的。另外,可以在TCP之上实现应用层解决方案,而无需MPTCP。
kasperd 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.