2010-07-22 07:02:00 +0000 2010-07-22 07:02:00 +0000
103
103

Почему мой вход в SSH медленный?

Я вижу задержки в SSH Logins. В частности, есть 2 места, где я вижу диапазон от мгновенных до многосекундных задержек.

  1. Между выдачей команды ssh и получением приглашения на вход и
  2. между вводом ключевой фразы и загрузкой оболочки

сейчас, точнее, я смотрю подробности ssh только здесь. Очевидно, что сетевая задержка, скорость аппаратного обеспечения и операционных систем, сложные сценарии входа и т.д. могут вызывать задержки. Для контекста я обращаюсь ssh к огромному количеству дистрибутивов linux и некоторым хостам Solaris, использующим в основном Ubuntu, CentOS и MacOS X в качестве моих клиентских систем. Почти все время конфигурация сервера ssh не меняется по сравнению с настройками ОС по умолчанию.

Какие конфигурации ssh сервера должны меня заинтересовать? Есть ли параметры ОС/ядра, которые можно настроить? Трюки с оболочкой для входа в систему? И т.д.?

Ответы (22)

130
130
130
2010-07-22 08:38:59 +0000

Попробуйте установить UseDNS на no в /etc/sshd_config или /etc/ssh/sshd_config.

39
39
39
2010-09-22 17:42:34 +0000

Когда я запустил ssh -vvv на сервере с такой же медленной производительностью, я увидел здесь зависание:

debug1: Next authentication method: gssapi-with-mic

Редактируя /etc/ssh/ssh_config и комментируя этот метод аутентификации, я вернул производительность входа в систему к нормальной. Вот что у меня есть в моем /etc/ssh/ssh_config на сервере:

GSSAPIAuthentication no

Вы можете установить это глобально на сервере, чтобы он не принимал GSSAPI для аутентификации. Просто добавьте GSSAPIAuthentication no в /etc/ssh/sshd_config на сервере и перезапустите службу.

21
21
21
2015-08-14 00:50:20 +0000

Для меня преступником было разрешение IPv6, это был тайм-аут. (Плохая настройка DNS у моего хост-провайдера, наверное.) Я обнаружил это, сделав ssh -v, которая показала, какой шаг висит.

Решением будет ssh с опцией -4:

ssh -4 me@myserver.com

16
16
16
2015-05-21 09:41:03 +0000

В случае с systemd, вход в систему может зависнуть при взаимодействии с dbus с помощью логина после некоторых обновлений, затем вам нужно перезапустить логин

systemctl restart systemd-logind

Видел это на debian 8, arch linx, и в списке suse

9
9
9
2010-07-22 08:28:05 +0000

Вы всегда можете запустить ssh с опцией -v, которая отображает то, что делается в данный момент.

$ ssh -v you@host

С помощью предоставленной вами информации я могу предложить только некоторые конфигурации клиентской стороны:

  • Так как вы пишете, что вводите пароли вручную, я бы предложил использовать аутентификацию по открытому ключу, если это возможно. Это удалит вас как узкое место в скорости.

  • Вы также можете отключить переадресацию X с помощью -x и переадресацию аутентификации с помощью -a (по умолчанию они уже могут быть отключены). Особенно отключение X-forwarding может дать вам большое улучшение скорости, если вашему клиенту нужно запустить X-сервер для команды ssh (например, под OS X).

Все остальное действительно зависит от того, какие задержки вы испытываете где и когда.

7
7
7
2012-06-29 07:41:22 +0000

Что касается пункта 2., вот ответ, который не требует ни изменения сервера, ни наличия привилегий root/administrative.

Вам нужно отредактировать ваш файл “user ssh_config”, а именно:

vi $HOME/.ssh/config

(Замечание: вам нужно создать каталог $HOME/.ssh, если его нет)

И добавить:

Host *
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Вы можете сделать это на основе для каждого хоста, если необходимо :) пример:

Host linux-srv
  HostName 192.158.1.1
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials yes

Убедитесь, что IP-адрес совпадает с IP-адресом вашего сервера. Одним из замечательных преимуществ является то, что теперь ssh обеспечит автозаполнение для этого сервера. Поэтому вы можете ввести ssh lin + Tab и он должен быть автозавершен до ssh linux-srv.

4
4
4
2017-06-08 07:57:20 +0000

Проверьте /etc/resolv.conf на сервере, чтобы убедиться, что DNS-сервер, указанный в этом файле, работает нормально, и удалите все нерабочие DNS.

Иногда это очень полезно.

2
2
2
2010-07-22 14:24:59 +0000

Помимо уже упомянутых проблем с DNS, если вы подключаетесь к серверу с большим количеством подключений NFS, то может возникнуть задержка между вводом пароля и запросом, так как команда quota проверяет использование/запрос на всех файловых системах, не подключенных к noquota. На системах Solaris это можно увидеть в стандартной /etc/profile и пропустить, запустив команду touch $HOME/.hushlogin .

1
1
1
2013-05-02 23:01:07 +0000

Если ни один из вышеперечисленных ответов не работает, и вы сталкиваетесь с проблемами обратного поиска dns, вы также можете проверить, установлен ли и запущен ли демон кэш-памяти nscd (name service cache daemon).

