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

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

笔记:这篇文章不是重复的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

但是,当连接由于 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

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

我怎样才能(至少手动地)告诉 sshd(在机器 B 上)它不再监听端口 2222,这样我就可以在不等待一个小时的情况下恢复连接(并且无需重新启动机器 B)?

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

PPS:ExitOnForwardFailure yes即使没有,也能为我工作=

答案1

您还需要设置超时选项ssh 服务器这样它会更快地断开连接。

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

ClientAliveInterval 60
ClientAliveCountMax 3

相关内容