Dlaczego moje logowanie SSH jest wolne?


95

Widzę opóźnienia w logowaniach SSH. W szczególności są 2 miejsca, w których widzę zakres od natychmiastowych do wielosekundowych opóźnień.

  1. Pomiędzy wydaniem komendy ssh a wyświetleniem monitu logowania i
  2. między wprowadzeniem hasła a obciążeniem pocisku

Teraz konkretnie patrzę na szczegóły ssh tylko tutaj. Oczywiście opóźnienia sieciowe, szybkość sprzętu i systemów operacyjnych, złożone skrypty logowania itp. Mogą powodować opóźnienia. Dla kontekstu przesyłam ssh do wielu dystrybucji Linuksa i niektórych hostów Solaris, używając głównie Ubuntu, CentOS i MacOS X jako moich systemów klienckich. Prawie cały czas konfiguracja serwera ssh pozostaje niezmieniona w stosunku do domyślnych ustawień systemu operacyjnego.

Jakie konfiguracje serwera ssh powinny mnie zainteresować? Czy istnieją parametry systemu / jądra, które można dostroić? Logowanie do sztuczek shellowych? Itp?


korzystasz z kont lokalnych? - czasami stwierdzam, że uwierzytelnianie pam może opóźnić logowanie się za pomocą ssh
Sirex

Zwykle konta lokalne. Czasami NIS.
Peter Lyons,

Odpowiedzi:


122

Spróbuj ustawić UseDNSsię now /etc/sshd_configlub /etc/ssh/sshd_config.


7
+1, która jest najczęstszą przyczyną opóźnienia podczas logowania do ssh
Matthias Krull

2
„Uwaga dotycząca systemu Solaris 11: wypróbowałem ustawienie UseDNS no w systemie Solaris 11 i spowodowało to uszkodzenie usługi. Niezupełnie przyjazna reakcja usługi. YMMV z innymi wariantami * Nix, ale wydaje się, że UseDNS nie może być prawidłową opcją w systemie Solaris 11 . ” - komentarz Keitha Hoffmana
Sathyajith Bhat

3
Byłem sceptyczny, ponieważ logowałem się przy użyciu adresu IP (domowej sieci LAN), ale to rozwiązanie rozwiązało mój problem. Ze względu na Google, choć miało to miejsce tuż po tym, opóźnienie nie miało nic wspólnego z komunikatem „klucz: /home/mylogin/.ssh/id_ecdsa ((zero))” (podczas działania ssh -vvv).
Skippy le Grand Gourou

2
+1 za wyjaśnienie, plik /etc/ssh/sshd_config! Dodawałem /etc/sshd_configi nie widziałem żadnej różnicy !!
vyom

1
@SkippyleGrandGourou: Niektóre wersje Solaris używały zmodyfikowanego OpenSSH, zwanego SunSSH, który miał pewne irytujące niezgodności. Solaris 11.3 dodaje OpenSSH z powrotem, a SunSSH zostanie ostatecznie usunięty ...
Gert van den Berg

37

Kiedy uruchomiłem ssh -vvvserwer o podobnej niskiej wydajności, zobaczyłem zawieszenie się tutaj:

debug1: Next authentication method: gssapi-with-mic

Edytując /etc/ssh/ssh_configi komentując tę ​​metodę uwierzytelniania, przywróciłem wydajność logowania do normy. Oto, co mam na swoim /etc/ssh/ssh_configserwerze:

GSSAPIAuthentication no

Możesz ustawić to globalnie na serwerze, aby nie akceptował uwierzytelnienia GSSAPI. Wystarczy dodać GSSAPIAuthentication nodo /etc/ssh/sshd_configna serwerze i zrestartować usługę.


Stało się tak w przypadku moich serwerów RHEL5 po skonfigurowaniu logowania winbind / ad.
Czad

Działa to dla mnie na serwerze Ubuntu 14.04.
Penghe Geng

Dla CentOS 7, należy ustawić zarówno GSSAPIAuthentication noi UseDNS now /etc/ssh/sshd_configpliku.
Sunry

19

Dla mnie winowajcą była rozdzielczość IPv6, upłynął limit czasu. (Chyba złe ustawienie DNS u mojego dostawcy hosta.) Odkryłem to, robiąc ssh -v, co pokazało, który krok się zawiesił.

Rozwiązaniem jest sshz -4opcją:

ssh -4 me@myserver.com


2
Podejrzewam, że coraz więcej z nas to zobaczy w miarę upływu czasu i rzeczy (źle i) powoli dostosowują się do IPV6. Dzięki!
mędrzec

