如果互联网短暂断开,保持 ssh 连接处于活动状态

如果互联网短暂断开,保持 ssh 连接处于活动状态

我雇主的无线网络经常掉线几秒钟。这将导致我不主动使用的 ssh 会话断开连接。有没有办法即使wifi短暂中断也能保持连接?

答案1

我也遇到了这个问题。在工作服务器上启动tmux会话,然后在重新建立连接后重新连接到它们,让我可以轻松地从上次中断的地方继续。

答案2

可能的解决方案是,根据您的 ssh 会话的目标以及您对它们的权限,在其上设置另一个接口,一个不会被关闭的接口。

您可以通过 VPN 来实现这一点。例如,要么是成熟的 VPN(openvpn、wireguard、商业 VPN),要么是基于ssh和构建的 VPN。tun

回答结束

现在,谈谈我的设置方式(还有很多很多其他的):

就我而言,接口现在只会出现故障,每隔几个小时就会出现另一个公共 IP 地址。我关心的会话属于单个网络上的主机,因此我的解决方案是一条隧道,其中一个tun设备位于我这边,另一个设备位于我想要访问的网络上。

只需一次,例如在启动时,在每一侧创建设备(您需要是 root):

ip tuntap add dev tun5 mode tun user youruser group yourgrup
ip address add 10.0.0.1/32 peer 10.0.0.2/32 dev tun5

(反转另一侧的地址)

然后使用该-w local_tun[:remote_tun]选项(在本例中-w 5:5)从您的主机正常连接到其他主机。您不再需要特殊权限,因为您tun为该用户/组创建了设备。

此时,您可以在备用地址 10.0.0.x 上的主机之间进行 ping 操作,并且可以在设备上设置策略、natting、路由和所有内容tun5,就像对任何其他网络设备所做的那样。

那么,当您的链接断开时会发生什么?那时,ssh链接两个tun设备的会话会终止,但tun设备本身不会终止,它们只会缓冲数据,一旦再次连接,流量就会恢复。

重新启动链接ssh会话会很乏味,而这正是autossh发挥作用的地方。它将在需要时重新启动该会话。

您只需确保您希望在断开连接后继续存在的进程正在使用该接口(无论是 IP、路由、NAT...)。整个设置可能看起来有点大材小用,但它甚至可以与 DDNS 客户端一起使用。 DNS 跟上更改后,会话将重新建立,并且使用tun设备的客户端将恢复。

答案3

一般来说,TCP 连接对于短时断开是稳定的 - 取决于设置,但我认为默认情况下,TCP 应该存活至少 60 秒。

但这是假设您的 IP 地址(/NAT 路由器的 IP 地址)不会改变。如果不是这种情况,那就不是 TCP 可以处理的事情。

对于这种不可靠的连接,有一个巧妙的工具,称为mosh,并且它擅长通过频繁的重新连接、IP 地址更改和其他干扰来保持 SSH 连接处于活动状态。

它通过在 UDP 之上实现与 TCP 不同的流量控制协议并在服务器上打开 UDP 套接字来实现这一点。因此,这要求您的远程主机能够打开 UDP 端口,这通常不是一个严格的限制。

答案4

您可以尝试设置 ~/.ssh/config 文件

Host *
    ServerAliveInterval 10
    ServerAliveCountMax 60

关于每个参数是什么的很好的解释,可以找到这里

相关内容