Если это проблема, то это потому, что у вас нет кэша dns, и каждый раз, когда вы запрашиваете имя хоста, которого нет в вашем профиле хоста, вы посылаете вопрос на ваш сервер имен вместо того, чтобы искать его в вашем кэше

Я перепробовал все вышеперечисленные опции, и единственным изменением, которое сработало, был запуск nscd.

Вы также должны проверить порядок разрешения запросов dns в /etc/nsswitch.conf, чтобы сначала использовать хост-файл.

1
1
1
2015-10-13 01:19:43 +0000

Вероятно, это специфично только для Debian/Ubuntu OpenSSH, который включает user-group-modes.patch, написанный одним из сопровождающих пакета Debian. Этот патч позволяет файлам ~/.ssh иметь набор битов для групповой записи (g+w), если есть только один пользователь с таким же gid, как и в этом файле. Функция патча secure_permissions() выполняет эту проверку. Один из этапов проверки - просмотреть каждую запись в passwd с помощью getpwent() и сравнить gid записи с gid файла.

В системе с большим количеством записей и/или медленной NIS/LDAP аутентификацией эта проверка будет медленной. nscd не кэширует вызовы getpwent(), поэтому каждая запись passwd будет читаться по сети, если сервер не локален. В системе, которую я нашел, было добавлено около 4 секунд на каждый вызов ssh или вход в систему.

