Perduoti fiksuotą 1,500 baitų vidinį paketą per VPN
Fiksuotas 1,500 baitų vidinis paketas netelpa į 1,500 baitų išorinį kelią. Išmatuokite antraštės sąnaudas, tada pasirinkite didesnį apatinio sluoksnio MTU arba palaikomą fragmentaciją.
Turite reikalavimą, kuris nesilenkia: kita pusė turi gauti tą patį 1,500 baitų IP paketą, kurį siunčia siuntėjas, įskaitant antraštes. Tunelis negali įdėti to paketo kartu su savo paties rėminimu į antrą 1,500 baitų IP paketą, todėl kažkas projekte turi nusileisti. Toliau pateikta tvarka yra ta, kurią naudoju keitimų lange: užrašyti baitų biudžetą, įrodyti, ką apatinis sluoksnis iš tikrųjų gali pernešti, tada pasirinkti tiksliai vieną perdavimo mechanizmą ir patvirtinti vidinį paketą kitoje pusėje.
Užrašykite baitų biudžetą prieš redaguodami profilį
Inkapsuliavimas prideda baitų keliuose sluoksniuose, o suma yra jūsų profilio savybė, o ne konstanta, kurią galima rasti. Adresų šeima, šifro pasirinkimas, transporto protokolas ir bet kokia glaudinimo ar rėminimo parinktis keičia skaičių, todėl iš kitos diegimo kopijuotas atėmimas kaip biudžetas yra bevertis. Pradėkite nuo vidinio reikalavimo, pridėkite išmatuotas savo konfigūracijos sąnaudas vienam paketui ir užrašykite gautą išorinį dydį keitimo užduotyje, prieš kam nors redaguojant failą.
Du skaičiai nulemia projektą: didžiausias išorinis paketas, kurį kelias perneša be fragmentacijos, ir papildomi baitai, kurių reikia jūsų inkapsuliavimui. Kai pirmasis yra mažesnis už antrąjį plius 1,500, vienas iš jų turi keistis. Tada pasirinkimas tampa siauras, o ne kūrybiškas, todėl abu skaičius užsirašau prieš aptardamas variantus. Tunelio lygmenyje niekas tų baitų nesuglaudina, ir joks vienas MTU sveikasis skaičius nepanaikina jums duoto reikalavimo.
Tyrinėkite apatinį sluoksnį do-not-fragment ping
Matuokite kelią, o ne pasitikėkite sąsajos MTU, nes svarbiausia yra mažiausia išorinio kelio grandis. Linux sistemoje, -M do nustato do-not-fragment bitą ir -s nurodo ICMP naudingąją apkrovą, todėl 1,500 baitų kadras atsako 1,472 baitų apkrova, kai atimama 20 baitų IP antraštė ir 8 baitų ICMP antraštė. Didinkite apkrovą, kol zondas nepavyksta, tada pereikite prie jumbo dydžio ir pažiūrėkite, ar kelias jį apskritai perneša.
ping -M do -s 1472 -c 2 198.51.100.10 ping -M do -s 8972 -c 2 198.51.100.10 tracepath -n 198.51.100.10
Kelias, kuris praeina 1,472 ir nepraeina 8,972, negali pernešti 1,500 baitų vidinio paketo su sąnaudomis viename išoriniame pakete. Tai atsakymas, kurio jums reikėjo prieš atidarant VPN konfigūraciją. Jis taip pat nulemia, kuri iš dviejų tolesnių dalių jums taikoma, todėl laikykite abu zondo rezultatus prie užduoties. Spėjimas čia kainuoja techninės priežiūros langą, nes tunelis, kuris praneša esąs up, nieko nepasako apie didžiausią paketą, kurį kelias priims.
Kelkite kelio MTU tik ten, kur sutinka kiekvienas maršrutizatorius
Jumbo kadrai yra end-to-end savybė, o ne nustatymas, kurį įjungiate dviejuose galiniuose taškuose, kuriuos atsitiktinai valdote. Kiekvienas komutatorius, maršrutizatorius ir tiekėjo perdavimo taškas išoriniame kelyje turi sutikti dėl didesnio dydžio, ir viena 1,500 baitų grandis tyliai išmes paketą, kurį ką tik padidinote. Tik vietinės sąsajos padidinimas yra klasikinis pusinis pakeitimas, dėl kurio tunelis atrodo sugadintas, o apatinis sluoksnis tyliai meta.
ip link set dev eth1 mtu 9000 ip link show dev eth1 ping -M do -s 8972 -c 2 198.51.100.10
Pakeiskite sąsają, tada dar kartą patikrinkite tą patį kelią, prieš keisdami ką nors kita. Jei zondas vis dar nepavyksta, grąžinkite ip link set dev eth1 mtu 1500 ir pereikite prie fragmentacijos, o ne ginčykitės su tiekėju dėl jungties, kuri jums nepriklauso.
Naudokite tunelio fragmentaciją, kai apatinis sluoksnis negali augti
Palaikomas fragmentacijos mechanizmas žemiau vidinio paketo leidžia keliems išoriniams paketams pernešti vieną vidinį paketą, o kitas tunelio galinis taškas juos vėl surenka, prieš perduodamas originalą į steką. Community OpenVPN UDP fragmento parinktis yra viena tos idėjos realizacija ir tai nėra tas pats, kas įprasta išorinio paketo IP fragmentacija. Abu peer turi vykdyti versiją, palaikančią tą formatą, o duomenų kelias turi būti tas, kurį galvojate: OpenVPN 3 klientai ir branduolio pagreitinti duomenų kanalai turi skirtingas ribas, todėl profilis, veikiantis viename kliente, gali nepavykti kitame.
openvpn --config client.ovpn --tun-mtu 1500 --fragment 1400 --verb 4
Įprasta išorinė fragmentacija yra kitas variantas, ir jis silpnesnis. IPv6 maršrutizatoriai visiškai nefragmentuoja persiunčiamo paketo, todėl per didelis išorinis paketas tiesiog žūva, o siuntėjas apie tai sužino tik tada, jei atitinkamas ICMPv6 pranešimas išlieka kelyje. Fragmentai taip pat kviečia filtravimą ir nuostolių didėjimą, todėl laikau tai atsarginiu variantu, o ne planu.
Srautu pagrįstas išorinis nešiklis apeina dydžio klausimą segmentuodamas savo baitų srautą, o atkurtas vidinis paketas vis tiek gali būti 1,500 baitų. Tai transporto sprendimas su savo kaina, įskaitant gerai žinomą TCP elgesį TCP viduje, todėl priimkite jį sąmoningai, o ne kaip MTU ginčo šalutinį poveikį.
Patvirtinkite, kad vidinis paketas atvyksta nepakitęs
Patikra nėra sėkmingas rankos paspaudimas. Fiksuokite tunelio sąsajoje abiejuose galuose ir palyginkite paketo, kurį programa iš tikrųjų išsiuntė, dydį ir turinį su tuo, kurį gavo kita pusė.
ip link show dev tun0 ping -M do -s 1472 -c 2 10.8.0.1 tcpdump -ni tun0 -c 5 'icmp and greater 1000'
Jei fiksavimas rodo viso dydžio vidinį paketą kitame gale, perdavimo pasirinkimas veikia, o likęs darbas yra jį užrašyti. Jei jis nieko nerodo, kol tunelis praneša esąs up, išorinis paketas kažkur tarp galinių taškų išmetamas, o tai grąžina jus prie zondo, o ne prie šifro nustatymų.
Prieš uždarydami užduotį užrašykite tris dalykus: išmatuotą išorinį biudžetą, pasirinktą mechanizmą ir komandą, kuri įrodė, kad vidinis paketas išliko. Kitam žmogui, kuris lies šį tunelį, reikės visų trijų, ir nė vieno jų negalima atkurti vien iš konfigūracijos failo.