PPTP-тоннель и недоступность сайтов через SSL/HTTPS

PPTP-тоннель и недоступность сайтов через SSL/HTTPS

Если вы столкнулись с проблемой подключения к Интернету через PPTP-сервер, когда через тоннель недоступна часть сайтов, и особенно, если доступ по http работает нормально, а доступ по https к тем же самым узлам отсутствует, то нижеприведенная информация для вас. Например, такая ситуация происходит с VPN-сервисом VPN99.net, а также с частными pptpd, которые часто разворачиваются в «облаках» DigitalOcean, AWS и др. по инструкции вроде этой.

Потратив на эту проблему 2 дня — погуглив, прочесав все форумы, перепробовав массу настроек методом перебора — я нашел корень проблемы. Это параметры MTU/MRU. С одной стороны, это весьма очевидно, но с другой — совершенно нет. Дело в том, что обычно есть проблема с фрагментацией на крупном размере пакета, таком как 1500 байт (что логично). А на размере пакетов, скажем, в 1300-1400 байт такой проблемы быть не должно. Однако, проблема есть и размер пакетов как таковой оказался не критичен. Зато выяснилось, что демон pptpd с дефолтными конфигами имеет некоторые особенности. Например, его актуальные версии, такие как 2.4.5, не реагируют на установку параметров mtu n / mru n в конфигурационном файле. Консольная справка показывает валидность только параметра mru, а mtu, видимо, был исключен из настроек современной версии демона. Но есть другие варианты решения проблемы:

#1. Задать MTU и MRU в PPP-клиенте. Причем, в моем случае, доступ к узлам по SSL появляется только тогда, когда MTU меньше MRU на 4 байта или более. При этом само значение MTU / MRU не критично, любое в интервале 1400-1450 подойдет без проблем. Если PPTP-сервер не ваш, то это единственный доступный способ. Что касается именно 4 байтов, то, возможно, дело в FCS — проверочной последовательности кадра. Что-то там не симметрично при приеме и передаче.

#2. Если ОС ваша, то можно пропатчить скрипт ip-up, выставив в нем жестко значение MTU только для нужного интерфейса. Способ не самый изящный, так как вносятся изменения в системный скрипт ОС. Но решение вполне рабочее, и результат достигается.

#3. Самый красивый вариант для привилегированных пользователей ОС — это активировать согласование MSS (максимального размера сегмента) при помощи ядра ОС и iptables, если они, конечно, поддерживают такую возможность. Одна команда и файрволл возьмет вопрос согласования на себя (синтаксис для CentOS 7.xx).

# iptables -t mangle -A FORWARD -p tcp -m tcp --tcp-flags RST,SYN SYN -j TCPMSS --clamp-mss-to-pmtu

Для того, чтобы все работало, в CentOS 7 нужно выключить firewalld, установить iptables и не забыть сохранить правила, чтобы они работали и после перезагрузки (в интернете есть масса инструкций как это сделать). И этот вариант заработает только в относительно свежей ОС — потребуется ядро Linux версии не ниже 2.4.3 и iptables 1.2.1a или выше.

Поделиться
Отправить
Запинить
Популярное