Я пробую к 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-адреса?
Имя хоста или IP-адрес сохраняется в виде хэша (или в виде обычного текста в зависимости от параметров и значений версии по умолчанию) в вашем файле known_hosts
. Самый простой обходной путь - добавить запись для каждого хоста в DNS или файл / etc / hosts
(тьфу!) С тем же IP-адресом (WAN), например, в / etc / hosts
:
your.wan.ip.address servera serverb
, а затем ssh
по имени хоста и порту.
Есть несколько способов исправить это:
Вы можете отключить проверку ключа хоста для этого конкретного хоста.В вашем файле ssh_config
( ~ / .ssh / config
) введите что-то вроде:
Host remote.host.name
UserKnownHostsFile / dev / null
StrictHostkeyChecking no
Это настраивает ssh
так, чтобы никогда не хранить ключи хоста для remote.host.name
, но обратная сторона заключается в том, что теперь вы открыты для атак «злоумышленник посередине» (потому что вы слепо принимаете ключи хоста (вы не можете определить, изменился ли ключ удаленного хоста).
Вы можете использовать аналогичную технику, чтобы просто дать каждому хосту уникальный файл known_hosts
:
Хост Хоста
Порт 10098
Имя хоста remote.host.name
UserKnownHostsFile ~ / .ssh / known_hosts_hosta
Хост hostb
Порт 10099
Имя хоста remote.host.name
UserKnownHostsFile ~ / .ssh / known_hosts_hostb
Затем вы подключитесь к этим хостам с помощью ssh hosta
или ssh hostb
, а 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