Prenos fiksnega notranjega paketa 1,500 bajtov skozi VPN
Fiksni notranji paket 1,500 bajtov se ne prilega zunanji poti 1,500 bajtov. Izmerite dodatno obremenitev, nato izberite večji MTU spodnjega sloja ali podprto fragmentacijo.
Imate zahtevo, ki se ne upogne: druga stran mora prejeti isti IP paket 1,500 bajtov, ki ga oddaja pošiljatelj, vključno z glavami. Tunel ne more zaviti tega paketa skupaj z lastnim uokvirjanjem v drugi IP paket 1,500 bajtov, zato mora nekaj v zasnovi popustiti. Spodnji vrstni red je tisti, ki ga uporabljam v oknu sprememb: zapišite proračun v bajtih, dokažite, kaj spodnji sloj v resnici lahko prenese, nato izberite natanko en mehanizem prenosa in potrdite notranji paket na drugi strani.
Zapišite proračun v bajtih, preden uredite profil
Inkapsulacija doda bajte na več plasteh, vsota pa je lastnost vašega profila in ne konstanta, ki jo je mogoče poiskati. Družina naslovov, izbira šifre, transportni protokol in vsaka možnost stiskanja ali uokvirjanja premaknejo število, zato je odštevanje, kopirano iz druge postavitve, kot proračun brez vrednosti. Začnite z notranjo zahtevo, dodajte izmerjeno obremenitev na paket lastne konfiguracije in zapišite dobljeno zunanjo velikost v zahtevek za spremembo, preden kdo uredi datoteko.
O zasnovi odločata dve števili: največji zunanji paket, ki ga pot prenese brez fragmentacije, in dodatni bajti, ki jih potrebuje vaša inkapsulacija. Ko je prvo manjše od drugega plus 1,500, se mora eno od njiju spremeniti. Izbira postane takrat ozka in ne ustvarjalna, zato obe števili zapišem, preden razpravljam o možnostih. Nič na plasti tunela teh bajtov ne stisne in nobeno samo celo število MTU ne odpravi zahteve, ki ste jo dobili.
Preizkusite spodnji sloj s ping do-not-fragment
Merite pot, namesto da zaupate MTU vmesnika, ker šteje najmanjši člen v zunanji poti. V Linuxu, -M do nastavi bit do-not-fragment in -s prevzame koristni tovor ICMP, zato okvir 1,500 bajtov odgovori s 1,472 bajti tovora, ko odštejemo 20-bajtno glavo IP in 8-bajtno glavo ICMP. Povečujte tovor, dokler preizkus ne odpove, nato skočite na velikost jumbo in preverite, ali ga pot sploh prenese.
ping -M do -s 1472 -c 2 198.51.100.10 ping -M do -s 8972 -c 2 198.51.100.10 tracepath -n 198.51.100.10
Pot, ki prestane 1,472 in odpove pri 8,972, ne more prenesti notranjega paketa 1,500 bajtov z obremenitvijo v enem zunanjem paketu. To je odgovor, ki ste ga potrebovali, preden ste odprli konfiguracijo VPN. Odloča tudi, kateri od naslednjih dveh razdelkov velja za vas, zato imejte oba izida preizkusa ob zahtevku. Ugibanje tukaj stane eno vzdrževalno okno, ker tunel, ki se javlja kot up, ne pove ničesar o največjem paketu, ki ga bo pot sprejela.
Dvignite MTU poti samo tam, kjer se strinja vsak skok
Jumbo okviri so lastnost end-to-end, ne nastavitev, ki jo vklopite na dveh končnih točkah, ki jih slučajno nadzorujete. Vsako stikalo, usmerjevalnik in predaja pri ponudniku na zunanji poti se morajo strinjati z večjo velikostjo, in en sam skok 1,500 bajtov bo tiho zavrgel paket, ki ste ga pravkar povečali. Dvigniti samo lokalni vmesnik je klasična polovična sprememba, zaradi katere je tunel videti pokvarjen, medtem ko spodnji sloj tiho spušča.
ip link set dev eth1 mtu 9000 ip link show dev eth1 ping -M do -s 8972 -c 2 198.51.100.10
Spremenite vmesnik, nato znova preizkusite isto pot, preden spremenite karkoli drugega. Če preizkus še vedno odpove, razveljavite s ip link set dev eth1 mtu 1500 in preidite na fragmentacijo, namesto da bi se prepirali s ponudnikom o povezavi, ki ni vaša.
Uporabite fragmentacijo tunela, ko spodnji sloj ne more rasti
Podprt mehanizem fragmentacije pod notranjim paketom omogoča več zunanjim paketom, da prenesejo en notranji paket, in nasprotna končna točka tunela jih znova sestavi, preden izvirnik preda skladu. Možnost UDP fragment v Community OpenVPN je ena izvedba te ideje in ni isto kot običajna IP fragmentacija zunanjega paketa. Oba peerja morata poganjati različico, ki podpira to obliko, in podatkovna pot mora biti tista, ki jo mislite: odjemalci OpenVPN 3 in jedrno pospešeni podatkovni kanali imajo različne omejitve, zato lahko profil, ki deluje na enem odjemalcu, odpove na drugem.
openvpn --config client.ovpn --tun-mtu 1500 --fragment 1400 --verb 4
Običajna zunanja fragmentacija je druga možnost in je šibkejša. Usmerjevalniki IPv6 posredovanega paketa sploh ne fragmentirajo, zato prevelik zunanji paket preprosto umre, pošiljatelj pa to izve le, če ustrezno sporočilo ICMPv6 preživi pot. Fragmenti tudi vabijo k filtriranju in ojačenju izgub, zato to obravnavam kot nadomestno rešitev in ne kot načrt.
Zunanji nosilec, ki temelji na toku, se izogne vprašanju velikosti s segmentiranjem lastnega toka bajtov, in rekonstruirani notranji paket je lahko še vedno 1,500 bajtov. To je transportna odločitev z lastno ceno, vključno z znanim vedenjem TCP znotraj TCP, zato jo sprejmite zavestno in ne kot stranski učinek razprave o MTU.
Potrdite, da notranji paket prispe nespremenjen
Preverjanje ni uspešen handshake. Zajemite na vmesniku tunela na obeh koncih in primerjajte velikost ter vsebino paketa, ki ga je aplikacija dejansko poslala, s tistim, kar je prejela druga stran.
ip link show dev tun0 ping -M do -s 1472 -c 2 10.8.0.1 tcpdump -ni tun0 -c 5 'icmp and greater 1000'
Če posnetek pokaže notranji paket polne velikosti na drugem koncu, izbira prenosa deluje, preostane pa jo zabeležiti. Če ne pokaže ničesar, medtem ko se tunel javlja kot up, se zunanji paket nekje med končnima točkama zavrže, kar vas vrne k preizkusu in ne k nastavitvam šifre.
Preden zahtevek zaprete, vanj zapišite tri stvari: izmerjeni zunanji proračun, izbrani mehanizem in ukaz, ki je dokazal, da je notranji paket preživel. Naslednja oseba, ki se bo dotaknila tega tunela, bo potrebovala vse tri, in nobenega od njih ni mogoče obnoviti samo iz konfiguracijske datoteke.