SSH в NAT'd-сервери на одній публічній IP-адресі


16

Я намагаюся 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
+1 для хмари, намальованої рукою.
JoeG

Відповіді:


15

Ім'я хоста чи IP-адреса зберігаються у вашому known_hostsфайлі як хеш (або у простому тексті залежно від параметрів та версій за замовчуванням) . Найпростіший спосіб вирішити - додати запис для кожного хоста до DNS або /etc/hosts(ugh!) Файл з тим же IP-адресою (WAN), як у /etc/hosts:

your.wan.ip.address      servera serverb

а потім sshпо імені хоста та порту.


22

Існує кілька способів виправити це:

  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отримаєте фактичне ім’я хоста та порт з файлу примирення.


4
Ні, зміна /etc/hostsфайлу також буде працювати. Мені це подобається більше, тому що (а) він не вимагає нарощування привілеїв і (б) це означає, що вам не потрібно вказувати номери портів у командному рядку.
larsks

1
Роздільна здатність імен (хости або DNS) все ще знадобиться в обох цих рішеннях, щоб асоціювати hosta і hostb з IP-адресою WAN. Але обидва є чудовими пропозиціями, що я був лінивий набрати LOL Edit: Просто помітив ім'я хосту там - подряпини про роздільну здатність імен.
Брендон Ксав'є

2
@CopyRunStart: вам не потрібно вказувати порт у командному рядку, оскільки він уже вказаний у вашому ~/.ssh/config(інший порт для кожного з hosta hostb), як описано у відповіді ларок. Так само ви можете вказати різні імена користувачів, ключі та ін. У цьому конфігураційному файлі для різних хостів, тому все, що вам потрібно зробити в командному рядку, ssh hostaабоssh hostb
arielf,

3
Якби я міг повторити ~ / .ssh / config двічі, я би сказав. Погортання з / etc / hosts може спричинити інші проблеми з усунення неполадок у дорозі.
Аарон

1
Це набагато краще рішення, IMO, ніж модифікація / etc / hosts. Як незначний прислівник, я б використав HostKeyAliasдирективу, а не розділяти відомі хости на різні файли. напр.HostKeyAlias hosta
малиновий-чапля

8

Ви не кажете, яку версію 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

3

Щоб розширити свій коментар до відповіді @larsks, я думаю, що використовувати ~/.ssh/configзаписи набагато краще, ніж змінювати / etc / hosts, хоча я б HostKeyAliasскоріше використовував , ніж розділяв відомі хости на різні файли. наприклад:

Host hosta
Port 10098
Hostname remote.host.name
HostKeyAlias hosta

І аналогічно для hostb

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.