当 ssh 命令消失时,如何在 ssh 服务器上关闭远程 ssh 隧道端口?

当 ssh 命令消失时,如何在 ssh 服务器上关闭远程 ssh 隧道端口?

我正在创建从客户端到服务器的隧道,例如:

ssh -N \
  -o ConnectTimeout=9 \
  -o ServerAliveInterval=5 \
  -o ServerAliveCountMax=1 \
  -o ExitOnForwardFailure=yes \
  -R 0.0.0.0:10021:localhost:22  \
  [email protected]

如果我拔掉客户端以太网,它就会超时:

Timeout, server example.com not responding.

如果我立即尝试重新连接,它会显示:

Error: remote port forwarding failed for listen port 10021

这是因为服务器仍然显示:

sudo netstat -tnlpa | grep 10021
tcp        0      0 0.0.0.0:10021           0.0.0.0:*               LISTEN      30173/sshd: foo

如何让服务器sshd在客户端连接消失时立即关闭端口?

答案1

服务器不知道客户端连接消失了!

客户端知道这一点,因为您有 ServerAliveCountMax,因此当它不再从服务器接收消息时,它会正确退出。但它没有办法通知服务器它已经退出(因为你的以太网仍然没有插上,所以即使 TCP RST 也无法通过)。

服务器将最终注意由于 TCPKeepAlive 处于活动状态而导致客户端缺失,但这将需要更长的时间才能启动 - 可能需要几分钟。

为了实现您想要的快速超时功能,您需要一个类似的设置在服务器上. 编辑/etc/ssh/sshd_config以包括(例如)这些设置:

ClientAliveInterval 5
ClientAliveCountMax 1

Match如果您希望为每个用户设置这些设置,则可以将这些设置放在一个块内。

相关内容