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