Omezování MSS na VPN bráně: co opraví a co ne
Clamping přepisuje MSS v TCP handshakech, aby se segmenty vešly do tunelu. Nikdy neopraví UDP ani rozbitou kontrolu path-MTU. Tři kontroly, v pořadí.
Malé požadavky fungují, velká stahování visí a někdo navrhne MSS clamping. Ten návrh je dost často správný, aby stálo za to ho vyzkoušet ve správném pořadí, a dost často špatný, abyste s ním naslepo ztratili odpoledne. Tři kontroly níže oddělují skutečný problém s velikostí TCP od problému s UDP, od rozbitého zjišťování path-MTU a od clampu, který nikdy nevidí handshake, jenž má přepsat.
Začněte tvarem poruchy
Porucha velikosti má podpis: spojení se naváže, autentizace a malé odpovědi uspějí, a pak se přenos na neurčito zasekne, jakmile potřebuje segment plné velikosti. Stránky, které načtou text, ale nikdy nedokončí obrázek, jsou stejná porucha v menším měřítku. Pokud se vůbec nic nepřipojí, problém je dřív na cestě a clamping nepomůže. Clamp neopraví handshake, který nikdy nedorazil.
Podpis existuje proto, že handshake je místo, kde se velikost segmentu dohodne. Každá strana inzeruje maximální velikost segmentu jako volbu TCP a odesílatelé respektují inzerci protějšku. Pokud cesta neunese tak velký segment, porucha se objeví později, když to odesílatel konečně zkusí.
Mějte transport na očích, když ten symptom čtete. Clamping je přepis volby TCP, takže hlasový nebo video hovor, který se pod stejným tunelem zasekne, není problém MSS a clampingem se nezlepší. Napište si transport dřív, než sáhnete na volbu TCP.
Oceňte cestu a pak ji porovnejte s tunelem
Dvě čísla jsou důležitá a často se pletou. path-MTU je největší paket, který cesta přenese bez fragmentace, a inzerovaný MSS pro IPv4 je tato hodnota minus 40 bajtů hlaviček IP a TCP, nebo minus 60 pro IPv6. Tunelová enkapsulace spotřebuje část rozpočtu ještě předtím, než vnitřní paket vůbec začne.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
Ping s bitem do-not-fragment vám řekne, zda paket s touto velikostí užitečného zatížení přežije; měňte velikost, dokud nepadne, a empiricky jste našli limit cesty. Výstup tracepath hlásí MTU zjištěný podél trasy, což je rychlejší, když to funguje, a méně spolehlivé, když mezilehlý skok filtruje sondy.
Nyní odečtěte režii tunelu. Vnější IP hlavička, hlavička UDP a hlavička specifická pro tunel vycházejí ze stejných 1500 bajtů, takže použitelný vnitřní MTU na typickém Ethernet podkladu je nižší, než naznačuje fyzické spojení. Pokud je vypočtený vnitřní MTU nižší než to, co inzerují vaši protějšky, našli jste skutečného kandidáta na clamp, a ne domněnku. Pokud je vypočtená hodnota už vyšší než inzerce protějšků, zastavte se zde a hledejte jinde.
Umístěte clamp tam, kudy prochází handshake
Clamp funguje tak, že přepisuje volbu MSS v paketech SYN a SYN-ACK, když procházejí bránou. Pokud pravidlo sedí na rozhraní, kterým ani jeden směr nikdy neprochází, vyjednávání proběhne beze změny a symptom přetrvá, a proto o výsledku rozhoduje umístění víc 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 |
Směr je druhá polovina. Clamp v jednom směru opraví polovinu toků a zbytek nechá selhávat způsobem, který vypadá přerušovaně, takže ho aplikujte na oba směry přeposílaného provozu. Klasická forma v Linuxu pro tunelové rozhraní je mangle pravidlo odpovídající paketům SYN:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Všimněte si, co --clamp-mss-to-pmtu skutečně dělá: odvozuje hodnotu z MTU trasy, což není vždy skutečný rozpočet užitečného zatížení tunelu. Na tunelu založeném na trase, kde se vnitřní trasa a vnější cesta liší, je explicitní hodnota vypočtená v předchozí kontrole předvídatelnější než automatická.
Ověřte novým spojením a udržujte zpětnou vazbu živou
Navázané spojení si drží MSS, na kterém se dohodlo, takže testování ve stejné relaci nic nedokazuje. Po změně otevřete nové spojení a čtěte vyjednanou hodnotu přímo, místo abyste ji odvozovali z přenosu, který náhodou skončí.
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
První příkaz hlásí MSS socketu spolu se stavem zahlcení, což je nejrychlejší potvrzení, že clamp zabral. Druhý potvrzuje, že pravidlo, o kterém si myslíte, že jste přidali, je pravidlo, které existuje, v tabulce, kam bylo umístěno.
Pak chraňte mechanismus, který jste neopravili. Zjišťování path-MTU závisí na tom, že zprávy ICMP fragmentation-needed dorazí k odesílateli, takže firewall, který je zahazuje, bude dál kazit velké přenosy i se správným clampem. Povolte tyto zprávy pro cestu tunelu, nebo přijměte, že clamping kompenzuje politiku, kterou jste zvolili.
Nakonec odolejte pokušení brát clamp jako knoflík pro ladění. Omezuje velikost segmentu, což stojí propustnost na cestách, které ho nikdy nepotřebovaly. Aplikovaný po třech kontrolách je cílená oprava; aplikovaný první je změna, která skrývá původní poruchu a přidává do každého dalšího testu druhou proměnnou. Ten obchod stojí za to udělat vědomě, ne automaticky.
Zapište path-MTU, který jste změřili, režii tunelu, kterou jste odečetli, pravidlo, které jste přidali, a MSS, který jste poté viděli. Čtyři čísla udělají z příštího incidentu vyhledávání místo vyšetřování.