MSS-clamping VPN-átjárón: mit javít és mit nem
A clamping átírja az MSS-t a TCP-kézfogásokban, hogy a szegmensek beférjenek az alagútba. Soha nem javítja az UDP-t vagy a hibás path-MTU-ellenőrzést. Három ellenőrzés, sorrendben.
A kis kérések működnek, a nagy letöltések megakadnak, és valaki MSS-clampingot javasol. Ez a javaslat elég gyakran helyes ahhoz, hogy érdemes legyen a helyes sorrendben kipróbálni, és elég gyakran téves ahhoz, hogy egy délutánt elpazaroljon, ha vakon alkalmazza. Az alábbi három ellenőrzés elválasztja a valódi TCP-méretproblémát az UDP-problémától, a hibás path-MTU-felderítéstől és az olyan clamplel, amely soha nem látja azt a kézfogást, amelyet át kellene írnia.
A hiba alakjával kezdje
A mérethibának van egy aláírása: a kapcsolat létrejön, a hitelesítés és a kis válaszok sikeresek, majd az átvitel határozatlan időre megáll, amint teljes méretű szegmensre van szükség. Azok az oldalak, amelyek betöltik a szöveget, de soha nem fejezik be a képet, ugyanez a hiba kisebb léptékben. Ha semmi sem kapcsolódik egyáltalán, a probléma korábban van az útvonalon, és a clamping nem segít. Egy clamp nem tudja megjavítani azt a kézfogást, amely soha nem érkezett meg.
Az aláírás azért létezik, mert a kézfogás az a hely, ahol a szegmensméretben megállapodnak. Mindkét fél meghirdeti a maximális szegmensméretet TCP-opcióként, és a küldők tiszteletben tartják a partner hirdetését. Ha az útvonal nem tud ilyen nagy szegmenst szállítani, a hiba később jelentkezik, amikor a küldő végül megpróbál egyet.
Tartsa szem előtt a szállítási módot, miközben ezt a tünetet olvassa. A clamping egy TCP-opció átírása, ezért az ugyanazon alagút alatt megakadó hang- vagy videóhívás nem MSS-probléma, és nem fog javulni tőle. Jegyezze fel a szállítási módot, mielőtt egy TCP-opcióhoz nyúl.
Árazza be az útvonalat, majd hasonlítsa össze az alagúttal
Két szám számít, és gyakran összekeverik őket. A path-MTU a legnagyobb csomag, amelyet az útvonal felaprózás nélkül szállít, az IPv4-hez hirdetett MSS pedig ez az érték mínusz az IP- és TCP-fejlécek 40 bájtja, vagy IPv6 esetén mínusz 60. Az alagút-tokosítás megeszi a költségvetés egy részét, mielőtt a belső csomag egyáltalán elkezdődne.
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
A do-not-fragment bittel indított ping megmondja, túléli-e az ilyen hasznos teher méretű csomag; állítsa a méretet, amíg meg nem bukik, és empirikusan megtalálta az útvonal határát. A tracepath kimenete az útvonal mentén felderített MTU-t jelenti, ami gyorsabb, ha működik, és kevésbé megbízható, ha egy köztes ugrás szűri a próbákat.
Most vonja le az alagút többletét. A külső IP-fejléc, az UDP-fejléc és az alagút-specifikus fejléc mind ugyanabból az 1500 bájtból jön, így a használható belső MTU egy tipikus Ethernet-alapzaton alacsonyabb, mint amit a fizikai kapcsolat sugall. Ha a számított belső MTU alacsonyabb, mint amit partnerei hirdetnek, valódi clamp-jelöltet talált, nem találgatást. Ha a számított érték már meghaladja a partnerek hirdetését, álljon meg itt, és keressen máshol.
Helyezze a clampet oda, ahol a kézfogás elhalad
A clamp úgy működik, hogy átírja az MSS-opciót a SYN- és SYN-ACK-csomagokban, miközben azok átlépik az átjárót. Ha a szabály olyan interfészen van, amelyet egyik irány sem lép át soha, a tárgyalás változatlanul befejeződik, és a tünet megmarad, ezért a helyezés jobban eldönti az eredményt, mint az érték.
| 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 |
Az irány a másik fele. Egy irány clampelése a folyamok felét javítja, a többit pedig úgy hagyja meghibásodni, hogy időszakosnak tűnik, ezért alkalmazza a továbbított forgalom mindkét irányára. Az alagút-interfész klasszikus Linux-formája egy mangle-szabály, amely a SYN-csomagokra illeszkedik:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Figyelje meg, mit tesz valójában a --clamp-mss-to-pmtu: az értéket az útvonal MTU-jából származtatja, ami nem mindig az alagút valódi hasznos teher költségvetése. Olyan útvonalalapú alagútnál, ahol a belső útvonal és a külső pálya eltér, az előző ellenőrzésben számított kifejezett érték kiszámíthatóbb, mint az automatikus.
Új kapcsolattal igazolja, és tartsa életben a visszajelzést
Egy létrejött kapcsolat megtartja a kialkudott MSS-t, ezért az ugyanazon munkamenetben végzett teszt semmit sem bizonyít. A módosítás után nyisson új kapcsolatot, és olvassa le közvetlenül a kialkudott értéket ahelyett, hogy egy véletlenül befejeződő átvitelből következtetne rá.
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
Az első parancs a socket MSS-ét jelenti a torlódási állapotával együtt, ami a leggyorsabb megerősítés arra, hogy a clamp hatott. A második megerősíti, hogy az a szabály, amelyet hozzáadottnak hisz, az a szabály, amely létezik, abban a táblában, ahová került.
Aztán védje meg a mechanizmust, amelyet nem javított meg. A path-MTU-felderítés attól függ, hogy az ICMP fragmentation-needed üzenetek elérjék a küldőt, ezért a tűzfal, amely eldobja őket, továbbra is elrontja a nagy átviteleket még helyes clamp mellett is. Engedélyezze ezeket az üzeneteket az alagút útvonala számára, vagy fogadja el, hogy a clamping egy általa választott szabályzatot kompenzál.
Végül ellenálljon a kísértésnek, hogy a clampet hangolócsapként kezelje. Korlátozza a szegmensméretet, ami olyan útvonalakon kerül átbocsátóképességbe, amelyeknek soha nem volt rá szükségük. A három ellenőrzés után alkalmazva célzott javítás; elsőként alkalmazva olyan változtatás, amely elrejti az eredeti hibát, és második változót ad minden későbbi teszthez. Ezt a cserét szándékosan érdemes megtenni, nem alapértelmezésként.
Jegyezze fel a mért path-MTU-t, a levont alagút-többletet, a hozzáadott szabályt és a később látott MSS-t. Négy szám kereséssé teszi a következő incidenst vizsgálat helyett.