MSS clamping na VPN bráne: čo opraví a čo nie
Clamping prepisuje MSS v TCP handshakeoch, aby sa segmenty zmestili do tunela. Nikdy neopraví UDP ani pokazenú kontrolu path-MTU. Tri kontroly, v poradí.
Malé požiadavky fungujú, veľké sťahovania visia a niekto navrhne MSS clamping. Ten návrh je dosť často správny, aby stálo za to vyskúšať ho v správnom poradí, a dosť často nesprávny, aby ste s ním naslepo stratili popoludnie. Tri kontroly nižšie oddeľujú skutočný problém s veľkosťou TCP od problému s UDP, od pokazeného zisťovania path-MTU a od clampu, ktorý nikdy nevidí handshake, ktorý má prepísať.
Začnite tvarom poruchy
Porucha veľkosti má podpis: spojenie sa nadviaže, autentizácia a malé odpovede uspejú, a potom sa prenos na neurčito zasekne, len čo potrebuje segment plnej veľkosti. Stránky, ktoré načítajú text, ale nikdy nedokončia obrázok, sú rovnaká porucha v menšom meradle. Ak sa vôbec nič nepripojí, problém je skôr na ceste a clamping nepomôže. Clamp neopraví handshake, ktorý nikdy neprišiel.
Podpis existuje preto, že handshake je miesto, kde sa dohodne veľkosť segmentu. Každá strana inzeruje maximálnu veľkosť segmentu ako voľbu TCP a odosielatelia rešpektujú inzerciu protistrany. Ak cesta neunesie taký veľký segment, porucha sa objaví neskôr, keď to odosielateľ konečne skúsi.
Majte transport na očiach, keď ten symptóm čítate. Clamping je prepis voľby TCP, takže hlasový alebo videohovor, ktorý sa pod tým istým tunelom zasekne, nie je problém MSS a clampingom sa nezlepší. Napíšte si transport skôr, než siahnete na voľbu TCP.
Oceňte cestu a potom ju porovnajte s tunelom
Dve čísla sú dôležité a často sa pletú. path-MTU je najväčší paket, ktorý cesta prenesie bez fragmentácie, a inzerovaný MSS pre IPv4 je táto hodnota mínus 40 bajtov hlavičiek IP a TCP, alebo mínus 60 pre IPv6. Tunelová enkapsulácia spotrebuje časť rozpočtu ešte predtým, než vnútorný paket vôbec začne.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
Ping s bitom do-not-fragment vám povie, či paket s takouto veľkosťou užitočného zaťaženia prežije; meňte veľkosť, kým nepadne, a empiricky ste našli limit cesty. Výstup tracepath hlási MTU zistené pozdĺž trasy, čo je rýchlejšie, keď to funguje, a menej spoľahlivé, keď medziskok filtruje sondy.
Teraz odpočítajte réžiu tunela. Vonkajšia IP hlavička, hlavička UDP a hlavička špecifická pre tunel vychádzajú z tých istých 1500 bajtov, takže použiteľný vnútorný MTU na typickom Ethernet podklade je nižší, než naznačuje fyzické spojenie. Ak je vypočítaný vnútorný MTU nižší než to, čo inzerujú vaši partneri, našli ste skutočného kandidáta na clamp, a nie domnienku. Ak je vypočítaná hodnota už vyššia než inzercia partnerov, zastavte sa tu a hľadajte inde.
Umiestnite clamp tam, kadiaľ prechádza handshake
Clamp funguje tak, že prepisuje voľbu MSS v paketoch SYN a SYN-ACK, keď prechádzajú bránou. Ak pravidlo sedí na rozhraní, ktorým ani jeden smer nikdy neprechádza, vyjednávanie sa skončí bez zmeny a symptóm pretrváva, preto o výsledku rozhoduje umiestnenie viac než hodnota.
| 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 |
Smer je druhá polovica. Clamp v jednom smere opraví polovicu tokov a zvyšok nechá zlyhávať spôsobom, ktorý vyzerá prerušovane, preto ho aplikujte na oba smery preposielanej prevádzky. Klasická forma v Linuxe pre tunelové rozhranie je mangle pravidlo zodpovedajúce paketom SYN:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Všimnite si, čo --clamp-mss-to-pmtu skutočne robí: odvodzuje hodnotu z MTU trasy, čo nie je vždy skutočný rozpočet užitočného zaťaženia tunela. Na tuneli založenom na trase, kde sa vnútorná trasa a vonkajšia cesta líšia, je explicitná hodnota vypočítaná v predchádzajúcej kontrole predvídateľnejšia než automatická.
Overte novým spojením a udržujte spätnú väzbu živú
Nadviazané spojenie si drží MSS, na ktorom sa dohodlo, takže testovanie v tej istej relácii nič nedokazuje. Po zmene otvorte nové spojenie a čítajte vyjednanú hodnotu priamo, namiesto odvodzovania z prenosu, ktorý náhodou skončí.
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
Prvý príkaz hlási MSS socketu spolu so stavom zahltenia, čo je najrýchlejšie potvrdenie, že clamp zabral. Druhý potvrdzuje, že pravidlo, o ktorom si myslíte, že ste ho pridali, je pravidlo, ktoré existuje, v tabuľke, kam bolo umiestnené.
Potom chráňte mechanizmus, ktorý ste neopravili. Zisťovanie path-MTU závisí od toho, či správy ICMP fragmentation-needed dorazia k odosielateľovi, takže firewall, ktorý ich zahadzuje, bude ďalej kaziť veľké prenosy aj so správnym clampom. Povoľte tieto správy pre cestu tunela, alebo prijmite, že clamping kompenzuje politiku, ktorú ste si vybrali.
Nakoniec odolajte pokušeniu brať clamp ako gombík na ladenie. Obmedzuje veľkosť segmentu, čo stojí priepustnosť na cestách, ktoré ho nikdy nepotrebovali. Aplikovaný po troch kontrolách je cielená oprava; aplikovaný prvý je zmena, ktorá skrýva pôvodnú poruchu a pridáva druhú premennú ku každému neskoršiemu testu. Ten obchod sa oplatí urobiť vedome, nie štandardne.
Zapíšte path-MTU, ktoré ste zmerali, réžiu tunela, ktorú ste odpočítali, pravidlo, ktoré ste pridali, a MSS, ktorý ste potom videli. Štyri čísla urobia z ďalšieho incidentu vyhľadávanie namiesto vyšetrovania.