¿Cómo agregar un rango de IP aknown_hosts?

¿Cómo agregar un rango de IP aknown_hosts?

Muchos servicios (como GitHub) utilizan una amplia gama de IP y, obviamente, la misma clave pública.

¿Cómo puedo agregar un rango de IP (preferiblemente en uno solo) al archivo conocido_hosts?

Para el ejemplo de GitHub, utiliza los siguientes rangos:

  • 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

Y la clave es:

AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETY P81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvG q3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==

Respuesta1

Como se señaló en otras respuestas,hosts_conocidosno tiene soporte para rangos de direcciones IP. Sin embargo, admite comodines. Por supuesto, los comodines no son exactamente lo mismo, por lo que debes tener mucho cuidado al usarlos en las direcciones IP, pero en el caso particular de GitHub esto se puede hacer de forma segura.

La situación parece haberse simplificado desde que se hizo la pregunta. De acuerdo aDocumentación oficial de GitHubsólo hay un rango de direcciones IP en uso (al menos en lo que respecta a IPv4). Este es el rango 192.30.252.0/22. Esto genera 1020 direcciones IP posibles que abarcan convenientemente todo el rango posible para el último octeto en solo cuatro bloques C diferentes.

De man 8 sshd, esto es con lo que tenemos que trabajar enhosts_conocidos:

Hostnameses una lista de patrones separados por comas ( *y ?actúan como comodines); cada patrón, a su vez, se compara con el nombre de host canónico (al autenticar un cliente) o con el nombre proporcionado por el usuario (al autenticar un servidor). Un patrón también puede ir precedido de !para indicar negación: si el nombre del host coincide con un patrón negado, no se acepta (en esa línea) incluso si coincide con otro patrón en la línea. Opcionalmente, se puede incluir un nombre de host o una dirección entre corchetes [y ]seguidos de :un número de puerto no estándar.

Usando esta información, podemos construir una entrada usando el *comodín para el último octeto que coincida con todos los puntos finales posibles de GitHub (ysoloesos puntos finales) así:

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==

Si el rango de IP que necesitaba construir no llenaba un bloque C completo (y por lo tanto todos los valores posibles para un octeto), sería imposible utilizar comodines para una coincidencia tan precisa.

Respuesta2

No creo que puedas agregar fácilmente los rangos, pero creo (no puedo probar esto ahora) que se puede lograr el mismo efecto agregando lo siguiente a .ssh/ssh_config:

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

A continuación, agregará la clave al archivoknown_hosts con el nombre github-server-pool.github.com.

Supuesto: el host github-server-pool.github.com no existe o nunca está conectado a través de SSH.

La idea detrás de esto es que ssh usará la clave github-server-pool.github.com como clave para buscar la clave de host pública para todos los hosts del dominio github.com.

Respuesta3

No hay soporte para conjuntos de direcciones IP en el known_hostsarchivo. Tendrás que tener una línea por dirección.

Aunque la parte del nombre de host de las entradas tiene un hash de forma predeterminada, esto es solo por motivos de privacidad, de modo que alguien que se comunique con usted .known_hostsno pueda descubrir fácilmente a qué hosts se ha estado conectando. (Aún pueden verificar las conjeturas). Puede utilizar un nombre de host simple o una dirección 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

Tenga en cuenta que esto puede agregar duplicados.

Respuesta4

Escribí un pequeño script Ruby, github_known_hostsque puede expandir los rangos de direcciones IP que GitHub publica desde supunto final meta API(https://api.github.com/meta).

#!/usr/bin/env ruby

require "ipaddr"
require "json"

pubkey = "AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=="
ips    = JSON.parse(STDIN.read)["git"].flat_map { |net| IPAddr.new(net.chomp).to_range.map(&:to_s) }

puts "github.com,gist.github.com,#{ips.join(',')} ssh-rsa #{pubkey}"

Úselo así y producirá una línea muy larga que puede pegar en su ~/.ssh/known_hostsarchivo:

curl --silent https://api.github.com/meta | github_known_hosts >> ~/.ssh/known_hosts

información relacionada