检测卡住的 SSH 控制主套接字

检测卡住的 SSH 控制主套接字

我使用 OpenSSH 的ControlMaster 功能大大加快了我大量使用的几个系统的新连接的速度。

我的 中有以下内容~/.ssh/config

Host *
    ConnectTimeout 7
    ControlMaster auto                   
    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlPersist 10m    

一般来说,这种方法效果很好。但是,有一个主要麻烦:如果主机的 ControlMaster 套接字由于网络中断而“挂起”,ssh that_host永远挂起据我所知,它实际上从未放弃现有的 ControlMaster 套接字并尝试创建一个新的。我必须手动操作ssh -O exit that_host才能使其工作。

我真正希望能够说服ssh大家放弃并拆除 ControlMaster 插座,如果它无法在ConnectTimeout.

是否有ControlMasterConnectTimeout我遗漏的选项?或者我可以通过其他方式让 ssh 检测并重新启动已死的 ControlMaster 套接字?

答案1

总结

Host *
    ServerAliveInterval 11

我猜测ConnectTimeout这里不适用因为主机已经连接。

这并不是特定的,ControlMaster但您可以轻松地将其应用于配置中的相关条目。

您可以使用两种不同的方法来检测陈旧连接:

  • TCPKeepAlive使用底层套接字中的机制。
  • ServerAliveInterval(直至ServerAliveCountMax连续失败)

我喜欢后者,因为可能还有其他损坏/挂起的东西会被捡起来,而且手册中也提到了欺骗的可能性。

显然,您可以选择其他数字。此变量与ServerAliveCountMax(默认值 3)的组合将确定何时断开连接,因此我看到在断开 vpn 连接后大约 33 秒内问题消失(我没有准确测量这一点,并注意到一个会话花费的时间更长,但我全局应用了此设置,也许我应该只将其应用于我使用的主机ProxyJump)。

相关内容