Зависание SSH или проблемы с MTU
- Просмотров: 4597
- Комментариев: 2
- Подписаться на обновления
- Печатать
- Поделиться
Недавно столкнулся со следующей проблемой: подключение к одному из серверов SSH постоянно намертво зависает. Пока вывод небольшой 4-5 строк, все работает нормально... Попытки вывести больше строк или открыть файл в редакторе в 90% случаев приводят к зависанию сеанса, без какой либо возможности его оживить...
Собственно способ диагностики проблемы, а так же мое решение я и опишу.
Поиски на просторах глобальной сети дали следующий результат: проблемы с MTU (максимальный размер блока данных что передается одним пакетом). Ну и симптомы мои вполне подходили... пока передается не большой объем данных, все нормально, как только объем превышает определенный предел - все! Висим...
Немножко о архитектуре моей сети... Я буду описывать только те параметры и интерфейсы, что имеют значение, остальное для простоты отброшу. Итак, есть 2 сервера на FreeBSD 8.2:
Сервер 1:rl0: ip нет, mtu 1500 (интерфейс смотрит в сторону провайдера, используется для PPPoE подключения)
ng0: ip 10.10.10.10, mtu 1460 (PPPoE соединение к провайдеру, с честным адресом, клиент MPD5)
ng1: ip 20.20.20.1, mtu 1400 (интерфейс для входящего VPN соединения от Сервер 2, в качестве сервера MPD5)
Сервер 2:vr0: ip 192.168.100.1, mtu 1500 (интерфейс смотрит в сторону провайдера, честного адреса нет)
ng0: ip 20.20.20.2, mtu 1400 (VPN соединение к Сервер 1, клиент MPD5)
Соединение SSH идет от Сервер 1 к Сервер 2. На первый взгляд проблем нет... везде оставлен зазор для заголовка пакета (порядка 20 байт) и проблем быть не должно. (Если честно, то сначала у меня на интерфейсе ng0 на Сервер 2 был mtu 1460, но потом для полной согласованности был изменен на 1400. Только проблему это не решило). Но ведь есть еще промежуточное оборудование, которое обеспечивает физическое соединение между серверами.
Нам нужно выяснить максимальный размер пакета, который проходит без проблем, для этого проведем ряд экспериментов: будем пинговать Сервер 2 с Сервер 1 с разным размером пакета.ping -s 1400 20.20.20.2
Значение параметра -s (размер пакета) постепенно уменьшаем до тех пор, пока не получим отклик от сервера. Я пробовал 1400, 1300, 1200, 1100, 1000... только на значении 1000 я получил отклик. Проверка промежуточных значений показала, что максимальный размер пакета, что проходит через данное соединение составляет 1004 байта.
На обоих серверах (для интерфейса ng1 на Сервер 1 и для интерфейса ng0 на Сервер 2) в параметрах соединения я указал MTU как 1000 байт и все заработало. Больше не было обрывов и зависаний... Но... Работа между серверами была медленной, были большие задержки. Не знаю с чем это связано, но эксперименты показали, что оптимальным MTU является 800. При таком значении параметра все работает быстро и стабильно.
Спасибо dmishkin за помощь в сетевой архитектуре и методах диагностики. Спасибо ZibenUA за помощь при работе с редактором sed.