通过Jumphost的CanonicalHostname和ssh连接

时间:2020-05-11 06:51:22

标签: ssh

说我有一个名为internal.sub.domain.net的内部子域,其主机如foo.internal.sub.domain.netbar.internal.sub.domain.net。此外,只能通过Jumphost internal.sub.domain.net从外部访问这些主机。因此,以下~/.ssh/config允许我从外部直接连接到任何内部主机:

Host foo bar
        HostName %h.internal.sub.domain.net
        ProxyJump internal.sub.domain.net

这对于仅包含几台主机的子域来说很好,但是如果主机数量很大和/或偶尔更改,则很快变得难以维护。但是通配符可能可以解决:

Host *.internal.sub.domain.net
        ProxyJump internal.sub.domain.net

这避免了维护问题,但是必须始终指定要连接的标准主机名,这很繁琐。通过查看ssh_config手册页,CannonicalizeHostnameCannonicalDomains选项似乎可以解决此问题:

CannonicalizeHostname always
CannonicalDomains internal.sub.domain.net
Host *.internal.sub.domain.net
        ProxyJump internal.sub.domain.net

但这仅在要连接的主机的名称查找成功的情况下有效。但是由于这些主机是内部定义的主机,因此名称解析失败也就不足为奇了。

一个不太有用但很有说明性的技巧是通过仅将所有内部主机添加为别名来伪造成功的名称解析,例如127.0.0.1/etc/hosts,即将以下行添加到/etc/hosts

127.0.0.1 foo.internal.sub.domain.net bar.internal.sub.domain.net

该行就位,最后一个~/.ssh/config就像一个超级按钮。但是,除了事实证明这是一个hack之外,它只是将维护问题的形式从~/.ssh/config更改为/etc/hosts

由于所描述的场景应该很常见,有没有办法使它起作用?再次用一句话来表达它:

我希望能够通过SSH攻击internal.sub.domain.net中生活的所有 内部主机,即只能通过internal.sub.domain.net跳转主机访问而没有必须列出这些主机中的每一个主机,因为它们可能会经常从内部域中添加或删除,并且 没有被强制始终键入其完全限定的主机名。

1 个答案:

答案 0 :(得分:2)

如果要从shell调用ssh,则可以为内部域定义一个简短变量,并将其附加到相关的主机名上:

例如在您的〜/ .bashrc或类似文件中:

i=".internal.sub.domain.net"

然后,在命令行上:

ssh foo$i
ssh bar$i

至少要等到更好的解决方案出现为止。这并不完美,但在命令行上只有两个额外的字符。

更新:出现了更好的解决方案。

Peter Stuge在openssh邮件列表上的一个更好的解决方案是在您的配置文件中包含以下内容:

Host *.i
    ProxyCommand ssh -W %hnternal.sub.domain.net:%p jumphost

这可以使用foo.i之类的缩写主机名(而不是我的第一个答案为foo$i)。能够使用.而不是$更好,因为它不需要使用Shift键。

但是,这仅限于其内部域以i开头的单个远程Jumphost。我认为以internal.开头的内部域很常见。如果您需要连接到多个此类内部域,则上述操作需要进行一些(但非常难看)的调整。如果有人的眼睛开始流血,我先向您道歉。

例如,如果您需要连接到以下内部域:

internal.a.com
internal.b.net

然后将以上内容更改为以下内容:

Host *.a
    ProxyCommand sh -c "H=%h; exec sh -c \"exec ssh -W \${H%%.a}.internal.a.com:%p jumphosta\""

Host *.b
    ProxyCommand sh -c "H=%h; exec sh -c \"exec ssh -W \${H%%.b}.internal.b.net:%p jumphostb\""

相信我,我希望它可能更简单,但这是我可以工作的最短的东西(无需使用单独的shell脚本或环境变量)。

如果在命令行上提供了用户名,则该用户名仅适用于跳转到的主机。默认情况下,您的本地用户名将用于Jumphost。

如果您需要为跳转主机使用与本地用户名不同的用户名,请将其添加到ProxyCommand中(例如jumpuser@jumphosta)。