1
... a ta odpowiedź jest szczególnie nieprzydatna bez komunikatu debugowania, który potwierdza, że ​​jest to problem.
PE

Z mojego doświadczenia wynika, że ​​jest to bardzo częsty problem, gdy SSH nasłuchuje na interfejsach dualstack i pierwszą rzeczą, którą sprawdzam, kiedy mogę się zalogować, ale zajmuje to więcej czasu niż oczekiwano.
Mogget

Czy jest szansa, że ​​uda nam się naprawić IPv6 zamiast domyślnego IPv4?
msrd0

Jest to prawdopodobnie powód, dla którego UseDNS brak odpowiedzi działa. użycie -vvv pokazuje tylko pauzę debug2: resolving "thing.net.au" port 22bez żadnego błędu, ale nie dzieje się tak z opcją -4, co oznacza, że ​​jest to problem z DNS IPv6.
pmc

16

W systemie systemd logowanie może się zawiesić na komunikacji dbus z logind po niektórych aktualizacjach, wtedy musisz zrestartować logind

systemctl restart systemd-logind

Widziałem to na debian 8, arch linx i na liście suse


1
Och, wow, teraz to był winowajca! Wielkie dzięki!
mahatmanich,

Dla mnie to samo. Zajęło trochę czasu, aby najpierw wykluczyć wszystkie możliwe problemy z DNS i SSH. Uwaga: jeśli problem dotyczy również powolnego sudo, spróbuj tego najpierw.
Michael

Właśnie ukończyłem niektóre uaktualnienia w miejscu z RHEL6 do RHEL7 i zauważyłem ten problem. Ta odpowiedź rozwiązała również mój problem.
user53029

dziękuję bardzo, to działa jak urok.
Namo Nam

9

Zawsze możesz zacząć sshod -vopcji, która wyświetla bieżące działania.

$ ssh -v you@host

Z podanych przez ciebie informacji mogę jedynie zasugerować niektóre konfiguracje po stronie klienta:

  • Ponieważ piszesz, że wprowadzasz hasła ręcznie, sugeruję, aby w miarę możliwości używać uwierzytelniania za pomocą klucza publicznego. To usuwa cię jako wąskie gardło prędkości.

  • Możesz także wyłączyć przekazywanie X za pomocą -xi przekazywanie uwierzytelnień za pomocą -a(te mogą być już domyślnie wyłączone). Zwłaszcza wyłączenie X-forwarding może dać dużą poprawę prędkości, jeśli twój klient musi uruchomić X-serwer dla sshpolecenia (np. Pod OS X).

Wszystko inne naprawdę zależy od tego, jakiego rodzaju opóźnień doświadczasz gdzie i kiedy.


Dobra wskazówka na temat gadatliwości, możesz ją również zwiększyć, mając więcej v. Do 3 IIRC.
vtest

7

Jeśli chodzi o 2. punkt, oto odpowiedź, która nie wymaga modyfikacji serwera ani nie wymaga uprawnień administratora / administratora.

Musisz edytować plik „user ssh_config”, który jest:

vi $HOME/.ssh/config

(Uwaga: musisz utworzyć katalog $ HOME / .ssh, jeśli nie istnieje)

I dodaj:

Host *
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

W razie potrzeby możesz to zrobić dla każdego hosta :) przykład:

Host linux-srv
  HostName 192.158.1.1
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Upewnij się, że adres IP odpowiada adresowi IP twojego serwera. Jedną fajną zaletą jest to, że teraz ssh zapewni autouzupełnianie dla tego serwera. Możesz więc wpisać ssh lin+ Tabi powinien on zostać automatycznie uzupełniony ssh linux-srv.


4

Sprawdź /etc/resolv.confna serwerze, aby upewnić się, że serwer DNS wymieniony w tym pliku działa poprawnie i usuń niedziałający DNS.

Czasami jest to bardzo pomocne.


2

Poza wspomnianymi już problemami z DNS, jeśli łączysz się z serwerem z wieloma podłączeniami NFS, może wystąpić opóźnienie między hasłem a pytaniem, gdy quotapolecenie sprawdzi twoje użycie / przydział we wszystkich systemach plików, które nie zostały zamontowane z noquota. W systemach Solaris można to zobaczyć domyślnie /etc/profilei pominąć, uruchamiając touch $HOME/.hushlogin .


1

Dobrze pracować.

# uname -a
SunOS oi-san-01 5.11 oi_151a3 i86pc i386 i86pc Solaris
# ssh -V
Sun_SSH_1.5, SSH protocols 1.5/2.0, OpenSSL 0x009080ff
# echo "GSSAPIAuthentication no" >> /etc/ssh/sshd_config
# echo "LookupClientHostnames no" >> /etc/ssh/sshd_config
# svcadm restart ssh

