Полдня на баг, которого «нет»
Давно ничего не выкладывал — сейчас небольшой завал, про него расскажу отдельно в ближайшее время. А пока история из разряда «у всех работает, а у меня нет».
На днях перестал открываться внутренний GitLab. Вкладка висит и падает в ERR_TIMED_OUT. У коллег всё нормально, поддержка отвечает, что со стороны сервиса всё в порядке — и формально они правы.
Дальше начинается странное:
— curl по тому же адресу отвечает 302, то есть сервер доступен — по IP и по http страница открывается — не работает только https и только из браузера
Разбирал по шагам, сузилось до одного: MTU.
Корпоративный VPN поднимает интерфейс и сообщает системе, что максимальный размер пакета — 1400 байт. По факту через туннель проходит только 1380. Всё, что больше, молча теряется. Обычно про это прилетает служебное ICMP-сообщение «пакет слишком большой» и система сама подстраивается — но такие пакеты режет файрвол по пути. Классическая MTU blackhole: данные исчезают, и никто об этом не сообщает. Отправитель просто ждёт ответа до таймаута.
Самое интересное — почему это вылезло только сейчас. Ошибка в MTU была там всё время, просто никто не отправлял достаточно больших пакетов. А потом Chrome перешёл на постквантовый обмен ключами (X25519 + ML-KEM), и первое сообщение TLS-рукопожатия выросло примерно с 500 байт до 1600. Оно перестало влезать в туннель. Отсюда и вся картина: curl с его компактным ClientHello работал, а браузер — нет.
Лечится двумя вещами: MTU 1380 на интерфейсе и MSS clamping. Обязательно и в цепочке forward — иначе ровно то же самое поймают Docker-контейнеры, и composer install из внутреннего репозитория будет виснуть уже по собственной причине.
Отдельно про процесс. Разбирался я в диалоге с Claude, и ценность была не в том, что он знал ответ — он его не знал. Ценность в том, что он не дал мне свернуть на удобную ложную дорожку: я всерьёз собирался переезжать на другой дистрибутив, потому что «ну наверное дело в Fedora». Вместо этого получил последовательность проверок, где каждая отсекала гипотезу. От «кажется, у меня сломана система» до точной причины — часа полтора.
Практический вывод, забирайте:
Если что-то открывается через curl, но висит по таймауту в браузере — проверяйте MTU. ping -M do -s 1352 внутренний-хост Проходит на 1352 и не проходит на 1400 — вы нашли свою проблему.
А про то, чем сейчас занят и почему пропал, — напишу, расскажу в ближайшее время.