Teil on nõue, mis ei paindu: kauge pool peab saama sama 1,500-baidise IP-paketi, mille saatja väljastab, koos päistega. Tunnel ei saa seda paketti koos oma raamistusega teise 1,500-baidise IP-paketi sisse mähkida, seega peab disainis miski järele andma. Allpool olev järjekord on see, mida kasutan muudatuse aknas: kirjuta baidieelarve, tõesta, mida alumine kiht tegelikult kanda suudab, seejärel vali täpselt üks transportimismehhanism ja kinnita sisemine pakett vastaspool.

Kirjuta baidieelarve enne profiili muutmist

Kapseldamine lisab baite mitmel kihil ja kogusumma on sinu profiili omadus, mitte konstant, mida saaks otsida. Aadressipere, šifri valik, transpordiprotokoll ja mis tahes pakkimis- või raamistusvalik muudavad seda arvu, mistõttu teisest juurutusest kopeeritud lahutamine on eelarvena väärtusetu. Alusta sisemisest nõudest, lisa oma konfiguratsiooni mõõdetud ülekulu paketi kohta ja kirjuta tulemuseks saadud välimine suurus muudatuse piletile enne, kui keegi faili muudab.

Disaini otsustavad kaks arvu: suurim välimine pakett, mida tee ilma fragmenteerimiseta kannab, ja lisabaidid, mida sinu kapseldamine vajab. Kui esimene on väiksem kui teine pluss 1,500, peab üks neist muutuma. Valik on siis kitsas, mitte loov, mistõttu kirjutan mõlemad arvud üles enne valikute arutamist. Miski tunneli kihil neid baite kokku ei suru ja ükski MTU täisarv ei kõrvalda sulle antud nõuet.

Proovi alumist kihti fragmenteerimist keelavate pingidega

Mõõda teed, selle asemel et usaldada liidese MTU-d, sest välimise tee väikseim lüli on see, mis loeb. Linuxis seab -M do fragmenteerimiskeelu biti ja -s võtab ICMP kandevõime, seega 1,500-baidine raam vastab 1,472 baidi kandevõime juures, kui 20-baidine IP-päis ja 8-baidine ICMP-päis on maha arvatud. Kasvata kandevõimet, kuni proov ebaõnnestub, seejärel hüppa jumbo suurusele, et näha, kas tee seda üldse kannab.

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

Tee, mis läbib 1,472 ja ebaõnnestub 8,972 juures, ei suuda kanda 1,500-baidist sisemist paketti koos ülekuluga ühes välimises paketis. See on vastus, mida vajasid enne VPN-i konfiguratsiooni avamist. See otsustab ka, milline kahest järgmisest jaotisest sinu kohta kehtib, seega hoia kaks proovi tulemust pileti kõrval. Siin oletamine maksab ühe hooldusakna, sest tunnel, mis teatab end töötavana, ei ütle midagi suurima paketi kohta, mille tee vastu võtab.

Tõsta tee MTU-d ainult seal, kus iga hüpe nõustub

Jumbo-raamid on otsast-otsani omadus, mitte säte, mille lülitad sisse kahes lõpp-punktis, mida juhtumisi kontrollid. Iga lüliti, ruuter ja teenusepakkuja üleandmispunkt välimisel teel peab suurema suurusega nõustuma, ja üksainus 1,500-baidine hüpe viskab vaikselt kõrvale paketi, mille just suuremaks tegid. Ainult kohaliku liidese tõstmine on klassikaline poolik muudatus, mille tõttu tunnel näib katki, samal ajal kui alumine kiht vaikselt kaotab.

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

Muuda liidest ja proovi seejärel sama teed uuesti enne, kui midagi muud muudad. Kui proov ikka ebaõnnestub, võta tagasi käsuga ip link set dev eth1 mtu 1500 ja liigu fragmenteerimise juurde, selle asemel et vaielda teenusepakkujaga lüli üle, mis sulle ei kuulu.

Kasuta tunneli fragmenteerimist, kui alumine kiht ei saa kasvada

Toetatud fragmenteerimismehhanism sisemisest paketist allpool lubab mitmel välimisel paketil kanda üht sisemist paketti ja tunneli kaugem lõpp-punkt paneb need uuesti kokku enne originaali virnale andmist. Community OpenVPN-i UDP-fragmendi valik on selle idee üks teostus ja see ei ole sama, mis välimise paketi tavaline IP-fragmenteerimine. Mõlemad pooled peavad jooksutama versiooni, mis seda vormingut toetab, ja andmetee peab olema see, mida arvad: OpenVPN 3 kliendid ja kerneli kiirendatud andmekanalid on erinevate piirangutega, seega ühel kliendil töötav profiil võib teisel ebaõnnestuda.

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

Tavaline välimine fragmenteerimine on teine valik ja see on nõrgem. IPv6 ruuterid ei fragmenteeri edastatavat paketti üldse, seega liiga suur välimine pakett lihtsalt sureb ja saatja saab sellest teada ainult siis, kui asjakohane ICMPv6-teade teel ellu jääb. Fragmendid kutsuvad ka filtreerimist ja kadude võimendamist, mistõttu käsitlen seda varuvariandina, mitte plaanina.

Voolupõhine välimine kandja möödub suuruse küsimusest, segmentides omaenda baidivoo, ja rekonstrueeritud sisemine pakett võib endiselt olla 1,500 baiti. See on transpordiotsus, millel on oma hind, sealhulgas TCP tuntud käitumine TCP sees, seega tee see teadlikult, mitte MTU-vaidluse kõrvalmõjuna.

Kinnita, et sisemine pakett saabub muutumatuna

Kontrollimine ei ole edukas kätlemine. Jäädvusta tunneli liideses mõlemas otsas ja võrdle rakenduse tegelikult saadetud paketi suurust ja sisu sellega, mille kauge pool vastu võttis.

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'

Kui jäädvustus näitab kaugele otsa täissuuruses sisemist paketti, transpordivalik töötab ja jääb üle see kirja panna. Kui see ei näita midagi, samal ajal kui tunnel teatab end töötavana, visatakse välimine pakett kuskil lõpp-punktide vahel kõrvale, mis saadab sind tagasi proovi, mitte šifri seadete juurde.

Kirjuta piletile kolm asja enne selle sulgemist: mõõdetud välimine eelarve, valitud mehhanism ja käsk, mis tõestas, et sisemine pakett jäi ellu. Järgmine inimene, kes seda tunnelit puudutab, vajab kõiki kolme, ja ühtki neist ei saa ainult konfiguratsioonifailist taastada.

Seotud artiklid