Estoy tratando de SSH desde la oficina X a algunas cajas de Linux en la oficina Y. Las cajas de Linux en la oficina Y están detrás de NAT y cada una se ejecuta en sus propios puertos. Puedo llegar a todos con éxito a través de SSH, pero no puedo autenticarme.
Pude ingresar a SSH en el primer cuadro, pero cuando llegué al segundo decía:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[edited out fingerprint]
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:1
Entiendo que espera ver la misma clave de esa dirección IP pública, pero está viendo una diferente porque es un servidor SSH diferente.
¿Cómo puedo solucionarlo para que cree / acepte una clave diferente de cada servidor detrás de esa misma dirección IP?
Respuestas:
El nombre de host o la dirección IP se almacenan como un hash (o en texto plano según las opciones y los valores predeterminados de la versión) en su
known_hosts
archivo. La solución más fácil es agregar una entrada para cada host al DNS o al/etc/hosts
archivo (ugh!) Con la misma dirección IP (WAN) como en/etc/hosts
:y luego
ssh
por nombre de host y puerto.fuente
Hay algunas formas de arreglar esto:
Puede deshabilitar la comprobación de claves de host para este host en particular. En su
ssh_config
archivo (~/.ssh/config
), ponga algo como:Esto configura
ssh
que nunca se almacenarán claves de hostremote.host.name
, pero la desventaja es que ahora está abierto a ataques de intermediario (porque acepta ciegamente claves de host que no puede saber si la clave de host remota ha cambiado).Puede usar una técnica similar para simplemente dar a cada host un
known_hosts
archivo único :Luego se conectará a estos hosts con
ssh hosta
ossh hostb
, yssh
tomará el nombre de host y el puerto reales del archivo de configuración.fuente
/etc/hosts
archivo también funcionará. Esto me gusta más porque (a) no requiere privilegios escalados y (b) significa que no necesita especificar números de puerto en la línea de comandos.~/.ssh/config
(un puerto diferente para cada unohosta
hostb
) como se describe en la respuesta de larsks. Del mismo modo, puede especificar diferentes nombres de usuario, claves, etc. en este archivo de configuración para los diferentes hosts, por lo que todo lo que tiene que hacer en la línea de comandos esssh hosta
ossh hostb
HostKeyAlias
directiva en lugar de dividir los hosts conocidos en diferentes archivos. egHostKeyAlias hosta
No dice qué versión de Solaris (y, lo que es más importante, SSH) está utilizando, pero las versiones suficientemente actualizadas de OpenSSH han abordado este problema.
Aquí hay dos entradas de mi
known_hosts
archivo, que tienen la misma dirección IP pero diferentes números de puerto (uno es el 22 implícito); como puede ver, las claves almacenadas no son las mismas.No sé qué versión de OpenSSH introdujo esto, pero estoy ejecutando
fuente
Para ampliar mi comentario a la respuesta @larsks, creo que usar
~/.ssh/config
entradas es mucho mejor que modificar / etc / hosts, aunque usaría el enHostKeyAlias
lugar de dividir los hosts conocidos en diferentes archivos. p.ej:Y de manera similar para
hostb
fuente