如何将 ip 范围添加到 known_hosts?

RSF*_*on7 20 ssh

许多服务(如 GitHub)使用范围广泛的 IP,并且显然使用相同的公钥。

如何将 IP 范围(最好是单个)添加到 known_hosts 文件?

对于 GitHub 示例,它使用以下范围:

  • 207.97.227.224/27
  • 173.203.140.192/27
  • 204.232.175.64/27
  • 72.4.117.96/27
  • 192.30.252.0/22

关键是:

AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa + PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31 / YMF + Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB + weqqUUmpaaasXVal72J + UX2B + 2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi / w4yCE6gbODqnTWlg7 + wC604ydGXA8VJiS5ap43JXiUFFAaQ ==

Cal*_*leb 16

如其他答案所述,known_hosts 不支持 IP 地址范围。但是,它确实支持通配符。当然,通配符并不完全相同,因此您需要非常小心在 IP 地址中使用它们的方式,但在 Github 的特殊情况下,这可以安全地完成。

自从提出问题以来,情况似乎变得更简单了。根据Github 的官方文档,只有一个 IP 地址范围在使用(至少就 IPv4 而言)。这是 192.30.252.0/22 范围。这使得 1020 个可能的 IP 地址在四个不同的 C 块中方便地跨越最后一个八位字节的整个可能范围。

man 8 sshd,这就是我们必须在 known_hosts 中使用的内容:

主机名是一个以逗号分隔的模式列表(*?充当通配符);每个模式依次与规范主机名(在对客户端进行身份验证时)或用户提供的名称(在对服务器进行身份验证时)进行匹配。模式前面也可以!表示否定:如果主机名与否定模式匹配,即使它与该行上的另一个模式匹配,也不会(该行)接受它。主机名或地址可以选择性地括在[]括号内,然后是:非标准端口号。

使用此信息,我们可以使用*通配符为匹配所有可能的 Github 端点(并且仅那些端点)的最后一个八位字节构造一个条目,如下所示:

github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.* ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
Run Code Online (Sandbox Code Playgroud)

如果您需要构建的 IP 范围没有填充完整的 C 块,因此没有填充八位字节的所有可能值,则不可能使用通配符进行如此准确的匹配。

  • 这不再是那么简单了;IPv4 CIDR 列表目前相当庞大,包括 140.82.112.0/20、192.30.252.0/22 和 185.199.108.0/22 以及一大堆单独的 IP,并且known_hosts 不支持像 `140.82.11[ 这样的字符类23].*`。此外,这还允许像“192.30.252.example.com”这样的主机 (2认同)

小智 10

我不认为您可以轻松添加范围,但我认为(现在无法测试)可以通过将以下内容添加到 .ssh/ssh_config 来实现相同的效果:

Host *.github.com
HostKeyAlias github-server-pool.github.com
Run Code Online (Sandbox Code Playgroud)

接下来,您将密钥添加到名称为 github-server-pool.github.com 的 known_hosts 文件中。

假设:主机 github-server-pool.github.com 不存在或从未通过 SSH 连接到。

其背后的想法是,ssh 将使用密钥 github-server-pool.github.com 作为密钥来查找 github.com 域的所有主机的公共主机密钥。