首先我知道@TCZ 之前问过这个问题:当反向 ssh 隧道突然/不干净地断开连接时,如何释放 SSH 服务器上的端口?
但我认为@clement 的回答不太优雅,因为它会影响其他用户。
当我检查时:
sudo netstat -anp|grep 4000
tcp 0 0 0.0.0.0:4000 0.0.0.0:* LISTEN 14751/sshd: xx
tcp 0 0 xx.xx.xx.xx:4000 183.136.170.162:56097 CLOSE_WAIT 14751/sshd: xx
tcp6 0 0 :::4000 :::* LISTEN 14751/sshd: xx
我看到服务器仍然监听这个转发端口:4000。并且由于客户端突然中断,服务器连接被更改为“CLOSE_WAIT”状态。
我尝试使用客户端“close”函数来更改此状态,但仍然没有改变。我猜是因为 ssh 隧道断开后服务器无法接收信号,但我不知道如何向已断开连接的套接字发送 FIN 信号。
那么有人能告诉我在这种情况下客户端如何重新连接 ssh 隧道吗?希望我能解释清楚。
答案1
首先,sshd
“仍在监听此转发端口:4000”是一个从守护进程派生出来的进程sshd
。此进程负责断开的 SSH 连接(及其隧道),而不是整个 SSH 服务器。
如果您知道 SSH 客户端突然消失,您可以终止该进程(示例中的 PID 为 14751)。这不会终止 SSH 服务器。监听sshd
传入 SSH 连接的守护进程是另一个进程。
一般来说,你不需要 root 权限就可以杀死它sshd
,它在使用它登录的用户下运行(比较这个答案,即“实际使用中 / SSH”部分)。用户可以再次登录(不转发端口)并终止过时的进程。这将释放端口 4000。然后他们可以重新请求端口转发。
这回答你提到的可以提供帮助。您可以使用ClientAliveCountMax
和ClientAliveInterval
使将来的类似情况自动解决。
答案不太优雅,因为它会影响其他用户。
用一个条件块 ( Match
) 在sshd_config
将修改的参数仅分配给一个特定用户。