Угнежђени VPN тунели: зашто унутрашњи застаје на великим пакетима
Сваки тунел троши део буџета пакета путање пре него што следећи почне. Саберите заглавља и унутрашња сесија пада на великим пакетима.
DNS се разрешава, SSH сесија остаје, а затим велико отпремање замрзне док ping ка истом домаћину још увек одговара. То раздвајање указује на величину пакета, а не на покварен тунел. Угнежђени тунели то достижу при величинама које ниједан тунел сам не би достигао. Унутрашња сесија је у реду; само јој се предају пакети који више не стају.
Куда MTU путање заправо одлази
Свака инкапсулација троши бајтове пре него што следећи слој добије ред. Ethernet путања нуди 1500 бајтова спољашњем пакету, а спољашњи тунел узима свој део пре него што се било шта унутра може адресирати. Једна нагађана вредност заглавља биће погрешна тачно за онолико колико је важно.
Наведите слојеве по реду: приступна путања, спољашњи транспорт, спољашњи тунел, унутрашњи транспорт, унутрашњи тунел, апликација. Бројте свако заглавље једном и држите UDP одвојено од властитог заглавља тунела и његове ознаке.
Два WireGuard слоја, бројана једном
Узмите IPv4 приступну путању са једним WireGuard тунелом унутар другог. Спољашњи слој кошта 20 бајтова IPv4, 8 за UDP и 32 за WireGuard заглавље података плус његову ознаку провере. Унутар тога унутрашњем тунелу треба властито 20-бајтно IPv4 заглавље и 8-бајтно UDP заглавље пре његових других 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 интерфејса ограничава шта ће интерфејс емитовати, док TCP MSS стезање мења шта је TCP партнер вољан да пошаље. Стезање поправља TCP сесије и не чини ништа за велики UDP датаграм, тако поправка изгледа успешна за једну апликацију и тихо промаши следећу. Властита опција фрагментације протокола је трећа полуга са својим неуспесима. MTU интерфејса је уобичајен први потез и најгрубљи.
Премосни и рутирани тунели носе различите оквире, па се бројеви из другог постављања ретко преносе. Откривање MTU путање, описано у RFC 8201, помаже само док су ICMP поруке од којих зависи пропуштане.
Проналажење слоја коме недостаје
Проверите сваки тунел засебно пре угнежђивања, ако захтеви дозвољавају поређење. Сонда фиксне величине то решава: ping -M do -s 1472 -c 3 10.8.0.1 шаље пун IPv4 пакет од 1500 бајтова унутар тог слоја. Додајте други слој и поновите исту сонду, да сваки неуспех припада познатој промени.
Када се пренос заглави, мењајте један документовани параметар одједном и бележите величину на којој пада. Проверите и повратну путању, јер угнежђена рекурзија рута може опонашати проблем величине пакета довољно близу да кошта цело поподне. Филтриран ICMP одговор може сакрити праву границу, зато је сонда важнија од закључивања.
Запишите буџет тамо где ће га следећа особа наћи
Табела са једним редом по слоју надживи правило по сећању. Држите је уз дијаграм тунела да нико не понавља аритметику под притиском.
Више тунела значи више зависности, па план враћања унатраг заслужује место уз буџет. Ако се бројеви још не слажу, измерите путању уместо да поново нагађате. Циљ је бројка коју можете бранити, не запамтити.