许多服务(如 GitHub)使用范围广泛的 IP,并且显然使用相同的公钥。
如何将 IP 范围(最好是单个)添加到 known_hosts 文件?
对于 GitHub 示例,它使用以下范围:
关键是:
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 块,因此没有填充八位字节的所有可能值,则不可能使用通配符进行如此准确的匹配。
小智 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 域的所有主机的公共主机密钥。