Однажды вечером я столкнулся со следующей проблемой: некоторые сайты перестали открываться (большинство), некоторые открывались. При этом пинги и трассировка делались замечательно. ДНС тоже исправно отвечал. В качестве роутера у меня дома 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