Сегодня потратил несколько часов на поиски неисправности. Починить починил, но что это было так и не понял. Как и не понял, на моей ли стороне был косяк.
Схема следующая.
Есть локальная Linux машина, которая занимается раздачей инета и вообще организацией сети. Для стабильной работы интернета подключено два провайдера. В силу территориальных особенностей нормальный провайдер, с которым можно нормально контактировать и у них адекватная тех. поддержка, один. Второй же пров. так себе, они мне даже прямой IP дать не смогли. Работает - хорошо, сломался - подождём полдня-день, если не завелось, то можно попробовать позвонить, авось починят.
Соответственно, основная работа ведётся через первого провайдера, при поломках переключаемся на второго. Поломки детектим самописным скриптом, который пингует пару адресов в инете.
Ещё, для удалённого доступа к этой машине по IPMI был установлен роутер ZyXEL и на нём поднят OpenVPN туннель на удалённый сервер. Исторически сложилось, что роутер подключен ко второму (плохому) провайдеру. Т.е. наша локальная машина к этому провайдеру подключается через этот роутер.
Так же, для обхода блокировок и для удалённого доступа во внутреннюю сеть, на нашей машине поднят туннель до того же удалённого сервера по средствам тоже OpenVPN. Для надёжности и бесперебойной работы туннелей поднято два - по одному на каждого провайдера. И с обоих концов они объеденены бондингом. Используется mode 3 (broadcast), т.е. пакеты синхронно отправляются в оба интерфейса (туннеля).
Эта система хорошо себя зарекомендовала, работает у меня в нескольких местах. Но вот сегодня в одном из мест заметил проблему. Проблема изначально проявилась в тот момент, когда поломался основной провайдер. Пользователи мне позвонили и пожаловались, что интернет работает, но нет доступа к тем ресурсам, которые, как я знаю, должны работать через туннель. С основным провайдером я быстро всё выяснил, они практически сразу после звонка заработали. Но я стал выяснять, что же там такое с моим туннелем.
Через некоторое время копаний выяснилось следующее. OpenVPN клиент на локальной машине прекрасно соединяется с удалённым сервером. На обоих концах я вижу, что соединение устанавливается без ошибок. Но дальше, т.к. у меня прописана опция "keepalive 10 30", через примерно 30 секунд OpenVPN сервер пишет в логи, что нет ответных пингов, я ресечусь. Потом снова уставнавливается соединение, и картина повторяется так до бесконечности.
Более глубокий анализ с tcpdump'ом показал интересную ситуацию. Внутри туннеля пакеты ходят только в одну сторону от сервера к клиенту. Трафик же который отправляется в инет оказался ещё более интересным. Когда устанавливается соединение, то происходит нормальный обмен пакетами, всё ходит в обе стороны и без проблем. Вроде как, нормально происходит обмен пакетами, когда по туннелю идут пакеты от сервера к клиенту, но вот когда идёт пакет от клиента к серверу, то от клиента я вижу, что пакеты ушли в сторону моего роутера, а на сервере я их уже не вижу.
Т.е. чтобы пояснить подробнее. Я запускаю на удалённом сервере пинги внутритуннельного адреса клиента, т.к. туннелей два, то ответы мне приходят в любом случае, но когда всё работает, я должен видеть на каждый свой запрос четыре ответа, а я вижу в течении 30 секунд два ответа, потом перерыв на 15-40 секунд (пока сервер перезапускается и переустанавливается соединение), где я вижу только один ответ, потом снова на 30 секунд по два ответа. При этом на физическом интерфейсе удалённого сервера я вижу как исходящие пакеты, так и немного ответных от клиента, но они чётко коррелериют с моими пингами. Со стороны клиента же на физическом же интерфейсе я вижу ГОРАЗДО больше исходящих пакетов, т.к. идёт работа, и кроме пингов там идёт полезный трафик, но они до сервера не доходят.
К сожалению, я не догодался воткнуться между роутером и провайдером, чтобы посмотреть, а что уходит с моего роутера. При этом, вообще самое первое что я сделал, даже ещё до проведения диагностики, это перезагрузил роутер и обновил прошивку на последнюю, которую он предложил.
Починилось же всё очень странно. Я отключил туннель, который был поднят на роутере, и тут же у меня всё забегало по проблемному туннелю. Повторное включение туннеля на роутере не повторяет проблему. Клиент OpenVPN использовался встроенный в прошивку, точнее он там ставится прям из Web-интерфейса, и там же конфигурируется. После обнаружения проблемы исправил пару странных параметров в конфиге (наверное остались от прошлых изысканий), из необычного для меня это "verb 5" вместо "verb 3" и в меню настройки стояла галочка "Подстройка TCP-MSS". Но повторюсь, возвращение этих параметров не приводит к изначальной проблеме.
Вот я теперь сижу и думаю, что это было, и на моей ли стороне?...
Всех причастных с уже прошедшим праздником.