如何将IP范围添加到known_hosts?


15

许多服务(例如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 ==


1
这些IP在这里
RSFalcon7 2013年

Answers:


11

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

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

man 8 sshd,这就是我们在known_hosts中需要处理的内容:

主机名是逗号分隔的模式列表(*' and?'用作通配符);每个模式又与规范的主机名(在验证客户端时)或用户提供的名称(在验证服务器时)相匹配。模式也可以以!' to indicate negation: if the host name matches a negated pattern, it is not accepted (by that line) even if it matched another pattern on the line. A hostname or address may optionally be enclosed within['和]' brackets then followed by:'和非标准端口号开头。

使用此信息,我们可以使用*通配符构造一个与所有可能的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==

如果您需要构造的IP范围没有填充完整的C块,因此没有填充一个八位位组的所有可能值,那么将不可能使用通配符来进行如此精确的匹配。


8

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

Host *.github.com
HostKeyAlias github-server-pool.github.com

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

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

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


这是一个很好的答案,并且比原始答案容易。
kael

4

文件中不支持IP地址集known_hosts。每个地址必须有一行。

尽管默认情况下.known_hosts会对条目的主机名部分进行散列处理,但这仅是出于保密目的,因此,掌握您身份的人将无法轻松找出您已连接到哪些主机。(他们仍然可以验证猜测。)您可以使用简单的主机名或IP地址。

for net in 207.97.227.224/27 173.203.140.192/27 204.232.175.64/27 72.4.117.96/27 192.30.252.0/24 192.30.252.1/24 192.30.252.2/24 192.30.252.3/24; do
  base=${net%/*}; d=${base##*.}; abc=${base%.*}
  bits=$((32 - ${net#*/}))
  e=0
  while [ $e -lt $((2 ** bits) ]; do
    echo "$abc.$((d + e)) ssh-rsa AAAAB3NzaC1yc…" >>~/.ssh/known_hosts
    e=$((e + 1))
  done
done

请注意,这可能会添加重复项。


固定,但仅适用于0.0.0.0/24以下的网络
RSFalcon7 2013年

@ RSFalcon7确实。IP地址算法很烦人。我做了一个快速解决方法……如果您需要支持更大的网络,请在进行枚举之前将IP地址转换为32位数字。
吉尔斯(Gilles)'所以

0

SSH似乎没有已知主机的IP范围的概念。我认为,出于安全原因,每个主机都将具有唯一的密钥。

我可以看到两种方式来预填充您的known_hosts:

  1. ssh-keyscan-编写简短的脚本以遍历所有这些地址,然后将其馈入ssh-keyscanssh-keyscan读取文件。 ssh-keyscan可以通过在一行上指定或指定主机列表来每次调用扫描多个主机。

  2. known_hosts用脚本或编辑器填充自己。如果使用非哈希版本,则格式非常简单。它是:

    主机名,IP地址ssh-keytype密钥

hostname是您联系的主机名,所有GitHub地址都应相同。 IP address这就是脚本将迭代的内容。 key是您上面提供的密钥。

两者都不尽人意,但是我认为SSH人员认为没人会做GitHub的工作。


没有人应该做github在做什么。这是一个主机密钥,而不是“一组相似的主机”密钥。

@ WumpusQ.Wumbley我同意。但是我怀疑GitHub是否会改变我的说法。
kurtm 2013年

0

嗨,我发现Gilles的脚本很有用,但仅适用于网络以下0.0.0.0/24是一个限制,我将脚本扩展到可以与较大的网络一起使用,0.0.0.0/16也许对其他人有用。

#!/bin/sh
# http://unix.stackexchange.com/questions/94448/how-to-add-an-ip-range-to-known-hosts
# answered Oct 11 '13 at 0:21  Gilles
# only working for networks up to 0.0.0.0/24
# Declan Forde - Increased the range up to 0.0.0.0/16 networks


NETWORKS="127.0.0.0/30 127.0.0.0/29 127.0.0.0/28 127.0.0.0/27 127.0.0.0/26 127.0.0.0/25 127.0.0.0/24 127.0.0.0/23 127.0.0.0/22 127.0.0.0/21 127.0.0.0/16"

for net in ${NETWORKS}
do
  base=${net%/*}
  bits=$((32 - ${net#*/}))

  abc=${base%.*}
  ab=${abc%.*}
  c=${abc##*.}
  d=${base##*.}

  if [ $bits -gt 8 ] && [ $bits -le 16 ]
  then
    netbits=$((bits - 8))
    bits=8
  else
    netbits=0
  fi

  netcount=0
  while [ $netcount -lt $((2 ** netbits)) ]
  do
    count=0
    while [ $count -lt $((2 ** bits)) ]
    do
      echo "$ab.$c.$((d + count))"
      echo "$ab.$c.$((d + count)) ssh-rsa AAAAB3NzaC1yc." >>~/.ssh/known_hosts
    count=$((count + 1))
    done
    netcount=$((netcount + 1))
    c=$((c + 1))
  done
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.