Usiłuję SSH z biura X do kilku urządzeń Linux w biurze Y. Urządzenia Linux w biurze Y są za NAT i każdy z nich działa na swoich własnych portach. Mogę z powodzeniem dotrzeć do wszystkich za pośrednictwem protokołu SSH, ale nie mogę się uwierzytelnić.
Byłem w stanie SSH w pierwszym polu, ale kiedy dotarłem do drugiego, powiedział:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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
Rozumiem, że oczekuje tego samego klucza z tego publicznego adresu IP, ale widzi inny, ponieważ jest to inny serwer SSH.
Jak mogę to naprawić, aby tworzył / akceptował inny klucz dla każdego serwera za tym samym adresem IP?
Odpowiedzi:
Nazwa hosta lub adres IP są przechowywane jako skrót (lub jako zwykły tekst w zależności od opcji i ustawień domyślnych wersji) w
known_hosts
pliku. Najłatwiejszym obejściem jest dodanie wpisu dla każdego hosta do/etc/hosts
pliku DNS lub (ugh!) O tym samym adresie IP (WAN), na przykład w/etc/hosts
:a następnie
ssh
według nazwy hosta i portu.źródło
Istnieje kilka sposobów rozwiązania tego problemu:
Możesz wyłączyć sprawdzanie klucza hosta dla tego konkretnego hosta. W swoim
ssh_config
pliku (~/.ssh/config
) umieść coś takiego:Konfiguruje
ssh
się tak, aby nigdy nie przechowywać kluczy hostaremote.host.name
, ale wadą jest to, że teraz jesteś otwarty na ataki typu man-in-the-middle (ponieważ ślepo akceptujesz klucze hosta, których nie wiesz, czy klucz zdalnego hosta się zmienił).Możesz użyć podobnej techniki, aby po prostu nadać każdemu hostowi unikalny
known_hosts
plik:Następnie połączysz się z tymi hostami przy pomocy
ssh hosta
lubssh hostb
, issh
weźmiesz rzeczywistą nazwę hosta i port z pliku konfiguracji.źródło
/etc/hosts
pliku również będzie działać. Podoba mi się to bardziej, ponieważ (a) nie wymaga eskalacji uprawnień i (b) oznacza, że nie musisz określać numerów portów w wierszu poleceń.~/.ssh/config
(innym porcie dla każdego z nichhosta
hostb
), jak opisano w odpowiedzi Lariego. Podobnie można określić różne nazwy użytkownika, klucze, itp w tym pliku konfiguracyjnym dla różnych hostów więc wszystko co musisz zrobić, w wierszu polecenia jestssh hosta
albossh hostb
HostKeyAlias
dyrektywę zamiast rozdzielać znane hosty na różne pliki. np.HostKeyAlias hosta
Nie mówisz, której wersji Solaris (i, co ważniejsze, SSH), której używasz, ale wystarczająco aktualne wersje OpenSSH rozwiązały ten problem.
Oto dwa wpisy z mojego
known_hosts
pliku, które mają ten sam adres IP, ale różne numery portów (jeden to domyślny 22); jak widać przechowywane klucze nie są takie same.Nie wiem, która wersja OpenSSH to wprowadziła, ale działam
źródło
Aby rozwinąć mój komentarz do odpowiedzi na @larsks, myślę, że używanie
~/.ssh/config
wpisów jest znacznie lepsze niż modyfikowanie / etc / hosts, chociaż wolałbym używaćHostKeyAlias
dzielenia znanych hostów na różne pliki. na przykład:I podobnie dla
hostb
źródło