Narzut IPsec: tryb, NAT-T i algorytmy wszystko to zmieniają
Jedna opublikowana liczba narzutu opisuje jedną enkapsulację na jednej ścieżce. Zsumuj nagłówki, które twój tunel naprawdę negocjuje, a potem zmierz ścieżkę.
Gdzieś w poradniku jest liczba, zwykle między sześćdziesięcioma a osiemdziesięcioma bajtami, którą ktoś odjął od 1500, aby uzyskać MTU interfejsu. Ta liczba opisuje jedną konkretną enkapsulację na jednej konkretnej ścieżce. Zmień tryb, zewnętrzną rodzinę adresów, szyfr albo obecność NAT, a arytmetyka przestaje dotyczyć twojego tunelu.
Ta liczba pochodzi z innego tunelu
Narzut nie jest właściwością IPsec w ujęciu abstrakcyjnym. To właściwość pakietu, który naprawdę powstaje: wynegocjowany tryb, zewnętrzny nagłówek, nagłówek ochrony, dopełnienie, pole integralności i być może dodatkowa otoczka UDP.
Liczba podawana dla trybu transportowego z IPv4 i bez NAT opisuje mniejszy pakiet niż tryb tunelowy z IPv6 pod przejściem NAT. Obie są poprawne dla swojego przypadku. Skopiowanie którejkolwiek z nich do innego wdrożenia to sposób, w jaki ludzie kończą z MTU, które łamie duże transfery. Awaria jest cicha, bo małe zapytania nadal działają.
Zsumuj warstwy, które naprawdę są
Zacznij od zewnętrznego nagłówka IP i idź do środka. W trybie tunelowym oryginalny pakiet jest w środku, więc zewnętrzny nagłówek jest dodatkiem, a nie zamiennikiem. RFC 4303 opisuje nagłówek ESP, dopełnienie i dane integralności, które po nim następują.
| 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 |
Żaden z tych wierszy nie jest stały między wdrożeniami, a wiersz dopełnienia nie jest stały nawet w obrębie jednego wdrożenia. To cały powód, dla którego jedna opublikowana liczba narzutu rozczarowuje.
Dwie lokalizacje mogą się nie zgodzić co do tego samego tunelu
Chroniony pakiet nadal musi przejść zewnętrzną ścieżkę, a zewnętrzna ścieżka nie jest wszędzie taka sama. Łącze dostępowe PPPoE niesie mniej niż czysty segment Ethernet. Sieć komórkowa może się jeszcze bardziej skurczyć, a dostawca, który tuneluje własny ruch, dodaje kolejną enkapsulację, o której nikt nie wspomniał. Tunel, który działa na jednym łączu, a zawodzi na innym, opisuje drugie łącze, a nie protokół.
Oba kierunki też mogą się różnić. Asymetryczna trasa może dać działające wysyłanie i zablokowane pobieranie, co wygląda na problem aplikacji, dopóki nie spojrzysz na rozmiary pakietów, a nie na osiągalność. Udany mały ping dowodzi bardzo niewiele o odpowiedzi w pełnym rozmiarze.
Mierz zamiast odejmować
Znajdź największy datagram, który przetrwa ścieżkę. Następnie porównaj go z wartością, którą raportuje interfejs:
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'
Zmniejszaj rozmiar pingu, aż zaczną przychodzić odpowiedzi, i przyjmij największą działającą wartość jako budżet tej ścieżki. Wyjście xfrm mówi, który tryb i które algorytmy wynegocjowano, i to jest wejście do każdego uczciwego obliczenia. Przechwycenie potwierdza, czy w przewodzie jest ESP, czy ESP opakowany w UDP, i to rozstrzyga kwestię NAT bez zgadywania.
Zarezerwuj też jedną wartość dla płaszczyzny sterowania. Pakiety uzgadniania IKE mają inną strukturę niż pakiety danych, więc rozmiar wyprowadzony z przechwycenia uzgadniania nie jest MTU płaszczyzny danych.
Umieść liczbę tam, gdzie jej miejsce
Dla TCP przez tunel ograniczenie MSS jest często najmniej inwazyjną kontrolą, bo zmniejsza to, co wysyłają końce, nie zmieniając samego tunelu. Dla tunelu opartego na trasach ustaw MTU interfejsu tunelu świadomie i udokumentuj dlaczego. Zrobienie obu naraz i potem zmierzenie nie daje żadnej informacji, które pomogło.
Trzymaj razem w zgłoszeniu wynegocjowany tryb, zewnętrzną rodzinę, stan NAT i powtarzalny objaw. Zapisany zestaw czterech faktów bije zapamiętaną stałą i to jedyna wersja tego, która przetrwa następną aktualizację klienta.