Назад | Перейти на главную страницу

Время ожидания соединения SSH истекло только для определенных клиентов

У меня есть сервер, который имеет около 100 активных туннельных подключений SSH с клиентских серверов в Канаде и США. Мы используем то же устройство, которое запускает пользовательскую сборку Ubuntu, и загружаем ее на каждый клиентский сервер, который подключается к серверу. Недавно я попытался настроить некоторые из этих клиентских серверов, и я получаю тайм-аут подключения при попытке подключиться к основному серверу с этих клиентских серверов.

Вот некоторые из важных шагов по отладке, которые я предпринял, и их результаты:

  1. Клиентский сервер получает тайм-аут при попытке подключения к главному серверу, даже если он может проверить связь с сервером.
  2. При попытке подключиться по telnet к порту 22 время ожидания соединения истекает вместо получения подтверждения SSH
  3. Я могу подключиться по SSH к любой другой машине с этого клиентского сервера, кроме основного сервера
  4. Другие машины могут подключиться к главному серверу по SSH даже на том же IP-адресе, что и клиентские серверы.
  5. Каждый клиентский сервер имеет ту же сборку ОС, что и другие клиентские серверы.
  6. Существует около 100 активных подключений от других клиентских серверов, которые в настоящее время развернуты с использованием той же конфигурации, но только эти новые испытывают проблему.
  7. Я увеличил максимальное количество попыток подключения по SSH (MaxStartups), а также максимальное количество подключений через сокеты TCP (net.core.somaxconn) до 2000 и 65535 соответственно, и это не улучшило ситуацию.

Я застрял, и мне нужно выяснить, почему это происходит. Любая помощь будет оценена. Спасибо!

После долгих исследований и поисков в Google я смог найти первопричину и, в конечном итоге, исправить. После исключения проблем с сетью и DNS мне остался только протокол. Поскольку Ping работал, а telnet на порт 1 - нет, я знал, что это не может быть проблемой порта. После тестирования трафика как с UDP, так и с TCP, выяснилось, что TCP был единственным протоколом, в котором возникла проблема.

Я побежал tcpdump чтобы проверить пакеты, которыми обмениваются, и я сразу заметил, что от клиента к серверу отправлялся только начальный пакет SYN, а ACK не возвращался. К сожалению, первопричины пока не обнаружено.

Бегом netstat -s до и после попытки нескольких ssh-подключений в течение нескольких попыток единственное значение, которое было отключено, было «Пассивное соединение отклонено из-за отметки времени». я нашел это статья (на японском), который был связан с этой проблемой и предлагал связь с tcp_tw_recycle в среде NAT. В результате был сделан вывод об отключении tcp_tw_recycle, в результате чего количество открытых TCP-соединений удвоилось, и мы смогли решить проблему. Этот ServerFault ответ подробно обсуждает его разветвления.

Надеюсь, этот ответ окажется полезным для кого-то еще, кто столкнется с этим крайним случаем. Кроме того, есть ли у кого-нибудь дополнительные предложения / предупреждения, связанные с этим решением?