通过唤醒和挂起计算机来保持 SSH 连接持久

通过唤醒和挂起计算机来保持 SSH 连接持久

以下是我的信息:

  • 我有一个 SSH 连接用作 SOCKS5 代理。每次我用电脑唤醒时都必须重新初始化它,这很烦人。

  • 我已经设置ServerAliveInterval60in ~/.ssh/config.我没有权限添加ClientAliveInterval,即使我添加了也会产生完全相同的效果。

  • 我收到的具体错误消息是“管道损坏”。screen或者tmux在这里没有帮助,我每次都必须附加,这让我们回到了 numero uno。

  • autossh似乎不起作用。我运行autossh -M 0 -DPORT alias并在任务管理器中看到它,但 SSH 连接似乎没有重新启动,甚至在等待 5 分钟后也没有。

我读过很多问题,说要使用上述三个选项之一,但没有一个涉及唤醒和挂起。我无法将其放入某些 bash 初始化脚本中,因为我只希望它发生一次(当我登录计算机时)。但同时,我希望我的 SSH 连接在我使用计算机时断开时仍保持活动状态。我利用哪些效果组合来实现我的目标?

答案1

连接持久性

持久连接需要服务器端的支持。这在当前的 openssh 服务器中不可用(并且看起来也不会)。

客户端部分是几年前实现的,著名的UseRoaming该功能几周前已从 openssh 中删除。该功能从未起作用,并且是一大安全漏洞。它可能适用于appgate.comSSH 服务器,但我第一次听说这个漏洞。

客户端/服务器活动间隔仅在 TCP 保持活动期间有效,当然,如果您在挂起和唤醒之间没有更改 IP 地址的话。

网络启动后的脚本

我会考虑针对您的情况使用ifup脚本(在网络接口启动后运行的脚本)的解决方案。它可能看起来像这样/sbin/ifup-local,您可以在其中启动 SOCKS5:

#!/bin/sh
if [[ "$1" == "eth0" ]]
then
  ssh -DPORT alias
else
  #DO_NOTHING
fi

不要忘记使脚本可执行sudo chmod +x /sbin/ifup-local。您还可以向该脚本添加更多检查和内容,区分网络接口或其他内容。来源

答案2

(有点离题的答案,但它可能对你的情况有用)

您可以尝试通过基于 UDP 的 OpenVPN 运行 ssh(如果您的防火墙允许)。这种方法是有效的,尽管重新连接时的延迟相当大(一分钟左右)。

但是,如果您能够使用它,请尝试莫什。它从一开始就考虑了连接持久性。

相关内容