Ligzdotie VPN tuneļi: kāpēc iekšējais apstājas pie lielām paketēm
Katrs tunelis iztērē daļu ceļa pakešu budžeta, pirms sākas nākamais. Saskaitiet galvenes un iekšējā sesija neizdodas pie lielām paketēm.
DNS atrisinās, SSH sesija turas, un tad liels augšupielāde iesalst, kamēr ping uz to pašu hostu joprojām atbild. Šī šķirtne norāda uz paketes izmēru, nevis bojātu tuneli. Ligzdotie tuneļi to sasniedz tādos izmēros, kādus neviens tunelis viens pats nesasniegtu. Iekšējā sesija ir kārtībā; tai vienkārši tiek nodotas paketes, kas vairs neietilpst.
Kur īsti aiziet ceļa MTU
Katra iekapsulēšana iztērē baitus, pirms nākamais slānis saņem savu kārtu. Ethernet ceļš piedāvā ārējai paketei 1500 baitus, un ārējais tunelis paņem savu daļu, pirms kaut ko tā iekšienē var adresēt. Viena minēta papildu izmaksu vērtība būs nepareiza tieši par to lielumu, kam ir nozīme.
Uzskaitiet slāņus secībā: piekļuves ceļš, ārējais transports, ārējais tunelis, iekšējais transports, iekšējais tunelis, lietojumprogramma. Skaitiet katru galveni vienreiz un turiet UDP atsevišķi no paša tuneļa galvenes un atzīmes.
Divi WireGuard slāņi, skaitīti vienreiz
Ņemiet IPv4 piekļuves ceļu ar vienu WireGuard tuneli citā. Ārējais slānis maksā 20 baitus IPv4, 8 UDP un 32 WireGuard datu galvenei un tās autentifikācijas atzīmei. Tā iekšienē iekšējam tunelim vajag savu 20 baitu IPv4 galveni un 8 baitu UDP galveni pirms otrajiem 32 baitiem WireGuard papildu izmaksu. Pārējais satur IPv4 galveni, TCP galveni un datus. Ārējais IPv6 ceļš maksā 40 nevis 20 un atstāj 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 |
Aritmētika nonāk pie 1340 baitiem. Viens slānis pēc tiem pašiem noteikumiem atstāj 1400 TCP lietderīgajai slodzei, tas ir 1500 mīnus 20, 8, 32, 20 un 20, un 60 baitu starpība ir tieši iekšējā iekapsulēšana, ko pievieno otrais tunelis.
Piemērojiet 1400 ligzdotam ceļam, un iekšējam tunelim trūkst 60 baitu, neredzami, līdz pakete kļūst pietiekami liela, lai tie būtu vajadzīgi. Papildināšana un protokola paša fragmentēšanas opcija atkal pakustina skaitļus, tāpēc uzticieties tabulai.
MTU, MSS un fragmentēšana darbojas dažādās vietās
Interfeisa MTU ierobežo to, ko interfeiss izsūtīs, bet TCP MSS savilkšana maina to, ko TCP partneris ir gatavs sūtīt. Savilkšana salabo TCP sesijas un neko nedara lielai UDP datagrammai, tālab labojums izskatās veiksmīgs vienai lietotnei un klusi palaiž garām nākamo. Paša protokola fragmentēšanas opcija ir trešā svira ar saviem neveiksmēm. Interfeisa MTU ir ierastais pirmais solis un rupjākais.
Tiltotie un maršrutētie tuneļi pārvadā atšķirīgus kadrus, tāpēc skaitļi no citas ieviešanas reti pārnesas. Ceļa MTU atklāšana, kas aprakstīta RFC 8201, palīdz tikai tik ilgi, kamēr tiek laistas cauri ICMP ziņas, no kurām tā ir atkarīga.
Atrast slāni, kuram trūkst
Pārbaudiet katru tuneli atsevišķi pirms to ligzdošanas, ja prasības pieļauj salīdzinājumu. Fiksēta izmēra zonde to izšķir: ping -M do -s 1472 -c 3 10.8.0.1 nosūta pilnu 1500 baitu IPv4 paketi tajā slānī. Pievienojiet otro slāni un atkārtojiet to pašu zondi, lai jebkura kļūda piederētu zināmai izmaiņai.
Kad pārsūtīšana apstājas, mainiet vienu dokumentētu parametru vienlaikus un pierakstiet izmēru, kurā tā neizdodas. Pārbaudiet arī atgriešanās ceļu, jo ligzdotā maršrutu rekursija var pietiekami precīzi atdarināt paketes izmēra problēmu, lai izmaksātu pēcpusdienu. Filtrēta ICMP atbilde var paslēpt īsto robežu, tāpēc zonde ir svarīgāka par spriešanu.
Pierakstiet budžetu tur, kur to atradīs nākamais cilvēks
Tabula ar vienu rindu uz slāni pārdzīvo īkšķa noteikumu. Turiet to blakus tuneļa shēmai, lai neviens zem spiediena neatkārtotu aritmētiku.
Vairāk tuneļu nozīmē vairāk atkarību, tāpēc atritināšanas plāns pelna vietu blakus budžetam. Ja skaitļi joprojām nesaskan, izmēriet ceļu, nevis miniet vēlreiz. Mērķis ir skaitlis, ko varat aizstāvēt, nevis atcerēties.