Sizda egilmaydigan talab bor: qarshi tomon yuboruvchi chiqaradigan o‘sha 1,500 baytli IP paketni sarlavhalari bilan birga olishi kerak. Tunnel bu paketni o‘z freyminqi bilan birga ikkinchi 1,500 baytli IP paketga sig‘dira olmaydi, shuning uchun dizaynda nimadir yon berishi kerak. Quyidagi tartib — men o‘zgartirish oynasida ishlatadigan tartib: bayt byudjetini yozish, underlay aslida nima tashiy olishini isbotlash, so‘ng aynan bitta tashish mexanizmini tanlash va qarshi tomonda ichki paketni tasdiqlash.

Profilni tahrirlashdan oldin bayt byudjetini yozing

Inkapsulyatsiya bir necha qatlamda bayt qo‘shadi, jami esa qidirib topiladigan konstanta emas, profilingiz xossasidir. Manzil oilasi, shifr tanlovi, transport protokoli va har qanday siqish yoki freyminq varianti sonni siljitadi, shuning uchun boshqa joylashtirishdan ko‘chirilgan ayirish byudjet sifatida foydasiz. Ichki talabdan boshlang, o‘z konfiguratsiyangizning o‘lchangan har-paket qo‘shimcha yukini qo‘shing va natijaviy tashqi o‘lchamni kimdir faylni tahrirlashidan oldin o‘zgartirish chiptasiga yozing.

Dizaynni ikki son hal qiladi: yo‘l fragmentatsiyasiz tashiydigan eng katta tashqi paket va inkapsulyatsiyangizga kerak bo‘lgan qo‘shimcha baytlar. Birinchisi ikkinchisiga 1,500 qo‘shilganidan kichik bo‘lsa, ulardan biri o‘zgarishi kerak. Shunda tanlov ijodiy emas, tor bo‘ladi, shuning uchun variantlarni muhokama qilishdan oldin ikkala sonni yozib qo‘yaman. Tunnel qatlamida bu baytlarni siqib yo‘q qiladigan hech narsa yo‘q va bitta MTU butun soni sizga berilgan talabni bekor qilmaydi.

Underlayni do-not-fragment ping bilan tekshiring

Interfeys MTU siga ishonmay yo‘lni o‘lchang, chunki tashqi yo‘ldagi eng kichik bo‘g‘in muhim. Linux da, -M do do-not-fragment bitini o‘rnatadi va -s ICMP yukini oladi, shuning uchun 20 baytli IP sarlavhasi va 8 baytli ICMP sarlavhasi ayirilganda 1,500 baytli freym 1,472 bayt yuk bilan javob beradi. Tekshiruv muvaffaqiyatsiz bo‘lguncha yukni oshiring, so‘ng jumbo o‘lchamga sakrab, yo‘l uni umuman tashiy olishini ko‘ring.

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

1,472 dan o‘tib 8,972 da muvaffaqiyatsiz bo‘ladigan yo‘l 1,500 baytli ichki paketni qo‘shimcha yuk bilan bitta tashqi paketda tashiy olmaydi. Bu VPN konfiguratsiyasini ochishdan oldin kerak bo‘lgan javob. U keyingi ikki bo‘limdan qaysi biri sizga tegishli ekanini ham hal qiladi, shuning uchun ikkala tekshiruv natijasini chipta yonida saqlang. Bu yerda taxmin qilish bitta xizmat ko‘rsatish oynasini yo‘qotadi, chunki o‘zini up deb e’lon qiladigan tunnel yo‘l qabul qiladigan eng katta paket haqida hech narsa demaydi.

Yo‘l MTU sini faqat har bir hop rozi bo‘lgan joyda ko‘taring

Jumbo freymlar end-to-end xossasidir, siz tasodifan boshqaradigan ikki endpointda yoqadigan sozlama emas. Tashqi yo‘ldagi har bir switch, router va provayder uzatishi kattaroq o‘lchamga rozi bo‘lishi kerak, bitta 1,500 baytli hop esa siz endigina kattalashtirgan paketni jimgina tashlab yuboradi. Faqat mahalliy interfeysni ko‘tarish tunnelni buzilgandek ko‘rsatib, underlay jimgina tashlab yuboradigan klassik yarim o‘zgarishdir.

