一行即可将 SSH 端口远程转发到嵌套服务器中的本地,用于 postgres 数据库

一行即可将 SSH 端口远程转发到嵌套服务器中的本地,用于 postgres 数据库

我有 2 台服务器 [电子邮件保护][电子邮件保护],我想连接到[电子邮件保护]但由于限制,我无法直接连接,我必须先连接到[电子邮件保护]然后我必须从 example1.com 连接到 example2.com。

现在我想在本地将我的应用程序连接到远程 psql 服务器,该服务器位于[电子邮件保护]:5432。为此我必须执行以下步骤。

  1. 通过 SSH 进入 example1.com

    ssh [email protected]
    
  2. 现在从 example1 开始,在 ssh 之后进入 example1.com,然后通过在 example1.com 中输入以下内容将端口 5432 从 example2 转发到 example1 的 5434:

    ssh -L 5434:localhost:5432 [email protected]
    
  3. 现在,从我的本地另一个终端选项卡中,我必须输入以下命令将 example1.com 的端口 5434(来自 example2 的 5432)转发到我的本地 5432。

    ssh -L 5432:localhost:5434 [email protected]
    

现在终于在本地,我的应用程序可以使用端口 5432 连接到本地主机,就好像 psql 在本地运行一样。

我想将整个过程变成一个命令,这样我就可以只用一步完成它并在一步中停止它,而不是执行上述 3 个步骤,因为我必须一次又一次地输入很多内容,所以我愿意创建一个可执行文件(如 shell 脚本)。

到目前为止我尝试这样做:

ssh -L 5432:localhost:5434 [email protected] ssh -L 5434:localhost:5542 -N [email protected]

这正是我想要的解决方案,效果非常好,有用,但是,有一个现在。而那不过是,当我按 CTRL + C 时,它会终止 example1 的 5434 到本地 5432 的本地 ssh 连接,但它不会终止 example2.com 和 example1.com 之间的连接,因此当我再次运行上述命令时会出现此错误:

bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 5434

然后我必须再次更改端口,然后它再次挂起,当我再次按 CTRL+C 时,它会阻止该端口,

那么我需要什么?

所以我需要另一种端口转发方式,或者我需要一种方法来终止 example1.com 和 example2.com 之间的连接,我只需要一步(单行)来启动和一步来停止(单行)。

到目前为止,我一直通过ps -aux | grep 5434从 example1.com 内部执行并使用 kill 命令来终止这些连接。

我的本地 SSH 配置(〜/.ssh /配置

Host *.*.*.*
   StrictHostKeyChecking no

Host *
        ServerAliveInterval 50
        ServerAliveCountMax 10
        ForwardAgent yes

编辑#1:

ssh -J [email protected] ssh -L 5432:localhost:5432 -N [email protected]

尝试了上述命令但出现此错误:

open failed: administratively prohibited: open failed
stdio forwarding failed
ssh_exchange_identification: Connection closed by remote host

这可能与 example2 是私有 IP 有关,只有 example1 是公共 IP(不确定这是否是问题所在)。

答案1

问题ssh在于如何生存下去example1.com

简化整个设置。一种优雅的方法是使用ssh -J

-J destination
首先与所描述的跳转主机建立 ssh 连接destination,然后从那里建立到最终目的地的 TCP 转发,从而连接到目标主机。

ssh -J [email protected] ssh -L 5432:localhost:5432 -N [email protected]

这是不是相当于从本地计算机连接到 ,example1.com然后从example1.com连接到example2.com。这相当于从本地计算机连接到 ,example1.com然后从本地连接到example2.com(使用通过 转发的数据包example1.com)。 不会在 上调用 SSH 客户端example1.com。这意味着:

  • 的凭证example2.com必须来自您的本地计算机,而不是来自example1.com。如果您提到的限制意味着凭证来自example1.com并且您无法更改这一点,那么这种方法就无法使用。

  • 无论是从/etc/ssh/ssh_config还是~/.ssh/config从,都无关紧要example1.comexample2.com在您的当地的配置。注意你可以指定ProxyJump在配置中:

    Host example2.com
         ProxyJump example1.com
    

    -J如果这样做,则连接到时将不再需要example2.com

    ssh -L 5432:localhost:5432 -N [email protected]
    

如果出现这种情况administratively prohibited: open failed(或者由于任何原因您不能或不想使用-J/ ProxyJump),请恢复为原始命令(我们将立即修复它)。

administratively prohibited: open failed在您的情况下,意味着无法通过-J建立从本地计算机到 的 TCP 转发,因为 的管理员不允许这样做。但您的原始命令仍成功转发端口。可能example2.comexample1.comexample1.comPermitOpen localhost:*正在使用中。那么让我们修复您的原始命令。

您的原始命令的形式为:

ssh     … [email protected] ssh …

像这样修复它:

ssh -tt … [email protected] ssh …

不同之处在于-tt将强制分配 tty 以ssh运行[email protected](无论您的本地是否ssh有 tty)。现在,如果您终止本地,ssh则远程ssh将收到SIGHUP

在符合 POSIX 标准的平台上,SIGHUP“信号挂断”是在进程的控制终端关闭时发送给进程的信号。

ssh正在运行的程序example1.com将在 时正常退出SIGHUP。您不再需要手动将其终止。

您的原始命令未分配 tty,因此此有用机制不适用。添加-tt会更改此情况。

相关内容