Тайм-аут соединения SSH только на определенных клиентах
У меня есть сервер, на котором активно около 100 SSH-туннелей с клиентских серверов в Канаде и США. Мы используем то же устройство, на котором выполняется пользовательская сборка Ubuntu, и загружаем его на каждый клиентский сервер, который подключается к серверу. Недавно я попытался настроить некоторые из этих клиентских серверов и получаю тайм-аут соединения при попытке подключиться к главному серверу с этих клиентских серверов.
Вот некоторые важные шаги по отладке, которые я предпринял, и их результаты:
- Клиентский сервер получает тайм-аут при попытке подключения к главному серверу, даже если он может пропинговать сервер.
- При попытке подключиться к порту 22 через telnet, время ожидания соединения истекает вместо получения подтверждения SSH
- Я могу использовать SSH на любой другой машине с этого клиентского сервера, кроме основного.
- Другие машины могут подключаться по SSH к главному серверу, даже с тем же IP-адресом, что и клиентские серверы.
- Каждый клиентский сервер имеет ту же сборку ОС, что и другие клиентские серверы.
- Существует около 100 активных подключений с других клиентских серверов, развернутых в настоящее время с использованием той же конфигурации, но только эти новые испытывают проблему
- Я увеличил максимальное количество попыток подключения SSH (MaxStartups), а также максимальное количество подключений TCP-сокетов (net.core.somaxconn) до 2000 и 65535 соответственно, и это не улучшило ситуацию
Я застрял и должен выяснить, почему это происходит. Любая помощь будет оценена. Спасибо!
1 ответ
После большого количества исследований и поисков в Google, я смог найти причину и, в конечном итоге, исправить. После исключения проблем с сетью и DNS я остался только с протоколом. Поскольку Ping работал, а telnet к порту 1 - нет, я знал, что это не может быть проблемой порта. После тестирования трафика с использованием UDP и TCP оказалось, что TCP был единственным протоколом, в котором возникла проблема.
Я побежал tcpdump
чтобы проверить пакеты, которыми обменивались, и я сразу заметил, что только исходный пакет SYN отправлялся от клиента к серверу, и ACK не возвращался. К сожалению, первопричины пока не найдено.
Запустив netstat -s
до и после попытки нескольких соединений ssh в течение нескольких испытаний единственное значение, которое было отключено, было "Пассивное соединение отклонено из-за отметки времени". Я нашел эту статью (на японском языке), которая была связана с этой проблемой, и предложил связь с tcp_tw_recycle в среде NAT. В результате был сделан вывод об отключении tcp_tw_recycle, вследствие чего число открытых TCP-соединений удвоилось, и мы смогли решить эту проблему. В этом ответе ServerFault подробно обсуждаются его последствия.
Надеюсь, этот ответ окажется полезным для кого-то еще, кто в конечном итоге имеет дело с этим крайним случаем. Кроме того, есть ли у кого-нибудь дополнительные предложения / предупреждения, связанные с этим решением?