Dlaczego VPN zawiesza się przy dużych transferach, a nie przy małych
Małe żądania odpowiadają, a duże transfery zamierają. Porównaj limit interfejsu, limit ścieżki i ogłaszany ładunek TCP, zanim skopiujesz stały MTU.
Strona się ładuje, ping się udaje, a kopiowanie pliku za każdym razem zawiesza się w tym samym miejscu. Ten wzorzec wskazuje na rozmiar pakietu, a nie na przepustowość czy dane logowania. Hermetyzacja dodaje bajty do każdego pakietu, więc ładunek, który mieścił się na pierwotnej trasie, po przejściu przez tunel może przekroczyć limit. W tych rozmowach trzy różne liczby nazywa się MTU, a ich mieszanie prowadzi do ustawienia, które naprawia jedną aplikację i psuje inną.
Trzy liczby, które ludzie nazywają MTU
MTU interfejsu to skonfigurowany limit pakietu na tym łączu. MTU ścieżki to najmniejszy limit na trasie, i jest wykrywany, a nie konfigurowany. TCP MSS to rozmiar ładunku, który partner deklaruje jako odbieralny, i wynika z pozostałych dwóch, a nie jest osobnym limitem fizycznym.
Tunel ma widok wewnętrzny i zewnętrzny. Pakiet zewnętrzny niesie pakiet hermetyzowany plus nagłówki potrzebne protokołowi, więc użyteczny rozmiar wewnętrzny jest mniejszy niż pozwala zewnętrzna trasa. Trasa do serwera VPN różni się też od trasy serwera do celu.
Wykrywanie MTU ścieżki pozwala nadawcy poznać działający rozmiar, ale zależy od dotarcia informacji zwrotnej. Gdy urządzenie pośrednie filtruje odpowiednie komunikaty ICMP, nadawca dalej wysyła pakiety, które nigdy się nie kończą, i to jest klasyczna czarna dziura. Objaw jest charakterystyczny, gdy się go zna: uzgadnianie się udaje, pierwszy ładunek pełnego rozmiaru znika, a połączenie w końcu się resetuje lub zawiesza. Nic w dzienniku aplikacji nie wygląda na problem sieciowy.
Zbadaj trasę ładunkiem, który kontrolujesz
Test jest dowodem dotyczącym jednej trasy i jednego rozmiaru, a nie zalecanym ustawieniem. Użyj hosta, który odpowiada, i zmieniaj tylko rozmiar ładunku.
ping -M do -s 1372 -c 2 203.0.113.20 ping -4 -f -l 1372 vpn.example
Pierwsze polecenie wysyła test linuksowy z wyłączoną fragmentacją i ładunkiem 1372 bajtów, a drugie robi to samo w Windows, gdzie ładunek ustawia się przez -l. Odpowiedź oznacza, że ten rozmiar przetrwał trasę. Komunikat o konieczności fragmentacji jest informacyjny, natomiast przekroczenie czasu jest niejednoznaczne, bo host lub urządzenie pośrednie może po prostu odrzucić ICMP.
Schodź z rozmiarem w kilku krokach, zamiast szukać binarnie co do bajtu. Próbujesz ustalić, czy istnieje pułap rozmiaru, a nie publikować liczbę dla każdej sieci. Znaleziona liczba dotyczy tej trasy, tego protokołu i tej rodziny adresów.
IPv4 i IPv6 fragmentują inaczej, więc wynik z jednej rodziny nic nie mówi o drugiej. Testuj rodzinę, której aplikacja faktycznie używa.
Zaciskanie MSS pomaga tylko TCP
W TCP efektywny ładunek jest negocjowany podczas uzgadniania, a router na trasie może przepisać tę wartość w dół, aby oba końce wysyłały mniejsze segmenty. To robi zaciskanie MSS i działa bez dotykania klienta.
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu ip link show tun0
Pierwsza reguła zaciska ogłaszane MSS do MTU ścieżki dla przekazywanych uzgodnień TCP, a druga pokazuje własne MTU interfejsu tunelu, aby porównać je z tym, co dopuszcza trasa. Zaciskanie to najmniej inwazyjna naprawa aplikacji TCP, która zawiesza się po uzgodnieniu.
Dla UDP nie robi nic. Klient głosowy lub gry wysyłający duże datagramy całkowicie zignoruje ustawienie MSS, bo nie ma uzgodnienia do przepisania. Jeśli zawodząca aplikacja działa po UDP, spójrz zamiast tego na opcje rozmiaru pakietu w samym kliencie. Oba protokoły zawodzą inaczej i są naprawiane innymi narzędziami, dlatego protokół należy do pierwszego zdania zgłoszenia.
OpenVPN udostępnia opcje takie jak tun-mtu, mssfix i ustawienia związane z fragmentacją, a ich działanie zależy od wersji i od tego, czy kanał danych jest AEAD. Przeczytaj podręcznik dla używanej wersji i zmieniaj jedną opcję naraz.
Zmień jedno obsługiwane ustawienie i powtórz oba przebiegi
Zachowaj oryginalny profil, zmień jedną obsługiwaną wartość i powtórz zarówno małe żądanie, które działało, jak i duże przesłanie, które zawiodło. Jeśli zmienia się tylko duże, goniłeś rozmiar. Jeśli zmieniają się oba, coś innego ruszyło razem z nim.
Niższa wartość może złagodzić objaw, dodając narzut, więc najmniejsza możliwa liczba nie jest celem. Celem jest rozmiar, który trasa niezawodnie niesie przy najmniejszym marnotrawstwie. Zapisz wartość, trasę i wersję klienta w zgłoszeniu, bo ta sama liczba zastosowana gdzie indziej to zgadywanie.
Jeśli ten sam profil działa z innej zaufanej sieci, zachowaj tę różnicę w diagnozie, zamiast ogłaszać klienta naprawionym. Zmienną, która się zmieniła, jest trasa, a trasę zmierzył test.