OpenVPN na PPPoE: obniżyć link-mtu, tun-mtu czy mssfix?
Ping działa, ale duże strony zawieszają się na łączu PPPoE lub DS-Lite. Zdecyduj między link-mtu, tun-mtu i mssfix, mierząc ścieżkę, a nie zgadując.
Pingi odpowiadają, DNS rozwiązuje, a każda strona wymagająca pełnego segmentu zawiesza się. Na łączu, które dodaje własną enkapsulację, ścieżka po cichu traci kilkadziesiąt bajtów budżetu, a profil napisany dla czystego Ethernetu wciąż prosi o pakiety, których linia nie może unieść. Połączenie nie jest wolne; ono wyrzuca dokładnie te pakiety, które się liczą.
Trzy opcje mogą to naprawić i działają na różnych warstwach. Wybór złej albo nic nie robi, albo czyni tunel kruchym w nowy sposób, więc wybór zaczyna się od tego, co ścieżka naprawdę obsługuje.
Trzy pokrętła, trzy różne warstwy
link-mtu to budżet zewnętrzny: zaszyfrowany ładunek plus nagłówek OpenVPN, nagłówek UDP i zewnętrzny nagłówek IP. Opisuje to, co opuszcza maszynę, i dlatego jest liczbą, którą ogranicza fizyczna ścieżka.
tun-mtu to budżet wewnętrzny: interfejs, który widzi twój ruch. Jest dokładnie o narzut tunelu większy niż to, co ścieżka może unieść, a OpenVPN zwykle wyprowadza go sam, zamiast kazać ci go ustawiać.
mssfix to zupełnie inny mechanizm. Przepisuje maksymalny rozmiar segmentu ogłaszany podczas uścisków dłoni TCP, aby partnerzy TCP wybierali segmenty mieszczące się po enkapsulacji. Nie zmienia MTU interfejsu i nie ma żadnego wpływu na UDP.
Jeśli ustawisz link-mtu jawnie, OpenVPN odejmuje własny narzut, aby wyprowadzić wewnętrzne MTU. Ten narzut nie jest stałą; zależy od szyfru i uwierzytelniania, dlatego wartość skopiowana z forum może być błędna na innym profilu. Ustawienie zarówno link-mtu, jak i tun-mtu daje klientowi dwie sprzeczne instrukcje.
Zmierz ścieżkę, zanim wybierzesz jakąkolwiek liczbę
Mierz z fizycznego interfejsu, nie z wnętrza tunelu, i pamiętaj, że ping raportuje ładunek, a nie rozmiar pakietu. Dodaj 28 bajtów na nagłówki IPv4 i ICMP przed porównaniem ładunku z ramką 1500 bajtów i miej tę poprawkę na uwadze, gdy partner zgłosi inną liczbę.
W kliencie Linux ping -M do -s 1472 zabrania fragmentacji i kończy się niepowodzeniem, jeśli pakiet jest za duży. Zmniejszaj ładunek, aż przejdzie, a następnie dodaj 28, aby uzyskać MTU ścieżki. PPPoE kosztuje 8 bajtów, więc 1492 jest normalne na DSL. DS-Lite i niektóre ścieżki mobilne kosztują 40 lub więcej, a odpowiedź jest zwykle niższa, niż sugeruje nominalna prędkość łącza.
Jeśli każdy rozmiar pinga się udaje, ale duże transfery nadal się zawieszają, podejrzewaj czarną dziurę, a nie prosty limit rozmiaru. Komunikat ICMP o wymaganej fragmentacji jest gdzieś na ścieżce filtrowany, więc nadawca nigdy nie uczy się zmniejszać, i zauważają to tylko przepływy wymagające dużego segmentu.
Najpierw ogranicz TCP, potem zmniejsz tunel
Uściski dłoni TCP to jedyna rzecz, której dotyka mssfix, co zwykle czyni go najmniej inwazyjną kontrolą do wypróbowania najpierw. Ustaw go nieco poniżej rzeczywistego budżetu ścieżki, wyślij tę samą wartość z serwera, aby oba końce się zgadzały, i ponownie przetestuj duże pobieranie. Jeśli zawieszenie znika, problemem był rozmiar segmentu TCP i nic więcej nie trzeba zmieniać.
Obniż wewnętrzne MTU, gdy dotknięty ruch nie jest TCP. Usługa UDP, tunel w tunelu lub aplikacja wysyłająca pełnowymiarowe datagramy nadal będzie zawodzić po ograniczeniu MSS, bo nic nie przepisuje rozmiaru jej pakietów. Zmniejsz wtedy tun-mtu albo ustaw link-mtu i pozwól klientowi wyprowadzić wartość wewnętrzną, ale nigdy oba.
Nie sięgaj po starą opcję fragmentacji. Dzieliła pakiety wewnątrz tunelu, dodawała narzut i została wycofana z dobrych powodów; nowoczesny OpenVPN oczekuje dokładnego opisu ścieżki.
Dlaczego małe sondy nadal działają
Zapytania DNS, echa ICMP i uściski dłoni TCP są wszystkie znacznie poniżej rozmiaru, który zawodzi. Dlatego tunel wygląda zdrowo w każdym szybkim teście, podczas gdy uściski dłoni TLS i odpowiedzi HTTP po cichu zawodzą. Właśnie ta kombinacja, działający traceroute i przeglądarka zawieszająca się przy pierwszej dużej odpowiedzi, jest sygnałem, którego szukać. Sięgnij po sondę pełnego rozmiaru, zanim sięgniesz po nowy profil.
Sprawdź ruchem, który zawiódł. Pobierz dużą stronę, wyślij pełnowymiarowy datagram UDP, jeśli to jest dotknięta usługa, i powtórz z drugiego klienta na innym łączu. Zapisz zmierzone MTU ścieżki i wybraną wartość, bo inaczej następna osoba dotykająca profilu uzna tę liczbę za arbitralną.
Nigdy nie schodź z wewnętrznym MTU poniżej 1280, gdy IPv6 idzie przez tunel, bo to minimum, które musi unieść każde łącze IPv6. Mniejsze MTU to fakt o ścieżce, a nie ustawienie wydajności dostrajane na wyczucie.