Про PPPoE, MTU и проблеме Path MTU Discovery Black Hole (PMTUD)

Однажды вечером я столкнулся со следующей проблемой: некоторые сайты перестали открываться (большинство), некоторые открывались. При этом пинги и трассировка делались замечательно. ДНС тоже исправно отвечал. В качестве роутера у меня дома linux-сервер (L2TP + iptables + bind9 + isc-dhcp-server). Позвонив в техподдержку провайдера, начал мучать их технических специалистов. По стандартному шаблону они начали все «диагностировать». После того, как я рассказал о том, что ставил другой роутер, менял точку доступа wi-fi, пробовал открывать сайты на разных устройствах, вопросы прекратились. И техподдержка пропала на несколько часов, выясняя причину проблемы…

Когда у меня снова появлось время заняться этим вопросом, я нашел на просторах интернета вот эту замечательную статью, которая полностью отражала суть моей проблемы. Вот цитата:
«Проблема может быть в том, что либо вышестоящий над вашим соединением роутер, либо некий роутер между вами и удаленным сервером, либо сам удаленный веб-сервер могут БЛОКИРОВАТЬ некоторые типы ICMP пакетов, включая ICMP 3:4. Как итог — соединение между хостами устанавливается, но пакеты от одного хоста к другому не доставляются, отбрасяваясь где-то по пути…»

Собственно, на самом роутере у меня так же все было отлично, через lynx я открывал любой сайт в консоли 🙂 Решение для меня оказалось таким же, как и в вышеупомянутой статье.

«Решить проблему можно следующим способом: автоматически уменьшать размер передаваемого пакета на вашем шлюзе, либо с помошью pppd, либо с помощью iptables. При установке TCP-соединения сервер и клиент сообщают друг другу так называемый максимальный размер сегмента (MSS), который каждый из них сможет принять (по умолчанию на 40 байт меньше mtu интерфейса — размер заголовков ip+tcp). И далее каждый из них в рамках этого tcp-соединения посылает пакеты размером не более чем min(mss+[размер заголовков], pmtu). Мы меняем MSS, заставляя обе стороны посылать друг другу tcp-пакеты только таких размеров, которые заведомо пролезут в наш интерфейс без фрагментации. Для iptables есть и модуль снятия бита DF, в случае с ним шлюз бы фрагментировал пакеты… В случае с корректировкой MSS фрагментация просто не требуется, что является более изящным решением.»

Используя pppd: добавить в /etc/ppp/pppoe.conf

CLAMPMSS=1412

Используя iptables: добавить правило

iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Unlix © Все права защищены 2019

Копирование материалов с сайта Unlix.ru без указания полной ссылки на источник ЗАПРЕЩЕНО!