我正在创建从客户端到服务器的隧道,例如:
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
客户端连接消失后,如何让服务器关闭端口?
服务器不知道客户端连接消失了!
客户端知道这一点,因为你有 ServerAliveCountMax,所以当它不再接收来自服务器的消息时它会正确退出。但是它无法通知服务器它已经退出(因为你的以太网仍然没有插上,所以即使是 TCP RST 也无法通过)。
由于 TCPKeepAlive 处于活动状态,服务器最终会注意到客户端的缺席,但这需要更长的时间才能启动 - 可能需要几分钟。
要使这项工作与您想要的快速超时一起工作,您需要在服务器上进行类似的设置。编辑
/etc/ssh/sshd_config
以包括(例如)这些设置:Match
如果您想让它们成为每个用户,这些设置可以在一个块内。