我正在创建从客户端到服务器的隧道,例如:
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
如果您希望为每个用户设置这些设置,则可以将这些设置放在一个块内。