gpt4 book ai didi

ssh - 通过 jumphost 的 CanonicalHostname 和 ssh 连接

转载 作者:行者123 更新时间:2023-12-02 13:47:35 24 4
gpt4 key购买 nike

假设我有一个名为 internal.sub.domain.net 的内部子域,其主机如 foo.internal.sub.domain.netbar.internal .sub.domain.net.此外,这些主机只能通过跳转主机 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 jumphost 而无需在某处列出这些主机中的每一个,因为它们可能经常被添加到内部域或从内部域中删除并且没有被迫始终键入其完全限定的主机名。

最佳答案

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

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

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

然后,在命令行上:

ssh foo$i
ssh bar$i

至少在出现更好的解决方案之前。它并不完美,但它在命令行上只有 2 个额外的字符。

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

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

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

这允许使用缩写的主机名,例如 foo.i(而不是我第一个答案中的 foo$i)。能够使用 . 而不是 $ 更好,因为它不需要使用 shift 键。

但是,这仅限于内部域以 i 开头的单个远程跳转主机。我认为以 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 脚本或环境变量)。

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

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

关于ssh - 通过 jumphost 的 CanonicalHostname 和 ssh 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61723825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com