Чому блокування всього ICMP ламає робочий шлях VPN
Повідомлення зворотного зв'язку про розмір — це не відповіді ping. Коли вони не надходять, малі пакети проходять, великі зникають, і тунель виглядає мерехтливим.
Тунель, який проходить автентифікацію, переносить ping і потім зависає на першій великій передачі, — класична ознака відсутнього повідомлення ICMP, а не зламаного VPN. Відправник так і не дізнається, що пакет був завеликий, повторює той самий розмір, а застосунок чекає. Виправлення — це рішення політики міжмережевого екрана, а не перевстановлення клієнта. Порядок важливий: виміряйте, де межа розміру, потім звузьте правило, яке проковтнуло звіт.
Що ICMP насправді переносить на цьому шляху
Виявлення MTU шляху IPv4 спирається на те, що маршрутизатор повідомляє: пакет зі встановленим бітом don't-fragment не вдалося переслати. Це повідомлення ICMP Fragmentation Needed, і без нього відправник не має причини зменшувати розмір сегмента. IPv6 суворіший: маршрутизатори не фрагментують у транзиті, тому повідомлення ICMPv6 Packet Too Big — єдиний сигнал, який змушує відправника зменшуватися.
Обидва повідомлення — зворотний зв'язок площини керування, і жодне не є діагностичним відлунням. Політика, що блокує ping, і політика, що блокує весь ICMP, виглядають схоже у списку правил, але в мережі поводяться зовсім по-різному. Друга може перетворити правильно розрахований тунель на односторонній шлях для всього, що більше за найменшу ланку в ланцюгу.
Деякі транспорти реалізують власне виявлення зондуючими пакетами, як описує RFC 4821, і вони менше залежать від цього зворотного зв'язку. Це аргумент перевірити, який транспорт ви використовуєте, а не припускати, що кожен тунель несприйнятливий.
| Повідомлення | Призначення на шляху | Якщо заблоковано |
|---|---|---|
| ICMPv4 тип 3 код 4 | Пакет був завеликий для наступної ланки | Відправник повторює спроби і зависає |
| ICMPv6 тип 2 | Packet Too Big, еквівалент для IPv6 | Те саме зависання, без резервної фрагментації |
| ICMP тип 11 | Час вичерпано, використовує traceroute | Діагностика втрачає переходи, трафік продовжує йти |
| Запит і відповідь відлуння ICMP | Перевірка доступності | Ping не проходить, шлях може бути гаразд |
Збій залежить від розміру
Запитайте, чи пов'язаний збій із розміром пакета. Сторінка входу, запит DNS і короткий виклик API проходять, а завантаження файлу, велика відповідь або завантаження зображення зависають. Ця картина вказує на обмеження розміру десь між двома кінцями, а не на автентифікацію чи маршрутизацію. Успішний малий ping майже нічого не каже про те, де ця межа.
Усередині тунелю треба враховувати два рівні: пакет корисного навантаження і зовнішній інкапсульований пакет. Внутрішній відправник може поводитися правильно, поки зовнішній шлях менший, ніж припускає тунель, тому важливі і власне налаштування MTU тунелю, і фізична ланка під ним.
Виміряйте перед редагуванням правил
Зондуйте з бітом don't-fragment і обраним вами розміром корисного навантаження, від несправного клієнта до захищеної адреси:
ping -M do -s 1472 10.20.5.7
ping -M do -s 1300 10.20.5.7
Корисне навантаження 1472 байти плюс 28 байтів заголовків — це пакет 1500 байтів. Якщо великий зонд не проходить з помилкою фрагментації, а менший проходить, ви знайшли межу; врахуйте накладні витрати тунелю і повторюйте, доки робочий розмір не стане стабільним.
Потім переконайтеся, що розрив — це сам звіт. Якщо зонд не проходить тихо, без помилки й без відповіді, повідомлення, найімовірніше, відкидається, а не доставляється, і підозрюваним є правило.
Звузьте правило, потім перевірте завдання ще раз
Виправлення має дозволяти конкретні керівні повідомлення, а не весь протокол. На хості з iptables форма — це дозвіл для конкретного типу; адаптуйте синтаксис до того, що керує міжмережевим екраном на вашій платформі:
iptables -I INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT
ip6tables -I INPUT -p icmpv6 --icmpv6-type packet-too-big -j ACCEPT
Залиште відповіді відлуння заблокованими, якщо це місцева політика, бо шляху вони не потрібні. Потім перевірте передачу, яка спочатку не вдалася, з нового з'єднання і переконайтеся, що лічильники правила показують надходження повідомлень.
Якщо велика передача все ще зависає після дозволу повідомлень, залишкове обмеження в іншому місці: завеликий MTU тунелю, проксі, що переписує пакети, або проміжний пристрій, який відкидає замість того, щоб повідомляти. Правило ICMP було необхідним, але не достатнім.