Сизде ийилбес талап бар: каршы тарап жөнөтүүчү чыгарган ошол эле 1,500 байттык IP пакетти, аталыштары менен кошо алууга тийиш. Туннель ал пакетти өзүнүн фрейминги менен кошо экинчи 1,500 байттык IP пакеттин ичине сала албайт, ошондуктан долбоордо бир нерсе багынышы керек. Төмөнкү тартип – мен өзгөртүү терезесинде колдонгон тартип: байт бюджети жазылат, underlay чындыгында эмнени ташып бере алары далилденет, анан так бир ташуу механизми тандалып, каршы тарапта ички пакет ырасталат.

Профилди оңдоодон мурун байт бюджети жазыңыз

Инкапсуляция бир нече катмарда байт кошот, ал эми жалпысы издей турган туруктуу сан эмес, сиздин профилдин касиети. Дарек үй-бүлөсү, шифр тандоо, транспорт протоколу жана ар кандай кысуу же фреймдөө параметри санды жылдырат, ошондуктан башка жайылтуудан көчүрүлгөн кемитүү бюджет катары пайдасыз. Ички талаптан баштап, өз конфигурацияңыздын өлчөнгөн пакеттик оверхебин кошуп, алынган тышкы өлчөмдү бирөө файлды оңдоодон мурун өзгөртүү билетине жазыңыз.

Долбоорду эки сан чечет: жол фрагментациясыз ташыган эң чоң тышкы пакет жана инкапсуляцияңызга керектүү кошумча байттар. Биринчиси экинчисине 1,500 кошулгандан кичине болсо, алардын бири өзгөрүшү керек. Ошондо тандоо чыгармачыл эмес, тар болуп калат, ошондуктан варианттарды талкуулоодон мурун эки санды тең жазып коём. Туннель деңгээлинде бул байттарды кысып жок кыла турган эч нерсе жок, ал эми бир MTU бүтүн саны сизге берилген талапты жок кыла албайт.

Underlay-ды do-not-fragment ping менен текшериңиз

Интерфейстин MTU-суна ишенбей жолду өлчөңүз, анткени тышкы жолдогу эң кичине звеносу маанилүү. Linux системаларында, -M do do-not-fragment битин коёт жана -s ICMP payload алат, ошондуктан 20 байттык IP аталышын жана 8 байттык ICMP аталышын кемиткенде 1,500 байттык фрейм 1,472 байт payload менен жооп берет. Текшерүү ийгиликсиз болгонго чейин payload-ду жогорулатыңыз, анан jumbo өлчөмгө секирип, жол аны такыр ташып берерин көрүңүз.

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ден өтүп, 8,972де ийгиликсиз болгон жол 1,500 байттык ички пакетти оверхеби менен бир тышкы пакетте таштай албайт. Бул VPN конфигурациясын ачканга чейин сизге керек болгон жооп. Ал ошондой эле кийинки эки бөлүмдүн кайсынысы сизге тиешелүү экенин чечет, ошондуктан эки текшерүү жыйынтыгын билеттин жанында кармаңыз. Бул жерде божомолдоо бир тейлөө терезесин корот, анткени өзүн up деп билдирген туннель жол кабыл ала турган эң чоң пакет жөнүндө эч нерсе айтпайт.

Жолдун MTU-сун гана бардык хоп макул болгон жерде көтөрүңүз

Jumbo фреймдер – end-to-end касиет, сиз кокустан башкара турган эки endpoint-те күйгүзө турган жөндөө эмес. Тышкы жолдогу ар бир коммутатор, роутер жана провайдердин өткөрүү пункту чоңураак өлчөмгө макул болушу керек, ал эми бир гана 1,500 байттык хоп жаңы эле чоңойткон пакетти үнсүз таштайт. Жергиликтүү интерфейсти гана көтөрүү – туннелди бузулгандай көрсөтүп, underlay үнсүз таштап жаткан классикалык жарым өзгөртүү.

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

Интерфейсти өзгөртүңүз, анан башка нерсени өзгөртүүдөн мурун ошол эле жолду кайра текшериңиз. Текшерүү дагы ийгиликсиз болсо, кайтарыңыз ip link set dev eth1 mtu 1500 жана өзүңүзгө таандык эмес байланыш жөнүндө провайдер менен талашуунун ордуна фрагментацияга өтүңүз.

Underlay өсө албаганда туннелдин фрагментациясын колдонуңуз

Ички пакеттин астындагы колдоого алынган фрагментация механизми бир нече тышкы пакетке бир ички пакетти ташууга мүмкүндүк берет, ал эми каршы тараптагы туннель endpoint түпнусканы стекке берүүдөн мурун аларды кайра чогултат. Community OpenVPNдин UDP fragment параметри ушул идеянын бир ишке ашырылышы жана тышкы пакеттин кадимки IP фрагментациясы менен бир нерсе эмес. Эки peer тең бул форматты колдогон версияны иштетиши керек, ал эми маалымат жолу сиз ойлогондой болушу керек: OpenVPN 3 кардарлары менен ядро менен ылдамдатылган маалымат каналдарынын чектөөлөрү башка, ошондуктан бир кардарда иштеген профиль экинчисинде ийгиликсиз болушу мүмкүн.

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

Кадимки тышкы фрагментация – экинчи вариант жана алсызыраак. IPv6 роутерлери берилген пакетти такыр фрагменттебейт, ошондуктан өтө чоң тышкы пакет жөн эле өлөт, ал эми жөнөтүүчү бул тууралуу тиешелүү ICMPv6 билдирүүсү жолдон аман өтсө гана билет. Фрагменттер чыпкалоого жана жоготуунун күчөшүнө да чакырат, ошондуктан мен муну план эмес, камсыздоо варианты катары караймын.

Агымга негизделген тышкы ташуучу өз байт агымын сегменттөө менен өлчөм маселесин айланып өтөт, ал эми кайра курулган ички пакет дагы эле 1,500 байт болушу мүмкүн. Бул өз баасы бар транспорт чечими, анын ичинде TCP ичиндеги TCPнин белгилүү жүрүм-туруму, ошондуктан аны MTU талашынын терс таасири катары эмес, атайын кабыл алыңыз.

Ички пакет өзгөрүүсүз келгенин ырастаңыз

Текшерүү – ийгиликтүү handshake эмес. Эки учунда тең туннель интерфейсинде жазып алыңыз жана колдонмо чындыгында жөнөткөн пакеттин өлчөмү менен мазмунун каршы тарап алган нерсе менен салыштырыңыз.

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'

Эгер жазуу каршы учта толук өлчөмдүү ички пакетти көрсөтсө, ташуу тандоосу иштейт жана калган иш – аны жазуу. Эгер туннель өзүн up деп билдирип жатканда эч нерсе көрсөтпөсө, тышкы пакет endpoint-тердин ортосунда бир жерде ташталып жатат, бул сизди шифр жөндөөлөрүнө эмес, текшерүүгө кайтарат.

Билетти жапканга чейин үч нерсени жазыңыз: өлчөнгөн тышкы бюджет, тандалган механизм жана ички пакет аман калганын далилдеген буйрук. Бул туннелге кийинки тийген адамга үчөө тең керек болот, алардын эч бирин гана конфигурация файлынан кайра курууга болбойт.

Тектеш макалалар