【问题标题】:Reverse ssh tunnel fails to bind to port when tunnel is torn down and restarted当隧道被拆除并重新启动时,反向 ssh 隧道无法绑定到端口
【发布时间】:2017-02-07 00:02:46
【问题描述】:

我有一台主机在启动时启动反向 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 客户端(应该会自动完成,但可能不会发生)
  • ssh 连接已建立,但无法打开远程服务器上的 2222 端口,因为该端口正在使用中。如果无法绑定到该端口,我希望隧道无法建立。我正在优雅地重启。

标签: linux ssh autossh


【解决方案1】:

我相信我遇到了与原始海报相同的问题。我似乎在this question接受的答案末尾找到了解决方案:

如果客户端在服务器上的连接终止之前重新连接,您可能会遇到新的 ssh 连接处于活动状态但没有端口转发的情况。为了避免这种情况,您需要在客户端使用ExitOnForwardFailure 关键字。

因此,我在客户端的/etc/ssh/ssh_config 文件中添加了以下行:

ExitOnForwardFailure yes

根据ssh man page,此选项将导致“以-f [to] 启动的客户端在将自身置于后台之前等待所有远程端口转发成功建立”。

这似乎导致 ssh 在杀死一个 ssh 隧道后立即尝试启动失败。因此,该选项允许重复尝试,直到正确地重新建立隧道。

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 2017-07-15
    • 1970-01-01
    • 2021-10-15
    • 2021-05-11
    • 2016-11-10
    • 2010-09-27
    • 2019-04-13
    • 2020-06-22
    相关资源
    最近更新 更多