自动重新连接 TCP 隧道

自动重新连接 TCP 隧道

我在两台机器之间建立了不可靠的网络连接:有时,活动的 TCP 连接会因我控制范围之外的原因而断开。我想建立一个可靠的 TCP 连接两台机器之间。

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

非解决方案:

  • 这不是用于交互式应用程序的,因此屏幕不适用。
  • 这不仅仅是自动重新连接 SSH 隧道,自动SSH。我想继续使用相同的隧道 TCP 连接,而不是启动新的连接。
  • 原则上,VPN 可以解决问题。但是,当我只想要一个 TCP 连接时,这似乎有点过头了,我想要一个即使我两边都没有 root 权限也能正常工作的解决方案。

我依稀记得有一个程序就是rocks这么做的,但它似乎已经从网上消失了。我最感兴趣的是 Linux 的两面性(尽管我希望这种级别的程序可以移植到其他 unices 上),但如果你知道一个可以在 QNX 和 VMS 之间运行的程序,那就更好了。

答案1

旧的、未维护的可靠套接字 (岩石) 您在寻找什么?

答案2

我所知道的唯一具有此功能的标准协议是多协议TCP。它对应用层是透明的,因此 MPTCP 上的 SSH 应该可以正常工作。它可以通过具有不同 IP 的不同路径运行底层 TCP 连接,因此原则上它可用于根据 VPN 连接是否启动将 SSH 连接迁移进出 VPN 连接。

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

它应该可以保护您的 SSH 连接,避免因网络连接不稳定而丢失。但它无法保护您免受想要破坏 SSH 连接的中间人攻击。中间人攻击仍然可以注入损坏的数据,SSH 会检测到并破坏连接。

我能想到的方法是将 MPTCP 之类的重新连接方法内置到 SSH 协议中,从而让连接保持最长的存活时间。但我不认为这样的功能是为 SSH 协议设计的。

答案3

您可以使用它daemontools来保持 ssh 端口向前运行;当连接断开时,它不一定会使依赖于该连接的应用程序保持活动状态(因为当 ssh 断开连接时,本地端口可能会开始拒绝它们的连接),但这是一个开始。

我怀疑其中存在一些iptables技巧,比如让该端口在 ssh 转发消失后立即丢弃数据包,这样连接程序就只知道数据包正在消失,而不是被拒绝。我刚刚daemontools(再次)开始学习,所以我不确定当服务停止时您是否可以运行自定义脚本,但我怀疑您可以。

答案4

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

然而,在现代网络中,状态包检查防火墙可能会忘记无法定期交换数据包的 TCP 连接,因此可能会给您的进展带来不利影响。

相关内容