Problemy z SSH: odczyt z gniazda nie powiódł się: resetowanie połączenia przez partnera

14

Skompilowałem OpenSSH_6.6p1 na jednym z naszych serwerów. Jestem w stanie zalogować się przez SSH do zaktualizowanego serwera. Ale nie mogę się z tego połączyć z innymi serwerami z OpenSSH_6.6p1 lub OpenSSH_5.8. Podczas łączenia pojawia się błąd jak poniżej.

Read from socket failed: Connection reset by peer

Na serwerze docelowym w dziennikach widzę to jak poniżej.

sshd: fatal: Read from socket failed: Connection reset by peer [preauth]

Próbowałem podać parametr cipher_spec [ssh -c aes128-ctr destination-server], jak wspomniano tutaj, i udało mi się połączyć. Jak skonfigurować ssh, aby domyślnie korzystał z szyfru? Dlaczego potrzebny jest tutaj szyfr?

nitiny
źródło
Z serwera, z którego pojawia się ten błąd, co się dzieje, kiedy to robisz telnet ip.or.name.of.offending.server 22?
MadHatter
1
Obie strony wydają się myśleć, że druga strona zamknęła połączenie. W tym momencie wybiłbym tcpdump lub wireshark i uruchomiłbym go na obu końcach.
Michael Hampton
@MadHatter Jestem w stanie telnet na porcie 22 i uzyskać odpowiedź SSH.
nitiny
Spróbuj skompilować poprzednie wersje openssh, takie jak 6.5p1, aby zobaczyć, czy to zachowanie jest spowodowane zmianą bazy kodu?

Odpowiedzi:

7

Problem brzmi jak błąd po stronie serwera. Gdy klient wysyła listę szyfrów, serwer openssh prawdopodobnie oczekuje, że będzie mógł odczytać listę w jednym wywołaniu systemowym.

Jeśli lista obsługiwanych szyfrów jest dłuższa niż może być przesłana w jednym pakiecie, serwer może otrzymać mniej bajtów w pierwszym wywołaniu, niż się spodziewano. Prawidłowym zachowaniem na serwerze byłoby wykonanie innego wywołania w celu uzyskania pozostałej części bajtów. Ale z opisu problemu wynika, że ​​serwer zamiast tego zamyka połączenie, gdy nie otrzyma pełnej listy szyfrów naraz. Kiedy nadejdzie następny pakiet od klienta, serwer wyśle ​​klientowi reset połączenia.

Skonfigurowanie klienta tak, aby używał krótszej listy szyfrów, pomógłby wtedy w obejściu błędu. Klient openssh wyszuka listę szyfrów w następujących miejscach:

  1. W wierszu polecenia za pomocą opcji -c cipher_spec lub -o Ciphers = cipher_spec
  2. W ~ / .ssh / config, określając Ciphers cipher_spec w odpowiedniej sekcji hosta lub przed pierwszym hostem.
  3. W / etc / ssh / ssh_config przy użyciu tego samego formatu, co ~ / .ssh / config
  4. Domyślna lista wbudowana w klienta podczas kompilacji.

Dwa pliki konfiguracyjne dotyczą odpowiednio ustawień użytkownika i całego systemu. Używanie zgodnie z Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbcsugestią Erica powinno działać dobrze.

kasperd
źródło
Czy to znana wada w tej wersji openssh? czy ktoś ma link do narzędzia do śledzenia błędów openssh w związku z tym problemem?
user313114
1
@ user313114 Nie szukałem takiego modułu śledzącego, ponieważ uważam, że błąd został już naprawiony w najnowszych wersjach trzy lata temu, kiedy napisano tę odpowiedź.
kasperd
4

Możesz podać szyfr w pliku konfiguracyjnym ssh (/ etc / ssh / ssh_config lub podobny, zależy od $ PREFIX itp.). Każdą opcję przekazywaną klientowi ssh w wierszu poleceń można ustawić w pliku konfiguracyjnym ssh (klienta).

Oto odpowiedni wiersz (po prostu odkomentuj):

#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc

źródło
3

Mój sposób, aby to naprawić, mam nadzieję, że pomoże komuś:

# Recreate host keys
sudo rm /etc/ssh/ssh_host_*
sudo ssh-keygen -A

# Re-install SSh
sudo apt-get --reinstall install openssh-server openssh-client

Edytuj sshd_config, dodając wartość

add :  MaxAuthTries 3

Edytuj ssh_config, usuwając komentarz z wartości

Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
Jānis Konošonoks
źródło
0

Rozwiązano ten problem, zmieniając poniższe uprawnienia do plików na 600.

/ etc / ssh / ssh_host_dsa_key
/ etc / ssh / ssh_host_rsa_key
/ etc / ssh / ssh_host_ecdsa_key

Zmodyfikowano również uprawnienia do wszystkich innych plików w „/ etc / ssh /” do 644. Wszystkie pliki muszą być własnością „root”.

Poniżej znajduje się pełny zestaw poleceń do przypisywania odpowiednich uprawnień do wszystkich plików w katalogu „/ etc / ssh”:

chown root: root / etc / ssh / * chmod 644 / etc / ssh / *
chmod 600 / etc / ssh / ssh_host_dsa_key
chmod 600 / etc / ssh / ssh_host_rsa_key
chmod 600 / etc / ssh / ssh_host_ecdsa_key

jash
źródło
-1

Mój problem, który miał dokładnie te same objawy, co widzisz, był spowodowany obciętymi kluczami hosta. Spróbuj je odtworzyć za pomocą:

sudo rm /etc/ssh/ssh_host_*
sudo ssh-keygen -A
Srdjan Grubor
źródło