Сізде бүгілмейтін талап бар: қарсы жақ жіберуші шығаратын сол 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-тер арасында бір жерде тасталады, бұл сізді шифр параметрлеріне емес, зондқа қайтарады.

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

Қатысты мақалалар