Я пытаюсь подключиться по SSH из офиса X к нескольким ящикам Linux в офисе Y. Ящики Linux в офисе Y находятся за NAT, и каждый работает на своих собственных портах. Я могу успешно связаться со всеми из них через SSH, но не могу пройти аутентификацию.
Мне удалось подключиться по SSH к первому ящику, но когда я добрался до второго, он сказал:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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
Насколько я понимаю, он ожидает увидеть тот же ключ от этого общедоступного IP-адреса, но видит другой, потому что это другой SSH-сервер.
Как я могу исправить это, чтобы он создавал / принимал разные ключи от каждого сервера за тем же IP-адресом?
Есть несколько способов исправить это:
Вы можете отключить проверку ключа хоста для этого конкретного хоста. В твоем ssh_config
файл (~/.ssh/config
), поставьте что-то вроде:
Host remote.host.name
UserKnownHostsFile /dev/null
StrictHostkeyChecking no
Это настраивает ssh
никогда не хранить ключи хоста для remote.host.name
, но недостатком является то, что теперь вы открыты для атак «злоумышленник в середине» (поскольку вы слепо принимаете ключи хоста, вы не можете определить, изменился ли ключ удаленного хоста).
Вы можете использовать похожую технику, чтобы просто дать каждому хосту уникальный known_hosts
файл:
Host hosta
Port 10098
Hostname remote.host.name
UserKnownHostsFile ~/.ssh/known_hosts_hosta
Host hostb
Port 10099
Hostname remote.host.name
UserKnownHostsFile ~/.ssh/known_hosts_hostb
Затем вы подключитесь к этим хостам с помощью ssh hosta
или ssh hostb
, и ssh
будет брать фактическое имя хоста и порт из файла конфигурации.
Имя хоста или IP-адрес сохраняется в виде хэша (или в виде обычного текста в зависимости от параметров и значений версии по умолчанию) в вашем known_hosts
файл. Самый простой обходной путь - добавить запись для каждого хоста в DNS или /etc/hosts
(тьфу!) файл с тем же IP (WAN) адресом, например, в /etc/hosts
:
your.wan.ip.address servera serverb
а потом ssh
по имени хоста и порту.
Вы не говорите, какую версию Solaris (и, что более важно, SSH) вы используете, но достаточно современные версии OpenSSH решили эту проблему.
Вот две записи из моих known_hosts
файл с одинаковым IP-адресом, но разными номерами портов (один из них - неявный 22); как видите, сохраненные ключи не совпадают.
[10.69.55.47]:2222 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAo+zenWwhFWAa/exdxbm3A3htDFGwFVjFlHLO83AfOaloBbBrr6whmLeDqVPBSwI/yrePClpahLUMYE6qGBFCbbOYiQkMDwacNFfxvxd6oCMDDqZH6NWGiBCt0b2M6YKYhYCw6z8n0yvlLk1eTdpp2OpjbfwAIe4eBkWyKNZY9+17VtzARqGR9tgHC8Dh7HBApDR8wooc+XzY6FhD2b21meIt8r8bjfBIu5t6eQgDHh/TzUT1rGH6W0HeUJxpDnpud5Af1ygMEQFrGrzHi5HKtg+K6HFBggMF8t6p2Dz8oMds5pi6IuPlVi3UvO1X7mMJ9pP7ByMQqiVrQ9wtAbC2QQ==
10.69.55.47 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1clJ6vp8NDy7D9YVgAKQQzERfx3scR0c0027yOYGGpeLg+nW+x8mJk1ia9GouUTDME+NP2YDVZUEDog9rtTJvuLd22ZxfoC8LGboyBsmlhOVxdSCxmA/+blPCp1pyocr8pXyXjSkb/qQKKQMRoAU7qKKHPfI5Vugj04l6WbW2rJQTqFD/Lguc8AAUOE6K4DNhETOH2gOnwq6xi0vutDmeUKSqEvM/PQFZSlOL4dFDYO5jAUjvgm6yGHP3LlS9fmCzayJgGgLSnNz0nlcd94Pa1Cd441cCAZHFDvDPniawEafH9ok4Mmew0UGopQGUGbfb5+8g8YphLW6aLdrvnZbAw==
Я не знаю, какая версия OpenSSH представила это, но я использую
[me@risby fin]$ ssh -V
OpenSSH_6.9p1, OpenSSL 1.0.1k-fips 8 Jan 2015
Чтобы расширить мой комментарий к ответу @larsks, я думаю, используя ~/.ssh/config
записей намного лучше, чем изменение / etc / hosts, хотя я бы использовал HostKeyAlias
вместо разделения известных хостов на разные файлы. например:
Host hosta
Port 10098
Hostname remote.host.name
HostKeyAlias hosta
И аналогично для hostb