tcp-keepalive 在 ssh 中如何工作?

tcp-keepalive 在 ssh 中如何工作?

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

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

  • TCP保活是/否对于SSHsshd
  • 最大客户端存活数为了sshd
  • 客户端活动间隔为了sshd
  • 服务器最大活动计数为了SSH
  • 服务器活动间隔为了SSH

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

所以我的问题是 - 我也可以使用“TCPKeepAlive”来达到我的目的(无需更改源/目标计算机上的其他任何内容)吗?

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

答案1

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

ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST

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

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

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

答案2

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

均按BSD SSH 手册页,我们可以读到:

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

确定TCPKeepAlive系统是否应该向对方发送TCP keepalive 消息。默认选项始终启用。

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

相关内容