MSS-klampado ĉe VPN-pordego: kion ĝi riparas kaj kion ne
Klampado reskribas la MSS en TCP-manpremoj por ke segmentoj taŭgu en la tunelon. Ĝi neniam riparas UDP aŭ rompitan path-MTU-kontrolon. Tri kontroloj, laŭorde.
Etaj petoj funkcias, grandaj elŝutoj haltas, kaj iu proponas MSS-klampadon. Tiu propono sufiĉe ofte pravas por indi provi ĝin en la ĝusta ordo, kaj sufiĉe ofte malpravas por malŝpari posttagmezon se vi aplikas ĝin blinde. La tri kontroloj sube apartigas veran TCP-grandecan problemon disde UDP-problemo, disde rompita path-MTU-malkovro, kaj disde klampo, kiu neniam vidas la manpremon, kiun ĝi devus reskribi.
Komencu per la formo de la fiasko
Grandeca fuŝo havas subskribon: la konekto establiĝas, aŭtentigo kaj etaj respondoj sukcesas, kaj poste transportado haltas senfine kiam ĝi bezonas plengrandan segmenton. Paĝoj, kiuj ŝargas tekston sed neniam finas bildon, estas la sama fuŝo je pli malgranda skalo. Se nenio tute konektiĝas, la problemo estas pli frue sur la vojo kaj klampado ne helpos. Klampo ne povas ripari manpremon, kiu neniam alvenis.
La subskribo ekzistas ĉar la manpremo estas kie oni interkonsentas la segmentan grandecon. Ĉiu flanko anoncas maksimuman segmentan grandecon kiel TCP-opcion, kaj sendantoj respektas la anoncon de la partnero. Se la vojo ne povas porti tiel grandan segmenton, la fuŝo aperas poste, kiam la sendanto finfine provas unu.
Tenadu la transporton en la vido dum vi legas tiun simptomon. Klampado estas reskribo de TCP-opcio, do voĉa aŭ vidbenda alvoko, kiu haltas sub la sama tunelo, ne estas MSS-problemo kaj ne pliboniĝos per ĝi. Skribu la transporton antaŭ ol vi tuŝos TCP-opcion.
Prispritu la vojon, poste komparu ĝin kun la tunelo
Du nombroj gravas kaj ofte konfuziĝas. path-MTU estas la plej granda pako, kiun la vojo portos sen fragmentado, kaj la anoncita MSS por IPv4 estas tiu valoro minus la 40 bajtoj de IP- kaj TCP-kapoj, aŭ minus 60 por IPv6. Tunela enkapsuligo konsumas parton de la buĝeto antaŭ ol la interna pako eĉ komenciĝas.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
La ping kun la do-not-fragment-bito diras al vi ĉu pako de tiu utilŝarĝa grando postvivas; adaptu la grandecon ĝis ĝi fiaskos kaj vi empirike trovis la limon de la vojo. La eligo de tracepath raportas la MTU-on malkovritan laŭ la itinero, kio pli rapidas kiam ĝi funkcias kaj malpli fidindas kiam meza salto filtradas la sondojn.
Nun subtrahu la superkoston de la tunelo. Ekstera IP-kapo, UDP-kapo kaj tunel-specifa kapo ĉiuj eliras el la samaj 1500 bajtoj, do la uzebla interna MTU sur tipa Ethernet-subtavolo estas pli malalta ol la fizika ligo sugestas. Se la kalkulita interna MTU estas sub tio, kion anoncas viaj partneroj, vi trovis veran klampo-kandidaton anstataŭ konjekton. Se la kalkulita valoro jam superas la anoncon de la partneroj, haltu ĉi tie kaj serĉu aliloke.
Metu la klampon tie, kie la manpremo pasas
Klampo funkcias reskribante la MSS-opcion en la pakoj SYN kaj SYN-ACK dum ili transiras la pordegon. Se la regulo sidas sur interfaco, kiun neniu el la du direktoj iam transiras, la intertraktado finiĝas senŝanĝe kaj la simptomo restas, tial la lokigo decidas la rezulton pli ol la valoro.
| Symptom | What it points to | Next check |
|---|---|---|
| Handshake completes, large transfer stalls | Segment size larger than the path can carry | Path MTU against the tunnel's effective MTU |
| Nothing connects, small or large | Routing, firewall or keying failure | Not MSS; look at the tunnel state |
| Only UDP applications stall | Datagram size or a dropped ICMP error | Platform-specific UDP handling, not clamping |
| Fixed after reconnect, returns later | Clamp applied to one direction or one interface | Rule placement and the handshake path |
La direkto estas la alia duono. Klampi unu direkton riparas duonon de la fluoj kaj lasas la reston fiaski tiel, ke ŝajnas intermita, do apliku ĝin al ambaŭ direktoj de la plusendata trafiko. La klasika Linux-formo por tunela interfaco estas mangle-regulo kongruanta al SYN-pakoj:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Rimarku, kion --clamp-mss-to-pmtu efektive faras: ĝi derivas la valoron el la MTU de la itinero, kio ne ĉiam estas la reala utilŝarĝa buĝeto de la tunelo. Sur itinero-bazita tunelo, kie la interna itinero kaj la ekstera vojo diferencas, eksplicita valoro kalkulita en la antaŭa kontrolo estas pli antaŭvidebla ol aŭtomata.
Kontrolu per nova konekto kaj tenu la retrokuplon viva
Establita konekto konservas la MSS-on, pri kiu ĝi interkonsentis, do testado en la sama sesio pruvas nenion. Malfermu novan konekton post la ŝanĝo kaj legu la interkonsentitan valoron rekte anstataŭ dedukti ĝin el translokigo, kiu hazarde finiĝas.
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
La unua komando raportas la MSS-on de la poŝo kune kun ĝia kongesta stato, kio estas la plej rapida konfirmo, ke la klampo efikis. La dua konfirmas, ke la regulo, kiun vi pensas, ke vi aldonis, estas la regulo, kiu ekzistas, en la tabelo, kie ĝi estis metita.
Poste protektu la mekanismon, kiun vi ne riparis. path-MTU-malkovro dependas de tio, ke ICMP-fragmentation-needed-mesaĝoj atingas la sendanton, do fajroŝirmilo, kiu ilin faligas, daŭre rompos grandajn translokigojn eĉ kun ĝusta klampo. Permesu tiujn mesaĝojn por la tunela vojo, aŭ akceptu, ke klampado kompensas politikon, kiun vi elektis.
Fine, rezistu la tenton trakti la klampon kiel agordan butonon. Ĝi limigas la segmentan grandecon, kio kostas trapenetron sur vojoj, kiuj neniam bezonis ĝin. Aplikita post la tri kontroloj, ĝi estas celita riparo; aplikita unue, ĝi estas ŝanĝo, kiu kaŝas la originan fuŝon kaj aldonas duan variablon al ĉiu posta testo. Tiu interŝanĝo indas fariĝi intence, ne defaŭlte.
Skribu la path-MTU-on, kiun vi mezuris, la tunelan superkoston, kiun vi subtrahis, la regulon, kiun vi aldonis, kaj la MSS-on, kiun vi vidis poste. Kvar nombroj faras la sekvan incidenton serĉado anstataŭ esploro.