Укладзеныя тунелі VPN: чаму ўнутраны спыняецца на вялікіх пакетах
Кожны тунель выдаткавае частку бюджэту пакетаў шляху перш чым пачнецца наступны. Складзіце загалоўкі, і ўнутраны сеанс зрываецца на вялікіх пакетах.
DNS вырашаецца, сеанс SSH трымаецца, а потым вялікая выгрузка замірае, хаця ping да таго ж хоста ўсё яшчэ адказвае. Гэтае раздзяленне паказвае на памер пакета, а не на зламаны тунель. Укладзеныя тунелі дасягаюць гэтага пры памерах, якіх ні адзін тунель асобна не дасягнуў бы. Унутраны сеанс у парадку; яму проста перадаюць пакеты, якія ўжо не змяшчаюцца.
Куды насамрэч сыходзіць MTU шляху
Кожная інкапсуляцыя выдаткавае байты перш чым наступны ўзровень атрымае чаргу. Шлях Ethernet прапануе 1500 байтаў вонкаваму пакету, і вонкавы тунель забірае сваю долю перш чым нешта ўнутры яго можна адрасаваць. Адно ўгаданае значэнне накладных выдаткаў будзе памылковым роўна на тую велічыню, якая мае значэнне.
Пералічыце ўзроўні па парадку: шлях доступу, вонкавы транспарт, вонкавы тунель, унутраны транспарт, унутраны тунель, праграма. Палічыце кожны загаловак адзін раз і трымайце UDP асобна ад уласнага загалоўка тунеля і яго тэга.
Два ўзроўні WireGuard, палічаныя адзін раз
Вазьміце шлях доступу IPv4 з адным тунелем WireGuard унутры іншага. Вонкавы ўзровень каштуе 20 байтаў IPv4, 8 — UDP і 32 — загаловак даных WireGuard разам з тэгам аўтэнтыфікацыі. Унутры гэтага ўнутранаму тунелю патрэбны ўласны загаловак IPv4 на 20 байтаў і загаловак UDP на 8 байтаў перад яго другімі 32 байтамі накладных выдаткаў WireGuard. Што засталося, змяшчае загаловак IPv4, загаловак TCP і даныя. Вонкавы шлях IPv6 каштуе 40 замест 20 і пакідае 1320.
| Layer | Bytes |
|---|---|
| Path MTU | 1500 |
| Outer IPv4 header | 20 |
| Outer UDP header | 8 |
| Outer WireGuard header and tag | 32 |
| Inner transport IPv4 header | 20 |
| Inner UDP header | 8 |
| Inner WireGuard header and tag | 32 |
| Innermost IPv4 header | 20 |
| TCP header | 20 |
| Payload that fits | 1340 |
Арыфметыка даходзіць да 1340 байтаў. Адзін узровень па тых жа правілах пакідае 1400 для карысных даных TCP, гэта значыць 1500 мінус 20, 8, 32, 20 і 20, а розніца ў 60 байтаў — гэта менавіта ўнутраная інкапсуляцыя, якую дадае другі тунель.
Прымяніце 1400 да ўкладзенага шляху, і ўнутраны тунель недабірае 60 байтаў, незаўважна, пакуль пакет не стане дастаткова вялікім, каб іх спатрэбіцца. Запаўненне і ўласная опцыя фрагментацыі пратакола зноў зрушваюць лічбы, таму давярайце табліцы.
MTU, MSS і фрагментацыя дзейнічаюць у розных месцах
MTU інтэрфейса абмяжоўвае тое, што інтэрфейс выпусціць, а сцісканне MSS у TCP змяняе тое, што TCP-партнёр гатовы адправіць. Сцісканне выпраўляе сеансы TCP і нічога не робіць для вялікай дэйтаграмы UDP, менавіта так выпраўленне выглядае паспяховым для адной праграмы і моўчкі прапускае наступную. Уласная опцыя фрагментацыі пратакола — гэта трэці рычаг са сваімі адмовамі. MTU інтэрфейса — агульны першы крок і самы грубы.
Маставыя і маршрутызаваныя тунелі нясуць розныя кадры, таму лічбы з іншага разгортвання рэдка пераносяцца. Выяўленне MTU шляху, апісанае ў RFC 8201, дапамагае толькі пакуль ICMP-паведамленні, ад якіх яно залежыць, прапускаюцца.
Пошук узроўня, якому не хапае
Праверце кожны тунель асобна перад укладаннем, калі патрабаванні дазваляюць параўнанне. Зонд фіксаванага памеру вырашае гэта: ping -M do -s 1472 -c 3 10.8.0.1 адпраўляе поўны пакет IPv4 на 1500 байтаў унутры гэтага ўзроўня. Дадайце другі ўзровень і паўтарыце той жа зонд, каб любая адмова належала вядомай змене.
Калі перадача спыняецца, змяняйце адзін дакументаваны параметр за раз і запісвайце памер, на якім яна зрываецца. Праверце і зваротны шлях, бо ўкладзеная рэкурсія маршрутаў можа праймітаваць праблему памеру пакета дастаткова блізка, каб каштаваць паўдня. Адфільтраваны адказ ICMP можа схаваць сапраўдную мяжу, таму зонд важнейшы за разважанні.
Запішыце бюджэт там, дзе яго знойдзе наступны чалавек
Табліца з адным радком на ўзровень жыве даўжэй за правіла на памяць. Трымайце яе побач са схемай тунеля, каб ніхто не пералічваў арыфметыку пад ціскам.
Больш тунеляў — больш залежнасцей, таму план адкату заслугоўвае месца побач з бюджэтам. Калі лічбы ўсё яшчэ не складаюцца, вымерайце шлях замест чарговага здагадвання. Мэта — лічба, якую вы можаце абараніць, а не запомніць.