我有一个可公开访问的堡垒主机。我目前能够通过 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 服务器隧道情况,我不想重复所有HostName
、IdentityFile
等。我如何才能重用这些值,同时又能在需要隧道时配置主机?这个答案似乎说我应该能够只添加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。