OpenVPN: Как смягчить проблемы MTU пути для каждого клиента?

14

У нас есть десятки встроенных устройств, установленных у клиентов, и все они звонят домой в нашу службу OpenVPN. В целом это работает нормально, но у некоторых наших клиентов есть серьезные проблемы с MTU. Наше влияние на клиентов по исправлению их сетей ограничено, поэтому нам необходим OpenVPN для решения этой проблемы. В двух словах, мой вопрос:

Как я могу смягчить MTU низкого пути некоторых клиентов на основе для каждого клиента, то есть без использования глобальных настроек, учитывающих наихудший случай для всех клиентов

Обратите внимание, что в нашем худшем случае это довольно плохо: путь MTU 576, отбрасывает все фрагменты, не фрагментирует себя, не учитывает DF-бит. Вы понимаете, почему я предпочел бы не решать эту проблему глобально.

Страница руководства OpenVPN предлагает ряд опций, связанных с MTU, в частности --link-mtu, --tun-mtu, --fragment and --mssfix. Но это также говорит

--link-mtu [...] Лучше не устанавливать этот параметр, если вы не знаете, что делаете.

--tun-mtu [...] Лучше всего использовать опции --fragment и / или --mssfix для решения проблем с размером MTU.

Таким образом , я начал экспериментировать с --fragmentи , --mssfixно вскоре должен был понять , что по крайней мере первая должна быть установлена не только на стороне клиента, но также и на стороне сервера . Затем я посмотрел на серверной конфигурации для каждого клиента через, --client-config-dirно он говорит

Следующие параметры допустимы в контексте, специфичном для клиента: --push, --push-reset, --iroute, --ifconfig-push и --config.

Никаких упоминаний о параметрах MTU!

Итак, вот мои более конкретные вопросы:

  • Почему именно это link-mtuи не tun-mtuрекомендуется? Каковы потенциальные проблемы с этими вариантами? Обратите внимание, что мне вполне комфортно с низким уровнем IP-заголовков.
  • Какие из параметров link-mtu tun-mtu fragment mssfixдолжны быть отражены на стороне сервера, чтобы работать?
  • Какой из вариантов link-mtu tun-mtu fragment mssfixможно использовать в client-config-dir?
  • В случае, если все четыре варианта должны быть зеркально отражены на стороне сервера и не могут использоваться внутри client-config-dir: Есть ли альтернативы для борьбы с MTU по низкому пути на клиента?

Примечания:

  • Спросили Части моих вопросов уже 5 лет назад здесь , но они на самом деле не были , то огрызались, поэтому я смею их дублировать.
  • Сервер OpenVPN в настоящее время 2.2.1 на Ubuntu 12.04. Мы готовим обновление до 2.3.2 на Ubuntu 14.04
  • Клиенты OpenVPN являются 2.2.1 на Debian 7.6
  • Я рад, что сам определяю путь клиента-MTU вручную
  • В настоящее время мы не можем тестировать много на стороне сервера. Но мы строим полный отдельный испытательный стенд, должен быть готов в ближайшее время.

Я благодарен за любые полезные советы.

Нильс Тёдтманн
источник
1
576? Уважаемый Gawd. Я не видел MTU так низко со времен дозвона. Это идет по древней последовательной связи?
Майкл Хэмптон
Не могли бы вы запустить два сервера OpenVPN? Возможно, вы могли бы запустить оба сервера на одном и том же общедоступном IP-адресе и использовать переадресацию портов (или политику маршрутизации) для перенаправления клиентов на другой сервер OpenVPN в зависимости от того, находятся ли они в известной проблемной сети или нет (как определено списком клиентов). IP-адреса).
Касперд
1
@MichaelHampton Я тоже удивился. Это> 600 кбит / с и RTT ~ 30 мс, для меня это не похоже на древний сериал. Учитывая, что у них есть другие глупые настройки (например, не отвечает на DF с «необходимостью фрагментации»), я думаю, это просто еще один. Мы сказали им, но еще не ответили.
Нильс Тёдтманн
@kasperd интересная идея. Я мог бы запустить несколько экземпляров сервера OpenVPN. Возможно, придется иметь 3 или 4 для разных диапазонов MTU. NAT на стороне сервера не будет работать (я не могу предсказать динамические общедоступные IP-адреса клиентов), но мне все равно придется изменить конфигурацию клиента для настроек MTU (правильно?), Поэтому я просто настрою другой порт прямо в клиента. - Но это был бы кошмар обслуживания, которого я предпочел бы избежать!
Нильс Тёдтманн
@NilsToedtmann Какие критерии вы бы использовали, чтобы определить, на каких клиентов это влияет? Другим подходом может быть запуск сценария на сервере после подключения клиента. Сценарий может попытаться пропинговать IP-адрес клиента с разными размерами пакетов, чтобы выяснить, какие из них работают, а какие - нет. Затем он может вставить iptablesправила, чтобы уменьшить MSS на всех пакетах SYN с или на этот IP-адрес клиента.
Касперд

Ответы:

3

Я решил проблему на стороне клиента, добавив опцию mssfix 1300 в файл конфигурации.

Со страницы руководства openvpn:

--mssfix max
    Announce to TCP sessions running over the tunnel that they should limit their send packet sizes such that after OpenVPN has encapsulated them, the resulting UDP packet size that OpenVPN sends to its peer will not exceed max bytes. 

Оригинальная идея для моего решения пришла от personalvpn.org

Oz123
источник
1
Так mssfixможно установить только на стороне клиента? Ну, это как минимум. Хотя это не помогает с пакетами UDP (именно поэтому меня интересовали другие варианты, но по крайней мере рекомендуемые fragmentдолжны быть установлены и на стороне сервера)
Nils Toedtmann
2
mssfix может быть добавлен как на сервере, так и на клиенте. Однако меньшее значение будет использоваться в переговорах
Ахмед
2

Учитывая отсутствие ответов, я публикую сейчас решение, которое не очень элегантно, но просто: запустить другой экземпляр OpenVPN по TCP для «плохих клиентов»

proto tcp

и снизить TCP MSS на клиенте, например

iptables -t mangle -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN -o ${OUT_DEV} -j TCPMSS --set-mss ${PATH-MTU-MINUS-40}

Преимущество этого решения заключается в том, что каждый клиент может установить свою индивидуальную MSS.

Это по общему признанию TCP-over-TCP, но это должно работать достаточно хорошо во многих сценариях .

Обратите внимание, что мне все еще очень интересны решения, которые не требуются proto tcp, и я отмечу их как действительный ответ, если они более или менее соответствуют моим изложенным требованиям.

Нильс Тёдтманн
источник