У нас есть десятки встроенных устройств, установленных у клиентов, и все они обращаются к нашей службе 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 для каждого клиента?Ноты:
Я благодарен за любой полезный совет.
Я решил проблему на стороне клиента, добавив опцию 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
Учитывая отсутствие ответов, я публикую сейчас решение, которое не очень элегантно, но просто: запустить другой экземпляр 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
, и я отмечу их как действительные, если они более или менее соответствуют моим изложенным требованиям.