Исправление заключается в удалении записываемого бита на всех файлах в ~/.ssh, выполнив chmod g-w ~/.ssh/*.

1
1
1
2018-11-20 19:15:56 +0000

Примечание: Это началось как “Как отлаживать”, учебник, но закончилось тем, что решение, которое помогло мне на сервере LTS Ubuntu 16.04.

TLDR : Запустите landscape-sysinfo и проверьте, не занимает ли эта команда много времени; это распечатка системной информации при новом входе в SSH. Обратите внимание, что эта команда доступна не на всех системах, пакет landscape-common устанавливает ее. (“But wait, there’s more…”)


Запустите второй сервер ssh на другом порту на машине, на которой есть проблема, сделайте это в отладочном режиме, который не сделает его вилкой и распечатает отладочные сообщения:

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

подключитесь к этому серверу с другой машины в подробном режиме:

ssh -vvv -p 44321 username@server

Мой клиент выводит следующие строки прямо перед началом сна:

debug1: Entering interactive session.
debug1: pledge: network

Googleling, что не очень полезно, но логи сервера лучше:

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

Я заметил, что когда я меняю UsePAM yes на UsePAM no, то эта проблема решается.

Не связанная с UseDNS или какими-либо другими параметрами, только UsePAM влияет на эту проблему в моей системе.

я понятия не имею, почему, и я также не оставляю UsePAM на no, потому что я не знаю, какие побочные эффекты, но это позволяет мне продолжить исследование.

Так что, пожалуйста, не считайте это ответом, а первым шагом к тому, чтобы начать выяснять, что не так.


Так что я продолжил расследование, и запустил sshd с strace (sudo strace /usr/sbin/sshd -ddd -p 44321). Это привело к следующему:

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

Строка /etc/update-motd.d вызывала у меня подозрения, очевидно, что процесс ждет результата, который есть в /etc/update-motd.d

Так что я cd вошёл в /etc/update-motd.d и запустил sudo chmod -x *, чтобы запретить PAM запускать все файлы, которые генерируют этот динамический Message Of The Day, который включает в себя загрузку системы, и если пакеты нужно обновить, то это решило проблему.

Это сервер, основанный на “энергоэффективном” процессоре N3150, которому предстоит много работы 24 часа в сутки 7 дней в неделю, поэтому я думаю, что сбор всех этих motd-данных был просто слишком большим для него.

Я могу начать выборочно включать скрипты в этой папке, чтобы посмотреть, какие из них менее вредны, но особенно вызов landscape-sysinfo очень медленный, и 50-landscape-sysinfo действительно вызывает эту команду. Я думаю, что именно это и вызывает наибольшую задержку.

После перезагрузки большинства файлов я пришел к выводу, что 50-landscape-sysinfo и 99-esm были причиной моих проблем. Выполнение 50-landscape-sysinfo заняло около 5 секунд, а 99-esm около 3 секунд. Все остальные файлы в сумме заняли около 2 секунд.

Ни 50-landscape-sysinfo, ни 99-esm не являются решающими. 50-landscape-sysinfo печатает интересную системную статистику (а также, если у вас мало места!), и 99-esm печатает сообщения, связанные с Ubuntu Extended Security Maintenance

Наконец, вы можете создать скрипт с echo '/usr/bin/landscape-sysinfo' > info.sh && chmod +x info.sh и получить эту распечатку по запросу.

1
1
1
2017-07-22 08:21:56 +0000

Я перепробовал все ответы, но ни один из них не сработал. Наконец, я обнаружил свою проблему:

сначала я запустил sudo tail -f /var/log/auth.logso я вижу журнал ssh, затем в другом сеансе я запустил ssh 172.16.111.166 и заметил ожидание

/usr/bin/sss_ssh_knownhostsproxy -p 22 172.16.111.166

после поиска я нашел эту строку в /etc/ssd/ssh_config

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

& я прокомментировал это и задержка исчезла.

1
1
1
2012-04-25 13:37:42 +0000

Прекрасно работаешь.

# 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 не работают с OpenIndiana !!!!

Читайте “man sshd_config” для всех опций

“LookupClientHostnames no” если ваш сервер не может разрешить

1
1
1
2017-03-04 22:38:38 +0000

Соединение ssh -vvv прошло действительно хорошо, пока оно не зависло на системе, пытаясь получить терминал как минимум на 20 секунд:

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

После того, как я сделал systemctl restart systemd-logind на сервере, у меня снова было мгновенное соединение!

Это было на debian8! Итак, проблема была в systemd!

Note: Бастьен Дюрель (Bastien Durel) уже дал ответ на этот вопрос, однако ему не хватает отладочной информации. Надеюсь, это кому-нибудь поможет.

1
1
1
2017-07-09 09:12:53 +0000

Мы можем обнаружить, что предпочтительным методом разрешения имен является не хост-файл, а затем DNS.

Например, это будет обычная конфигурация:

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

Сначала достигается хост-файл (опция: файлы), а затем DNS (опция: dns), однако мы можем обнаружить, что была добавлена другая система разрешения имен, которая не работает и вызывает у нас медлительность при попытке сделать обратное разрешение.

Если порядок разрешения имен неправильный, вы можете изменить его: /etc/nsswitch.conf

Извлекается из: http://www.sysadmit.com/2017/07/linux-ssh-login-lento.html

1
1
1
2018-01-03 15:02:47 +0000

Эта нить уже предоставляет кучу решений, но мое здесь не дано =). Так что вот оно. Моя проблема (заняла около 1 минуты на ssh вход в мою малиновую пи), была связана с поврежденным файлом .bash_history. Так как файл читается при входе в систему, это вызвало задержку входа в систему. Как только я удалил файл, время входа вернулось в нормальное состояние, как мгновенно.

Надеюсь, это поможет другим людям.

1
1
1
2016-12-06 09:24:08 +0000

Чтобы заполнить все ответы, показывающие, что DNS разрешения могут замедлять вход в систему ssh, иногда отсутствуют правила брандмауэра. Например, если вы DROP всех пакеток INPUT по умолчанию

iptables -t filter -P INPUT DROP

, то вам придется принять INPUT для ssh порта и DNS запроса

iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
```.
1
1
1
2016-10-24 21:49:02 +0000

Недавно я нашел еще одну причину медленного входа в систему ssh.

Даже если у вас есть UseDNS no в /etc/sshd_config, sshd все равно может выполнять обратный DNS поиск, если в /etc/hosts.deny есть запись типа:

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

Это может произойти, если у вас в системе установлена DenyHosts .

Было бы здорово, если бы кто-нибудь знал, как заставить DenyHosts не ставить такую запись в /etc/hosts.deny.

Вот ссылка на “Часто задаваемые вопросы по DenyHosts” , о том, как удалить записи из /etc/hosts.deny - смотрите “Как удалить IP-адрес, который блокировал DenyHosts?”.

1
1
1
2016-07-13 22:35:37 +0000

Я обнаружил, что перезапуск systemd-logind.service вылечил проблему всего на несколько часов. Изменение UsePAM с yes на no в sshd_config привело к быстрым входам в систему, хотя motd больше не отображается. Комментарии по поводу проблем с безопасностью?

0
0
0
2015-05-21 13:01:07 +0000

Для меня была проблема в моем местном файле /etc/hosts. Так что ssh пробовал два разных IP (один неправильный), что заняло целую вечность до тайм-аута.

Использование ssh -v сделало трюк здесь:

$ 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.
0
0
0
2014-08-28 11:41:40 +0000

Для меня был нужен GSSAPI, и я не хотел отключать обратный просмотр DNS. Это просто не казалось хорошей идеей, поэтому я проверил главную страницу для resolv.conf. Оказалось, что брандмауэр между мной и серверами, на которые я работал в SSHing, вмешивался в DNS запросы, потому что они не были в той форме, которую ожидал брандмауэр. В конце концов, все, что мне нужно было сделать, это добавить эту строку для resolv.conf на серверах, для которых я выполнял SSHing:

options single-request-reopen

0
0
0
2016-12-13 17:07:11 +0000

Примечательно, что пакет обновления привязки на CentOS 7 сломался по имени, теперь в журнале указано, что /etc/named.conf имеет проблему с разрешениями. Он работал хорошо в течение нескольких месяцев с 0640. Теперь он хочет 0644. Это имеет смысл, так как именованный демон принадлежит “именованному” пользователю.

С именем вниз все было медленно, от входа ssh до обслуживания страниц с локального веб сервера, вялых LAMP приложений и т.д., скорее всего потому, что каждый запрос будет таймаут на мертвом локальном сервере перед тем, как обратиться к внешнему, вторичному DNS, который настроен.

Похожие вопросы

6
10
19
12
6