反向ssh隧道在隧道断开和重新启动时无法绑定端口

4

我的主机在启动时会自动启动一个反向ssh隧道,类似下面这样:

ssh -N -R 2222:localhost:22 root@10.1.2.6

它工作得很好,反向隧道已经建立。但是每次我重新启动主机时,隧道连接的远程服务器都会显示以下内容:
Sep 28 13:13:59 kali sshd[4547]: error: bind: Address already in use
Sep 28 13:13:59 kali sshd[4547]: error: channel_setup_fwd_listener_tcpip: cannot listen to port: 2222

为了解决这个问题,我需要等待旧的ssh隧道超时几分钟,然后找到新的ssh连接并杀掉它,然后重新构建ssh隧道就可以正常工作了。
是否有一个ssh命令或autossh命令可以检查远程主机是否可以绑定该端口,如果不能,那么在几秒钟后再次尝试?

你可以使用 while /bin/true; do ssh -N ...; done 命令,这样每当隧道失败时就会重新启动 SSH 进程。每当您重启服务器时,这是优雅重置还是硬重置?如果是优雅重置,请在重新启动之前使用 TERM 信号终止 SSH 客户端(应该自动完成,但可能没有发生)。 - Misko
SSH连接已建立,但由于端口2222正在使用中,因此无法在远程服务器上打开该端口。如果无法绑定到该端口,则希望隧道不要建立。我正在进行优雅的重启。 - Tom Freezers
1个回答

4
我相信我遇到了与原帖作者相同的问题。在这个问题的受理答案末尾,我似乎找到了解决方案:

如果客户端在服务器断开连接之前重新连接,你可能会陷入一种情况:新的ssh连接处于活动状态,但没有端口转发。为了避免这种情况,你需要在客户端使用ExitOnForwardFailure关键字。

因此,我已经将以下行添加到我的客户端/etc/ssh/ssh_config文件中:
ExitOnForwardFailure yes

根据ssh man页面所述,此选项将导致“以-f启动的客户端等待所有远程端口转发成功建立,然后将自己放在后台”。这似乎会导致在杀死一个ssh隧道后立即尝试启动另一个ssh隧道时失败。因此,该选项使得可以重复尝试直到正确重新建立隧道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接