客户端意外关闭时 SSH 隧道服务器无法关闭监听端口

客户端意外关闭时 SSH 隧道服务器无法关闭监听端口

首先我知道@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。然后他们可以重新请求端口转发。


回答你提到的可以提供帮助。您可以使用ClientAliveCountMaxClientAliveInterval使将来的类似情况自动解决。

答案不太优雅,因为它会影响其他用户。

用一个条件块 ( Match) 在sshd_config将修改的参数仅分配给一个特定用户。

相关内容