tcp-keepalive 如何在 ssh 中工作?

Nil*_*ils 101 ssh tcp cluster sshd

我正在尝试编写一个使用 ssh 连接进行“心跳”的 shell 脚本。我想在某个超时后(连接断开后)终止该连接的客户端和服务器端。

到目前为止我发现了什么:

  • sshsshd 的TCPKeepAlive是/否
  • ClientAliveCountMaxsshd的
  • ClientAliveIntervalsshd的
  • 用于ssh 的ServerAliveCountMax
  • ServerAliveIntervalSSH

要更改“ClientAliveCountMax”,我必须修改每台目标计算机上的 sshd_config(默认情况下禁用此选项)。

所以我的问题是 - 我是否也可以将“TCPKeepAlive”用于我的目的(无需更改源/目标机器上的任何其他内容)?

目标操作系统是 SLES11 SP2 - 但我认为这与此处无关。

phe*_*mer 129

您可能希望为此使用 ServerAlive 设置。它们不需要在服务器上进行任何配置,如果您愿意,可以在命令行上进行设置。

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST
Run Code Online (Sandbox Code Playgroud)

这将每 5 秒发送一次 ssh keepalive 消息,如果需要发送另一个 keepalive 消息,但未收到对最后一个的响应,则连接终止。

ServerAliveInterval和之间的关键区别在于TCPKeepAlive它们运行的​​层。

  • TCPKeepAlive在 TCP 层上运行。它发送一个空的 TCP ACK 数据包。防火墙可以配置为忽略这些数据包,因此如果您通过丢弃空闲连接的防火墙,这些可能无法保持连接活动。
  • ServerAliveInterval在ssh层操作。它实际上会通过 ssh 发送数据,因此 TCP 数据包已加密数据,防火墙无法判断它是保活数据包还是合法数据包,因此它们会更好地工作。


ken*_*orb 9

TCPKeepAlive选项实际上是一种与 ClientAlive-like 或 ServerAlive-like 选项保持连接活动的非常不同的方法。

根据BSD SSH 手册页,我们可以阅读:

客户端活动消息通过加密通道发送,因此不会被欺骗。启用的 TCP keepalive 选项TCPKeepAlive是可欺骗的。当客户端或服务器依赖于知道连接何时变为非活动状态时,客户端活动机制很有价值。

TCPKeepAlive化妆确保系统是否应该发送TCP keepalive消息给对方。默认选项始终处于启用状态。

如果您正在使用ClientAliveInterval,则可以禁用TCPKeepAlive。此选项将通过加密通道发送消息以请求客户端的响应(默认为 0,因此不会向客户端发送消息)并ClientAliveCountMax通过终止 sshd 断开客户端连接之前设置客户端活动消息的数量会议。