SSH 配置文件设置用于端口转发和 SSH 访问堡垒

SSH 配置文件设置用于端口转发和 SSH 访问堡垒

我有一个可公开访问的堡垒主机。我目前能够通过 SSH 连接到堡垒,ssh bastion方法是~/.ssh/config

Host bastion
    IdentitiesOnly yes
    HostName bastion.foo.com
    User my-user
    Port 2222
    PubKeyAuthentication yes
    IdentityFile ~/.ssh/bastion.pem
    ServerAliveInterval 30

现在我在防火墙内有一个 Redis 实例,我想将本地端口转发到该实例。这可行:

ssh -L 6000:redis.private.foo.com:6379 bastion

ssh redis但我想要一个配置主机快捷方式,这样我只需键入并设置隧道即可。(我很乐意为此专门提供一个终端选项卡,尽管我会尝试-N -f看看我是否喜欢这样。)主机名不会改变,隧道需要通过堡垒。我试过这个:

Host redis
    LocalForward 6000 redis.private.foo.com:6379
    ProxyJump bastion

这不起作用,并且失败:

channel 0: open failed: connect failed: Temporary failure in name resolution
stdio forwarding failed
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535

我不知道它为什么抱怨那个 MAXINT 端口号……

对于这种特殊的 Redis 服务器隧道情况,我不想重复所有HostNameIdentityFile等。我如何才能重用这些值,同时又能在需要隧道时配置主机?这个答案似乎说我应该能够只添加HostName redis.private.foo.com到第二个主机,它应该可以工作,但在这种情况下我得到了同样的错误。唯一的区别是,使用该HostName参数后,连接会在约 2 分钟后失败,而不是 15 秒。

我已经测试过,堡垒主机能够连接到 Redis 端口上的内部主机名。

答案1

解决方案是使用ProxyCommand选项。因此,我在我的 中定义了这两个主机~/.ssh/config

Host bastion
    IdentitiesOnly yes
    HostName bastion.foo.com # External bastion hostname
    User my-user
    Port 2222
    PubKeyAuthentication yes
    IdentityFile ~/.ssh/bastion.pem
    ServerAliveInterval 30
Host redis
    LocalForward 6000 redis.internal:6379
    Hostname redis.internal # Internal Redis DNS hostname or IP
    ProxyCommand ssh bastion nc %h %p # NB: Connect using above host config

当我想要设置 Redis 隧道时,我只需使用ssh redis,它将重新使用来自堡垒主机定义中的配置。

答案2

该错误的重要部分是Temporary failure in name resolution。您的计算机无法解析名称redis.private.foo.com。请使用 IP 或修复名称解析。该名称必须能够在堡垒上解析。如果堡垒无法解析该名称,请使用 IP。

相关内容