在与 ssh 不正确断开连接后,如何删除 sshd 仍在使用的端口绑定?

hel*_*rld 5 ssh port port-forwarding ssh-tunnel

注意:这篇文章不是SSH 远程端口转发失败的重复。这里的问题不是导致端口转发(暂时)失败的原因,我们知道它是什么。问题是如何删除损坏的 sshd 端口绑定。谢谢。

我有一台具有动态 IP 的服务器 A,运行 autossh,以维护到具有静态 IP 的计算机 B 的反向隧道。下面的代码工作正常:

autossh -M 0 -q -N -R2222:localhost:22 -o ServerAliveInterval 60 -o   ServerAliveCountMax 3 -o ExitOnForwardFailure yes USER@B -p PORT
Run Code Online (Sandbox Code Playgroud)

然而,当由于 A 的 IP 更改而导致连接崩溃时,需要“很长”的时间(比如一个小时)才能恢复连接。这是因为来自机器 B 的 sshd 仍然监听端口 2222,从而阻止了 ssh(来自机器 A)在崩溃后绑定端口 2222。

B 的 auth.log 包含数十条:

Accepted publickey for USER from A port SOMEPORT ssh2: ED25519 XXXXXXXX
error: bind: Address already in use
error: channel_setup_fwd_listener_tcpip: cannot listen to port: 2222
Run Code Online (Sandbox Code Playgroud)

直到连接最终被接受而没有转发失败(导致 autossh 停止重新生成 ssh,如等待的那样),因为 sshd 最终不再侦听端口 2222。

我如何(至少手动)告诉 sshd(在机器 B 上)它不应该再监听端口 2222,这样我就可以恢复连接而无需等待一个小时(并且无需重新启动机器 B)?

PS:重启sshd并不能解决问题。

PPS:ExitOnForwardFailure yes即使没有=.

Mic*_*ton 2

您还需要在ssh 服务器上设置超时选项,以便更快地断开连接。

例如,您可以添加到/etc/ssh/sshd_config

ClientAliveInterval 60
ClientAliveCountMax 3
Run Code Online (Sandbox Code Playgroud)