我正在尝试编写一个使用 ssh 连接来执行“心跳”的 shell 脚本。我想在一定的超时后(连接断开后)终止该连接的客户端和服务器端。
到目前为止我发现了什么:
- TCP保活是/否对于SSH和sshd
- 最大客户端存活数为了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 在断开客户端连接之前客户端活动消息的数量,方法是终止会议。