Imate zahtev koji se ne savija: druga strana mora da primi isti IP paket od 1,500 bajtova koji emituje pošiljalac, uključujući zaglavlja. Tunel ne može da umota taj paket zajedno sa sopstvenim frejmiranjem u drugi IP paket od 1,500 bajtova, pa nešto u dizajnu mora da popusti. Redosled ispod je onaj koji koristim u prozoru za izmene: napišite budžet u bajtovima, dokažite šta donji sloj zaista može da prenese, zatim izaberite tačno jedan mehanizam prenosa i potvrdite unutrašnji paket na drugoj strani.

Napišite budžet u bajtovima pre izmene profila

Enkapsulacija dodaje bajtove na više slojeva, a ukupan broj je osobina vašeg profila, a ne konstanta koju možete da pronađete. Familija adresa, izbor šifre, transportni protokol i svaka opcija kompresije ili frejmiranja pomeraju broj, zato je oduzimanje kopirano iz drugog postavljanja bezvredno kao budžet. Pođite od unutrašnjeg zahteva, dodajte izmereni trošak po paketu sopstvene konfiguracije i napišite dobijenu spoljnu veličinu na tiket za izmene pre nego što neko izmeni datoteku.

Dva broja odlučuju dizajn: najveći spoljni paket koji putanja prenosi bez fragmentacije i dodatni bajtovi koji su potrebni vašoj enkapsulaciji. Kada je prvi manji od drugog plus 1,500, jedan od njih mora da se promeni. Izbor tada postaje uzak, a ne kreativan, zato zapisujem oba broja pre razgovora o opcijama. Ništa na nivou tunela ne komprimuje te bajtove, a ni jedan ceo broj MTU ne uklanja zahtev koji ste dobili.

Ispitajte donji sloj pingom do-not-fragment

Merite putanju umesto da verujete MTU-u interfejsa, jer je najmanja karika u spoljnoj putanji ona koja je važna. Na Linuxu, -M do postavlja bit do-not-fragment i -s uzima ICMP korisni teret, pa frejm od 1,500 bajtova odgovara sa 1,472 bajta korisnog tereta kada se oduzmu IP zaglavlje od 20 bajtova i ICMP zaglavlje od 8 bajtova. Povećavajte teret dok test ne padne, zatim skočite na jumbo veličinu da vidite da li ga putanja uopšte nosi.

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

Putanja koja prođe 1,472 i padne na 8,972 ne može da prenese unutrašnji paket od 1,500 bajtova sa troškom u jednom spoljnom paketu. To je odgovor koji vam je bio potreban pre otvaranja VPN konfiguracije. Ono takođe odlučuje koji od sledeća dva odeljka važi za vas, zato držite oba rezultata testa pored tiketa. Nagađanje ovde košta jedan prozor za održavanje, jer tunel koji se prijavljuje kao up ne govori vam ništa o najvećem paketu koji će putanja prihvatiti.

Podignite MTU putanje samo tamo gde se svaki hop slaže

Jumbo frejmovi su end-to-end osobina, a ne podešavanje koje uključujete na dve krajnje tačke koje slučajno kontrolišete. Svaki svič, ruter i prelaz kod provajdera na spoljnoj putanji moraju da se slože o većoj veličini, a jedan hop od 1,500 bajtova tiho će odbaciti paket koji ste upravo povećali. Podizanje samo lokalnog interfejsa je klasična polovična izmena zbog koje tunel izgleda pokvareno dok donji sloj tiho ispušta.

ip link set dev eth1 mtu 9000
ip link show dev eth1
ping -M do -s 8972 -c 2 198.51.100.10

Promenite interfejs, zatim ponovo ispitajte istu putanju pre nego što promenite bilo šta drugo. Ako test i dalje pada, vratite sa ip link set dev eth1 mtu 1500 i pređite na fragmentaciju umesto da se svađate sa provajderom oko linka koji nije vaš.

Koristite fragmentaciju tunela kada donji sloj ne može da raste

Podržani mehanizam fragmentacije ispod unutrašnjeg paketa omogućava da nekoliko spoljnih paketa prenese jedan unutrašnji paket, a suprotna krajnja tačka tunela ih ponovo sastavlja pre nego što original preda steku. Opcija UDP fragment iz Community OpenVPN je jedna implementacija te ideje i nije isto što i obična IP fragmentacija spoljnog paketa. Oba peer-a moraju da pokreću verziju koja podržava taj format, a putanja podataka mora da bude ona koju mislite: OpenVPN 3 klijenti i kernelom ubrzani data kanali imaju različita ograničenja, pa profil koji radi na jednom klijentu može da padne na drugom.

openvpn --config client.ovpn --tun-mtu 1500 --fragment 1400 --verb 4

Obična spoljna fragmentacija je druga opcija i slabija je. IPv6 ruteri uopšte ne fragmentišu prosleđeni paket, pa preveliki spoljni paket jednostavno umre, a pošiljalac to sazna samo ako relevantna ICMPv6 poruka preživi putanju. Fragmenti takođe pozivaju na filtriranje i pojačanje gubitaka, zato ovo tretiram kao rezervnu opciju, a ne kao plan.

Spoljni nosač zasnovan na toku zaobilazi pitanje veličine segmentisanjem sopstvenog toka bajtova, a rekonstruisani unutrašnji paket i dalje može da bude 1,500 bajtova. To je transportna odluka sa sopstvenom cenom, uključujući poznato ponašanje TCP-a unutar TCP-a, zato je donesite namerno, a ne kao sporedni efekat rasprave o MTU-u.

Potvrdite da unutrašnji paket stiže nepromenjen

Verifikacija nije uspešan handshake. Snimite na interfejsu tunela na oba kraja i uporedite veličinu i sadržaj paketa koji je aplikacija zaista poslala sa onim što je druga strana primila.

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'

Ako snimak pokaže unutrašnji paket pune veličine na drugom kraju, izbor prenosa radi i preostaje da se to zabeleži. Ako ne pokaže ništa dok se tunel prijavljuje kao up, spoljni paket se odbacuje negde između krajnjih tačaka, što vas vraća na test, a ne na podešavanja šifre.

Zabeležite tri stvari na tiketu za izmene pre nego što ga zatvorite: izmereni spoljni budžet, izabrani mehanizam i komandu koja je dokazala da je unutrašnji paket preživeo. Sledećoj osobi koja dotakne ovaj tunel trebaće sve tri, a nijedna od njih ne može da se rekonstruiše samo iz konfiguracione datoteke.

Povezani članci