Režie IPsec: mění ji režim, NAT-T i algoritmy
Jedno publikované číslo režie popisuje jedno zapouzdření na jedné trase. Sečtěte hlavičky, které váš tunel skutečně vyjedná, a pak trasu změřte.
Někde v nějakém návodu je číslo, obvykle mezi šedesáti a osmdesáti bajty, které někdo odečetl od 1500, aby dostal MTU rozhraní. To číslo popisuje jedno konkrétní zapouzdření na jedné konkrétní trase. Změňte režim, vnější rodinu adres, šifru nebo přítomnost NAT a aritmetika už pro váš tunel neplatí.
Číslo přišlo z jiného tunelu
Režie není vlastnost IPsec v abstraktu. Je to vlastnost paketu, který se skutečně sestaví: vyjednaný režim, vnější hlavička, ochranná hlavička, výplň, pole integrity a možná ještě obal UDP.
Číslo uváděné pro transportní režim s IPv4 a bez NAT popisuje menší paket než tunelový režim s IPv6 pod průchodem NAT. Obě jsou správné pro svůj případ. Kopírování kterékoli z nich do jiného nasazení je způsob, jak lidé skončí s MTU, které láme velké přenosy. Selhání je tiché, protože malé požadavky dál fungují.
Sečtěte vrstvy, které tam skutečně jsou
Začněte u vnější hlavičky IP a jděte dovnitř. V tunelovém režimu je původní paket uvnitř, takže vnější hlavička je přidání, ne náhrada. RFC 4303 popisuje hlavičku ESP, výplň a data integrity, která za ní následují.
| Layer | What it adds | When it applies |
|---|---|---|
| Outer IP header | 20 bytes for IPv4, 40 for IPv6 | Always, and 40 rather than 20 if the outer path is v6 |
| ESP header | 8 bytes of SPI and sequence number | Always |
| Block cipher IV | 8 to 16 bytes depending on the transform | When the negotiated cipher uses one |
| Padding and trailer | Padding to the block size, plus two trailer bytes | Always, and the amount varies with payload length |
| Integrity data | 12 to 16 bytes for common authenticated ciphers | When integrity protection is negotiated |
| UDP encapsulation | 8 bytes | NAT traversal on port 4500, which is common for clients behind NAT |
Žádný z těch řádků není napříč nasazeními konstantní a řádek s výplní není konstantní ani v rámci jednoho nasazení. To je celý důvod, proč jedno publikované číslo režie zklame.
Dvě lokality se mohou o stejném tunelu neshodnout
Chráněný paket pořád musí projít vnější trasou a vnější trasa není všude stejná. Přístupová linka PPPoE unese méně než čistý segment Ethernet. Mobilní síť se může dál zmenšit a poskytovatel, který tuneluje vlastní provoz, přidá další zapouzdření, o kterém nikdo nemluvil. Tunel, který na jedné lince funguje a na jiné selhává, popisuje druhou linku, ne protokol.
Oba směry se také mohou lišit. Asymetrická trasa vám může dát funkční upload a zaseknutý download, což vypadá jako problém aplikace, dokud se nepodíváte na velikosti paketů místo na dostupnost. Úspěšný malý ping dokazuje o odpovědi plné velikosti velmi málo.
Měřte místo odečítání
Najděte největší datagram, který trasou projde. Pak ho porovnejte s hodnotou, kterou hlásí rozhraní:
ip link show eth0 | grep -o 'mtu [0-9]*' ip xfrm state list ping -M do -s 1400 198.51.100.7 ping -M do -s 1372 198.51.100.7 tcpdump -ni any -c 20 'esp or udp port 4500'
Snižujte velikost pingu, dokud nepřijdou odpovědi, a největší fungující hodnotu berte jako rozpočet pro danou trasu. Výstup xfrm vám řekne, který režim a které algoritmy byly vyjednány, což je vstup pro každý poctivý výpočet. Zachycení potvrdí, zda je na lince ESP, nebo ESP obalené v UDP, a to vyřeší otázku NAT bez hádání.
Vyhraďte jednu hodnotu i pro řídicí rovinu. Pakety IKE handshake mají jinou strukturu než datové pakety, takže velikost odvozená ze zachycení handshake není MTU datové roviny.
Dejte číslo tam, kam patří
Pro TCP tunelem je omezení MSS často nejméně invazivní kontrola, protože snižuje to, co koncové body posílají, aniž by měnilo samotný tunel. U tunelu založeného na trasách nastavte MTU tunelového rozhraní záměrně a zdokumentujte proč. Udělat obojí najednou a pak měřit vám nedá žádnou informaci o tom, co pomohlo.
Držte v tiketu pohromadě vyjednaný režim, vnější rodinu, stav NAT a reprodukovatelný symptom. Zaznamenaná sada čtyř faktů porazí zapamatovanou konstantu a je to jediná verze tohohle, která přežije příští upgrade klienta.