Я пытаюсь перевести 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
:а затем
ssh
по имени хоста и порту.источник
Есть несколько способов исправить это:
Вы можете отключить проверку ключа хоста для этого конкретного хоста. В вашем
ssh_config
файле (~/.ssh/config
) поместите что-то вроде:Это
ssh
позволяет никогда не хранить ключи хостаremote.host.name
, но недостатком является то, что теперь вы открыты для атак «человек посередине» (поскольку вы слепо принимаете ключи хоста, вы не можете сказать, изменился ли ключ удаленного хоста).Вы можете использовать похожую технику, чтобы просто дать каждому хосту уникальный
known_hosts
файл:Затем вы подключитесь к этим хостам с помощью
ssh hosta
илиssh hostb
иssh
получите фактическое имя хоста и порт из файла конфигурации.источник
/etc/hosts
файла также будет работать. Мне это нравится больше, потому что (а) он не требует повышения привилегий и (б) это означает, что вам не нужно указывать номера портов в командной строке.~/.ssh/config
(другой порт для каждогоhosta
hostb
), как описано в ответе larsks. Точно так же вы можете указать разные имена пользователей, ключи и т. Д. В этом конфигурационном файле для разных хостов, поэтому все, что вам нужно сделать в командной строке, -ssh hosta
илиssh hostb
HostKeyAlias
директиву, а не разделял известные хосты на разные файлы. напр.HostKeyAlias hosta
Вы не говорите, какую версию Solaris (и, что более важно, SSH) вы используете, но достаточно современные версии OpenSSH решили эту проблему.
Вот две записи из моего
known_hosts
файла, которые имеют один и тот же IP-адрес, но разные номера портов (одна - неявная 22); как вы видите сохраненные ключи не совпадают.Я не знаю, какая версия OpenSSH представила это, но я бегу
источник
Чтобы расширить мой комментарий к ответу @larsks, я думаю, используя
~/.ssh/config
записи гораздо лучше, чем модифицировать / etc / hosts, хотя я бы использовалHostKeyAlias
вместо того, известные хосты на разные файлы. например:И аналогично для
hostb
источник