tcp-keepalive在ssh中如何工作?


84

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

到目前为止,我发现:

  • sshsshd的TCPKeepAlive是/否
  • ClientAliveCountMaxsshd的
  • ClientAliveIntervalsshd的
  • ServerAliveCountMaxSSH
  • ServerAliveIntervalSSH

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

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

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


这些参数全部用于以下情况:沿着连接的防火墙或中间设备将终止连接。这些参数用于发送定期数据以保持连接有效,还用于在有X个未决答复时关闭连接。您能提供您所做工作的更多细节吗?您是否正在使用ControlMaster选件并使用从属连接?
Patrick

我只想建立一种方法,使用几个具有几条物理线路的ssh网络连接来确定另一个节点是否“关闭”。我通过打开ssh-session(或多或少会产生无限循环)来完成此操作。如果连接断开,我希望该会话终止。我想知道TCPKeepalive的间隔/计数是多少。
尼尔斯2012年

Answers:


103

您可能要为此使用ServerAlive设置。它们不需要服务器上的任何配置,并且可以根据需要在命令行上进行设置。

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

这将每5秒发送一次ssh keepalive消息,如果是时候发送另一个keepalive了,但是没有收到对最后一个的响应,则连接终止。

ServerAliveInterval和之间的关键区别TCPKeepAlive是它们在其上运行的层。

  • TCPKeepAlive在TCP层上运行。它发送一个空的TCP ACK数据包。可以将防火墙配置为忽略这些数据包,因此,如果您通过的防火墙丢弃了空闲连接,则这些防火墙可能无法使连接保持活动状态。
  • ServerAliveInterval在ssh层上运行。它实际上将通过ssh发送数据,因此TCP数据包中已加密了数据,并且防火墙无法确定其是否为keepalive或合法数据包,因此它们工作得更好。

1
我认为这是正确的方向。初步测试表明,此方法可以正常工作-在连接断开后的5秒内,它将终止发送和接收ssh / sshd子进程。我认为TCPKeepalive只是使用TCP-stack-defaults-因此也很难配置。
尼尔斯2012年

这也解决了幻影用户问题。我相信这也可以在PuTTY设置中完成,Seconds between keepalives在“设置” |“设置”下更改为1800。连接。
鲍勃·斯坦

7

TCPKeepAlive选项实际上是与保持ClientAlive或ServerAlive的选项保持连接活动的方法截然不同的方法。

BSD SSH手册页上,我们可以看到:

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.