UseDNS nie nie działa z OpenIndiana !!!

Przeczytaj „man sshd_config” dla wszystkich opcji

„LookupClientHostnames nie”, jeśli serwer nie może rozwiązać problemu


1

Jeśli żadna z powyższych odpowiedzi nie działa i masz problemy z wyszukiwaniem wstecznym dns, możesz również sprawdzić, czy nscd(demon pamięci podręcznej usługi nazw) jest zainstalowany i uruchomiony.

Jeśli to jest problem, to dlatego, że nie masz pamięci podręcznej dns, i za każdym razem, gdy pytasz o nazwę hosta, która nie znajduje się w pliku hosta, wysyłasz pytanie do serwera nazw zamiast szukać w pamięci podręcznej

Wypróbowałem wszystkie powyższe opcje i jedyną działającą zmianą był start nscd.

Powinieneś także zweryfikować kolejność, aby /etc/nsswitch.confnajpierw rozstrzygnąć zapytanie dns, aby użyć pliku hosts.


1

Prawdopodobnie jest to specyficzne tylko dla Debian / Ubuntu OpenSSH, który obejmuje tryb user-group-types.patch napisany przez jednego z opiekunów pakietów Debiana. Ta poprawka pozwala plikom ~ / .ssh ustawić bit zapisu grupowego (g + w), jeśli jest tylko jeden użytkownik z takim samym identyfikatorem gid jak plik. Sprawdza to funkcja secure_permissions () łatki. Jedną z faz sprawdzania jest przejście przez każdą pozycję passwd za pomocą getpwent () i porównanie gid pozycji z gid pliku.

W systemie z wieloma wpisami i / lub powolnym uwierzytelnianiem NIS / LDAP sprawdzanie będzie powolne. nscd nie buforuje wywołań getpwent (), więc każdy wpis passwd będzie czytany przez sieć, jeśli serwer nie jest lokalny. W systemie znalazłem to, dodałem około 4 sekund dla każdego wywołania ssh lub logowania do systemu.

