?

Log in

No account? Create an account
Previous Entry Share Next Entry
kvazimoda24

Непонятки с OpenVPN

Сегодня потратил несколько часов на поиски неисправности. Починить починил, но что это было так и не понял. Как и не понял, на моей ли стороне был косяк.


Схема следующая.
Есть локальная 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". Но повторюсь, возвращение этих параметров не приводит к изначальной проблеме.
Вот я теперь сижу и думаю, что это было, и на моей ли стороне?...

Всех причастных с уже прошедшим праздником.


  • 1
Здравствуйте!
Система категоризации Живого Журнала посчитала, что вашу запись можно отнести к категориям: IT, Лытдыбр.
Если вы считаете, что система ошиблась — напишите об этом в ответе на этот комментарий. Ваша обратная связь поможет сделать систему точнее.
Фрэнк,
команда ЖЖ.

Хм... Может ещё "магия"? :)

В комменты призываются @klink0v и @rustedowl!

Шо? Я на кофейной гуще не гадаю. Нет науки там, где нет воспроизводимости результата - а тут уже все работает :)

Да вот и я как-то потерялся даже :)
Есть, конечно, пара теорий, но проверить их не выходит, т.к. не ломается больше.

Вот-вот
Свет с Венеры отразился от верхних слоев атмосферы и вызвал сбой OpenVPNа :)

Да просто космические лучи. Повезло, и пролетающее мимо нейтрино всё же провзаимодействовало с ячейкой памяти :)

Можно меня не звать, я этот журнал и так читаю.

Насколько я могу понять / догадаться из описанного.

1. Я знаю кучу случаев, когда NAT провайдера некорректно / плохо обрабатывает UDP-пакеты. Особенно раньше этим грешило Акадо-какадо. Как сейчас, не знаю. Таких пациентов вообще на TCP приходилось переводить.
2. OpenVPN по умолчанию использует UDP-флаг "IP more fragments". Я встречал провайдеров, которые тупо рубят такие пакетики "из соображений безопасности". Причем часто симптомы себя вообще никак не проявляют до какого-то внезапного момента, который зависит от пропускаемого внутри тоннеля трафика.
3. Возможно, ты не пишешь в конфигах клиентов "nobind", из-за чего они подрались за один и тот же номер порта для исходящего соединения (src port).

По всем трём предположкниям мимо, т.к. все туннели у меня по tcp и nobind прописан.
Да и если бы пров что-то специально рубил, то оно бы само не починилось.
Я больше склоняюсь к какому-то хитрому глюку моего роутера, а перезагрузка не помогла, т.к. у него есть аппаратный NAT, который может неправильно сбрасывается. Когда же я отключил туннель на роутере, пришёл пакет FIN или RST, что заставило сбросить соединение. Но точно ли это глюк моего роутера, а не провайдерского, я не знаю, и проверить не получится до следующего раза.
Это одна из моих теорий.

И, конечно, мой косяк, что конфиги OpenVPN не выложил. Если интересно, могу попозже добавить к посту, но там всё довольно стандартно за исключением использования tcp.

Edited at 2019-07-27 04:04 pm (UTC)

  • 1