Чаму поўная блакіроўка 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 было неабходным, але не дастатковым.