Rozwiązaniem jest usunięcie zapisywalnego bitu na wszystkich plikach w ~ / .ssh przez wykonanie chmod g-w ~/.ssh/*.


1

Odkryłem, że ponowne uruchomienie systemd-logind.service wyleczyło problem tylko przez kilka godzin. Zmiana UsePAM z tak na no w sshd_config spowodowała szybkie logowanie, chociaż motd nie jest już wyświetlany. Komentarze na temat problemów bezpieczeństwa?


Przeszedłem KAŻDĄ inną sugestię tutaj i to jest jedyna rzecz, która naprawiła problem na moim serwerze włączania Samba4 ... DZIĘKI!
Deven Phillips

OSTRZEŻENIE: „UsePAM nie” nie jest obsługiwane w systemie Red Hat Enterprise Linux i może powodować szereg problemów.
bbaassssiiee

1

Aby wypełnić wszystkie odpowiedzi wskazujące, że rozdzielczości DNS mogą spowolnić logowanie ssh, czasami brakuje reguł zapory. Na przykład, jeśli DROP domyślnie usuwasz wszystkie paquety WEJŚCIA

iptables -t filter -P INPUT DROP

wtedy musisz zaakceptować WEJŚCIE dla portu ssh i żądania DNS

iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

1

ssh -vvv połączenie poszło naprawdę dobrze, dopóki nie zawiesiło się w systemie próbującym uzyskać terminal przez co najmniej 20 sekund:

debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
... waiting ... waiting ... waiting

Po wykonaniu systemctl restart systemd-logind na serwerze ponownie miałem natychmiastowe połączenie!

To było na debian8 ! Problemem był systemd!

Uwaga: Bastien Durel udzielił już odpowiedzi na ten problem, jednak brakuje mu informacji o debugowaniu. Mam nadzieję, że to komuś pomoże.


Miałem ten sam problem z „Wprowadzanie sesję interaktywną” wisi na RHEL7 CentOS (7) i rozwiązać go przez zakomentowanie session [default=1] pam_lastlog.so nowtmp showfailedw /etc/pam.d/postlogin. Najwyraźniej aktualizacja pliku lastlog była niesamowicie powolna na moim opartym na kontenerach OpenVZ VPS.
Justin ᚅᚔᚈᚄᚒᚔ

1

Niedawno znalazłem inną przyczynę powolnego logowania ssh.

Nawet jeśli masz UseDNS now /etc/sshd_config, sshd może nadal wykonywać wyszukiwania wstecznego DNS czy /etc/hosts.denyposiada wpis w stylu:

nnn-nnn-nnn-nnn.rev.some.domain.com

Może się tak zdarzyć, jeśli w systemie są zainstalowane DenyHosts .

Byłoby wspaniale, gdyby ktoś wiedział, jak zmusić DenyHosts do unikania wprowadzania tego rodzaju wpisów /etc/hosts.deny.

Oto link do FAQ DenyHosts , w jaki sposób usuwać wpisy z /etc/hosts.deny- patrz Jak mogę usunąć adres IP, który zablokował DenyHosts?


1

Może się okazać, że preferowaną metodą rozpoznawania nazw nie jest plik hosta, a następnie DNS.

Na przykład byłaby to zwykła konfiguracja:

[root@LINUX1 ~]# cat /etc/nsswitch.conf|grep hosts
#hosts:     db files nisplus nis dns
hosts:      files dns myhostname

Najpierw osiągnięto plik hosts (opcja: pliki), a następnie DNS (opcja: dns), jednak możemy stwierdzić, że dodano inny system rozpoznawania nazw, który nie działa i powoduje, że próbujemy wykonać odwrotną rozdzielczość.

Jeśli kolejność rozpoznawania nazw jest nieprawidłowa, możesz ją zmienić w: /etc/nsswitch.conf

Wyodrębniono z: http://www.sysadmit.com/2017/07/linux-ssh-login-lento.html


1

Próbowałem wszystkich odpowiedzi, ale żadna z nich nie zadziałała. w końcu odkrywam mój problem:

najpierw uruchamiam, sudo tail -f /var/log/auth.log żeby zobaczyć dziennik ssh, a następnie w innym uruchomieniu sesji ssh 172.16.111.166i zauważyłem, że czekam

/usr/bin/sss_ssh_knownhostsproxy -p 22 172.16.111.166

po przeszukaniu zlokalizowałem ten wiersz w / etc / ssd / ssh_config

ProxyCommand /usr/bin/sss_ssh_knownhostsproxy -p %p %h

Skomentowałem to i opóźnienie minęło


1

Uwaga: Zaczęło się to od samouczka „Jak debugować”, ale ostatecznie stało się rozwiązaniem, które pomogło mi na serwerze LTS Ubuntu 16.04.

TLDR : Uruchom landscape-sysinfoi sprawdź, czy wykonanie polecenia zajmuje dużo czasu; to wydruk informacji o systemie przy nowym logowaniu SSH. Zauważ, że to polecenie nie jest dostępne we wszystkich systemach, landscape-commonpakiet je instaluje. („Ale czekaj, jest więcej ...”)


Uruchom drugi serwer ssh na innym porcie komputera, na którym występuje problem, zrób to w trybie debugowania, który nie rozwinie go i wydrukuje komunikaty debugowania:

sudo /usr/sbin/sshd -ddd -p 44321

połącz się z tym serwerem z innego komputera w trybie pełnym:

ssh -vvv -p 44321 username@server

Mój klient wyświetla następujące wiersze tuż przed snem:

debug1: Entering interactive session.
debug1: pledge: network

Googlowanie, które nie jest tak naprawdę pomocne, ale logi serwera są lepsze:

debug3: mm_send_keystate: Finished sending state [preauth]
debug1: monitor_read_log: child log fd closed
debug1: PAM: establishing credentials
debug3: PAM: opening session
---- Pauses here ----
debug3: PAM: sshpam_store_conv called with 1 messages
User child is on pid 28051

Zauważyłem, że po przejściu UsePAM yesna UsePAM noten problem został rozwiązany.

Niepowiązane UseDNSani żadne inne ustawienie, UsePAMwpływa tylko na ten problem w moim systemie.

Nie mam pojęcia dlaczego, a ja też nie pozostawiając UsePAMna no, ponieważ nie wiem, których skutki uboczne są, ale to pozwala mi kontynuować śledztwo.

Więc proszę, nie uważaj tego za odpowiedź, ale za pierwszy krok, aby dowiedzieć się, co jest nie tak.


Więc kontynuowałem badanie i uruchomiłem sshdz strace( sudo strace /usr/sbin/sshd -ddd -p 44321). To dało następujące:

sendto(4, "<87>Nov 20 20:35:21 sshd[2234]: "..., 110, MSG_NOSIGNAL, NULL, 0) = 110
close(5)                                = 0
stat("/etc/update-motd.d", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
umask(022)                              = 02
rt_sigaction(SIGINT, {SIG_IGN, [], SA_RESTORER, 0x7f15dce784b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f15dce784b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0x7ffde6152d2c) = 2385
wait4(2385, # BLOCKS RIGHT HERE, BEFORE THE REST IS PRINTED OUT # [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2385

Linia /etc/update-motd.dwzbudziła we mnie podejrzenia, najwyraźniej proces czeka na wynik tego, co jest w środku/etc/update-motd.d

Więc cdbyłyby do /etc/update-motd.di prowadził sudo chmod -x *w celu zahamowania PAM uruchomić wszystkie pliki, które generują ten dynamiczny Message Of The Day, który obejmuje obciążenie systemu i jeśli pakiety muszą zostać zmodernizowane, i to rozwiązało problem.

Jest to serwer oparty na „energooszczędnym” procesorze N3150, który ma dużo pracy do wykonania 24 godziny na dobę, 7 dni w tygodniu, więc myślę, że zebranie wszystkich tych danych motd było dla niego po prostu za dużo.

Mogę zacząć włączać skrypty w tym folderze selektywnie, aby zobaczyć, które są mniej szkodliwe, ale specjalne wywoływanie landscape-sysinfojest bardzo wolne i 50-landscape-sysinfowywołuje to polecenie. Myślę, że właśnie to powoduje największe opóźnienie.

Po ponownym uaktywnieniem większość plików doszedłem do wniosku, że 50-landscape-sysinfoi 99-esmbyły przyczyną moich kłopotów. 50-landscape-sysinfowykonanie zajęło około 5 sekund i 99-esmokoło 3 sekund. Wszystkie pozostałe pliki łącznie około 2 sekund.

Ani 50-landscape-sysinfoi nie 99-esmsą kluczowe. 50-landscape-sysinfodrukuje ciekawe statystyki systemowe (a także jeśli masz mało miejsca!) i 99-esmdrukuje wiadomości związane zUbuntu Extended Security Maintenance

Wreszcie możesz utworzyć skrypt za pomocą echo '/usr/bin/landscape-sysinfo' > info.sh && chmod +x info.shi uzyskać ten wydruk na żądanie.


1

Wątek ten już zapewnia wiele rozwiązań, ale mojego nie ma tutaj =). Więc oto jest. Mój problem (zalogowanie się przez ssh do mojego malinowego pi zajęło około 1 minuty), był spowodowany uszkodzeniem pliku .bash_history. Ponieważ plik jest odczytywany przy logowaniu, spowodowało to opóźnienie logowania. Po usunięciu pliku czas logowania wrócił do normy, jak natychmiast.

Mam nadzieję, że pomoże to innym osobom.


0

Dla mnie potrzebowałem GSSAPI i nie chciałem wyłączać wyszukiwania wstecznego DNS. To po prostu nie był dobry pomysł, więc sprawdziłem stronę główną dla resolv.conf. Okazuje się, że zapora ogniowa między mną a serwerami, do których byłem SSHing, zakłócała ​​żądania DNS, ponieważ nie były w takiej formie, jakiej oczekiwała zapora. Ostatecznie wszystko, co musiałem zrobić, to dodać ten wiersz do resolv.conf na serwerach, do których byłem SSHing:

options single-request-reopenW pobliżu


0

Co ciekawe, aktualizacja pakietu wiązania na CentOS 7 uległa awarii, teraz w dzienniku stwierdzono, że /etc/named.conf miał problem z uprawnieniami. Od miesięcy działał dobrze z 0640. Teraz chce 0644. Ma to sens, ponieważ nazwany demon należy do „nazwanego” użytkownika.

Po nazwaniu wszystko działało wolno, od logowania ssh do obsługi strony z lokalnego serwera WWW, powolnych aplikacji LAMP itp., Prawdopodobnie dlatego, że każde żądanie przekroczyło limit czasu na martwym serwerze lokalnym, zanim przejdzie do skonfigurowanego zewnętrznego, dodatkowego DNS.


0

Dla mnie wystąpił problem w moim lokalnym /etc/hostspliku. Więc sshstarałem dwa różne IP (jeden niewłaściwy), które trwało wieki do time-out.

Za pomocą ssh -vzrobił trick tutaj:

$ ssh -vvv remotesrv
OpenSSH_6.7p1 Debian-5, OpenSSL 1.0.1k 8 Jan 2015
debug1: Reading configuration data /home/mathieu/.ssh/config
debug1: /home/mathieu/.ssh/config line 60: Applying options for remotesrv
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to remotesrv [192.168.0.10] port 22.
debug1: connect to address 192.168.0.10 port 22: Connection timed out
debug1: Connecting to remotesrv [192.168.0.26] port 22.
debug1: Connection established.

/etc/hostsSerwera?
Daniel F
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.