Назад | Перейти на главную страницу

SSH на NAT-серверы на одном публичном IP-адресе

Я пытаюсь подключиться по 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-адресом?

Есть несколько способов исправить это:

  1. Вы можете отключить проверку ключа хоста для этого конкретного хоста. В твоем ssh_config файл (~/.ssh/config), поставьте что-то вроде:

    Host remote.host.name
    UserKnownHostsFile /dev/null
    StrictHostkeyChecking no
    

    Это настраивает ssh никогда не хранить ключи хоста для remote.host.name, но недостатком является то, что теперь вы открыты для атак «злоумышленник в середине» (поскольку вы слепо принимаете ключи хоста, вы не можете определить, изменился ли ключ удаленного хоста).

  2. Вы можете использовать похожую технику, чтобы просто дать каждому хосту уникальный 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