Kvifor ein VPN heng på store overføringar men ikkje på små
Små førespurnader svarar medan store overføringar frys. Samanlikn grensesnittgrensa, stigrensa og den annonserte TCP-nyttelasta før du kopierer ein fast MTU.
Ei side lastar, eit ping lukkast, og ein filkopi heng på same punktet kvar gong. Det mønsteret peikar på pakkestorleik, ikkje på bandbreidd eller påloggingsinformasjon. Innkapsling legg til byte i kvar pakke, så ei nyttelast som passa på den opphavlege vegen, kan overskride grensa når ho går gjennom ein tunnel. I desse samtalane vert tre ulike tal kalla MTU, og å blande dei fører til ei innstilling som reparerer éin applikasjon og øydelegg ein annan.
Tre tal folk kallar MTU
Grensesnitt-MTU er den konfigurerte grensa for ein pakke på den lenkja. Sti-MTU er den minste grensa langs ruta, og ho vert oppdaga i staden for konfigurert. TCP MSS er storleiken på nyttelasta ein motpart oppgir at han kan ta imot, og han er utleidd frå dei to andre i staden for å vere ei eiga fysisk grense.
Ein tunnel har eit indre og eit ytre perspektiv. Den ytre pakken ber den innkapsla pluss dei hovuda protokollen treng, så den brukbare indre storleiken er mindre enn den ytre vegen tillèt. Vegen til VPN-tenaren er også ulik tenaren sin veg til målet.
Oppdaging av sti-MTU lèt ein avsendar lære den fungerande storleiken, men det er avhengig av at tilbakemelding kjem fram. Når eit mellomliggande apparat filtrerer dei relevante ICMP-meldingane, held avsendaren fram med å sende pakkar som aldri vert fullførte, og det er det klassiske svarte holet. Symptomet er særeige når ein kjenner det: handtrykket lukkast, den første nyttelasta i full storleik forsvinn, og sambandet vert til slutt nullstilt eller heng. Ingenting i applikasjonsloggen ser ut som eit nettverksproblem.
Undersøk vegen med ei nyttelast du styrer
Ein test er prov om éi rute og éin storleik, ikkje ei tilrådd innstilling. Bruk ein vert som svarar, og endre berre storleiken på nyttelasta.
ping -M do -s 1372 -c 2 203.0.113.20 ping -4 -f -l 1372 vpn.example
Den første kommandoen sender ein Linux-test med fragmentering slått av og ei nyttelast på 1372 byte, og den andre gjer det same på Windows der nyttelasta vert sett med -l. Eit svar tyder på at den storleiken overlevde vegen. Ei melding om at fragmentering er nødvendig, er informativ, medan ein tidsavbrot er tvitydig fordi verten eller eit mellomliggande apparat rett og slett kan sleppe ICMP.
Gå storleiken ned i nokre få steg i staden for binærsøk til byten. Du prøver å slå fast om det finst eit storleikstak, ikkje å publisere eit tal for kvart nettverk. Talet du finn gjeld for denne vegen, denne protokollen og denne adressefamilien.
IPv4 og IPv6 fragmenterer ulikt, så eit testresultat frå den eine familien seier ingenting om den andre. Test familien applikasjonen faktisk brukar.
MSS-clamping hjelper berre TCP
I TCP vert den effektive nyttelasta forhandla under handtrykket, og ein ruter på vegen kan skrive den verdien nedover slik at begge endar sender mindre segment. Det er det MSS-clamping gjer, og det verkar utan å røre klienten i det heile.
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ip link show tun0
Den første regelen clampar den annonserte MSS til sti-MTU for vidaresende TCP-handtrykk, og den andre viser tunnelgrensesnittet si eiga MTU slik at du kan samanlikne han med det vegen tillèt. Clamping er den minst inngripande rettinga for ein TCP-applikasjon som heng etter handtrykket.
For UDP gjer han ingenting. Ein tale- eller spelklient som sender store datagram, vil ignorere ei MSS-innstilling heilt, fordi det ikkje finst noko handtrykk å skrive om. Viss applikasjonen som feilar er UDP, sjå i staden på klienten sine eigne val for pakkestorleik. Dei to protokollane feilar ulikt og vert reparerte med ulike verktøy, derfor høyrer protokollen heime i første setninga i saka.
OpenVPN eksponerer val som tun-mtu, mssfix og fragmenteringsrelaterte innstillingar, og åtferda deira er avhengig av versjonen og av om datakanalen er AEAD. Les handboka for versjonen som vert brukt, og endre éi innstilling om gongen.
Endre éi støtta innstilling og gjer begge køyringane om att
Behald den opphavlege profilen, endre éin støtta verdi, og gjer både den vesle førespurnaden som virka og den store overføringa som feila om att. Viss berre den store endrar seg, jaga du storleik. Viss båe endrar seg, flytta noko anna seg med han.
Ein lågare verdi kan redusere symptomet medan han legg til overhead, så det minste moglege talet er ikkje målet. Målet er ein storleik som vegen ber påliteleg med minst mogleg sløsing. Noter verdien, vegen og klientversjonen i saka, fordi same tal brukt ein annan stad er ei gissing.
Viss same profil verkar frå eit anna klarert nettverk, hald den skilnaden i diagnosen i staden for å erklære klienten reparert. Variabelen som endra seg er vegen, og vegen er det testen målte.