ip link set dev eth1 mtu 9000
ip link show dev eth1
ping -M do -s 8972 -c 2 198.51.100.10

Interfeysni o‘zgartiring, so‘ng boshqa narsani o‘zgartirishdan oldin o‘sha yo‘lni qayta tekshiring. Tekshiruv hali ham muvaffaqiyatsiz bo‘lsa, qaytaring ip link set dev eth1 mtu 1500 va o‘zingizga tegishli bo‘lmagan liniya haqida provayder bilan bahslashish o‘rniga fragmentatsiyaga o‘ting.

Underlay o‘sa olmasa, tunnel fragmentatsiyasidan foydalaning

Ichki paket ostidagi qo‘llab-quvvatlanadigan fragmentatsiya mexanizmi bir necha tashqi paketga bitta ichki paketni tashish imkonini beradi, qarshi tunnel endpoint esa asl nusxani stekka berishdan oldin ularni qayta yig‘adi. Community OpenVPN ning UDP fragment varianti bu g‘oyaning bitta tatbiqidir va tashqi paketning oddiy IP fragmentatsiyasi bilan bir narsa emas. Ikkala peer ham bu formatni qo‘llab-quvvatlaydigan versiyani ishga tushirishi kerak, ma’lumot yo‘li esa siz o‘ylagan yo‘l bo‘lishi kerak: OpenVPN 3 mijozlari va yadro tomonidan tezlashtirilgan ma’lumot kanallari turli chegaralarga ega, shuning uchun bir mijozda ishlaydigan profil boshqasida muvaffaqiyatsiz bo‘lishi mumkin.

openvpn --config client.ovpn --tun-mtu 1500 --fragment 1400 --verb 4

Oddiy tashqi fragmentatsiya boshqa variant va u zaifroq. IPv6 routerlar uzatilgan paketni umuman fragmentatsiya qilmaydi, shuning uchun haddan tashqari katta tashqi paket shunchaki o‘ladi va yuboruvchi bu haqda faqat tegishli ICMPv6 xabari yo‘lda omon qolsa biladi. Fragmentlar filtrlash va yo‘qotish kuchayishini ham chaqiradi, shuning uchun men buni reja emas, zaxira variant deb bilaman.

Oqimga asoslangan tashqi tashuvchi o‘z bayt oqimini segmentlarga bo‘lish orqali o‘lcham masalasini chetlab o‘tadi, qayta tiklangan ichki paket esa hali ham 1,500 bayt bo‘lishi mumkin. Bu o‘z narxiga ega transport qarori, jumladan TCP ichidagi TCP ning mashhur xatti-harakati, shuning uchun uni MTU bahsining yon ta’siri sifatida emas, ataylab qabul qiling.

Ichki paket o‘zgarmagan holda yetib kelishini tasdiqlang

Tekshirish muvaffaqiyatli handshake emas. Ikkala uchida tunnel interfeysida yozib oling va ilova haqiqatda yuborgan paketning o‘lchami va mazmunini qarshi tomon olgan narsa bilan solishtiring.

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'

Agar yozuv qarshi uchida to‘liq o‘lchamli ichki paketni ko‘rsatsa, tashish tanlovi ishlaydi va qolgan ish uni hujjatlashtirish. Agar tunnel o‘zini up deb e’lon qilayotganda hech narsa ko‘rsatmasa, tashqi paket endpointlar orasida qayerdadir tashlab yuborilmoqda, bu sizni shifr sozlamalariga emas, tekshiruvga qaytaradi.

Chiptani yopishdan oldin uch narsani yozing: o‘lchangan tashqi byudjet, tanlangan mexanizm va ichki paket omon qolganini isbotlagan buyruq. Bu tunnelga keyingi tegadigan odamga uchtasi ham kerak bo‘ladi va ularning hech birini faqat konfiguratsiya faylidan qayta qurish mumkin emas.

O'xshash maqolalar