Jo hawwe in eask dy’t net bûcht: de fiere kant moat itselde 1,500-byte IP-pakket krije dat de ferstjoerder útstjoert, headers ynbegrepen. In tunnel kin dat pakket plus syn eigen framing net yn in twadde 1,500-byte IP-pakket stopje, dus der moat eat yn it ûntwerp tafalle. De folchoarder hjirûnder is dy’t ik brûk yn in feroaringsfinster: skriuw it bytebudzjet, bewize wat it ûnderlizzende netwurk eins drage kin, kies dan krekt ien ferfiersmeganisme en befêstigje it ynderlike pakket oan de oare kant.

Skriuw it bytebudzjet foardat jo in profyl bewurkje

Enkapsulaasje foeget bytes ta op ferskate lagen, en it totaal is in eigenskip fan jo profyl, net in konstante dy’t jo opsykje kinne. Adresfamylje, sjiferkar, ferfiersprotokol en elke kompresje- of framingopsje ferskowe it getal, dêrom is in ôflûking kopiearre út in oare ynset weardeleas as budzjet. Begjin by de ynderlike eask, foegje de mjitten overhead per pakket fan jo eigen konfiguraasje ta en skriuw de resultearjende úterlike grutte op it feroaringsticket foardat immen in bestân bewurket.

Twa getallen beslisse it ûntwerp: it grutste úterlike pakket dat it paad sûnder fragmintearring draacht, en de ekstra bytes dy’t jo enkapsulaasje nedich hat. As it earste lytser is as it twadde plus 1,500, moat ien fan beide feroarje. De kar is dan smel ynstee fan kreatyf, dêrom skriuw ik beide getallen op foardat wy opsjes besprekke. Neat op de tunnellaach komprimearret dy bytes fuort, en gjin inkeld MTU-hielgetal hellet de eask fuort dy’t jo krigen hawwe.

Probearje it ûnderlizzende netwurk mei do-not-fragment-pings

Mjit it paad ynstee fan te fertrouwen op de MTU fan de ynterface, want de lytste skeakel yn it úterlike paad is dy’t fan belang is. Op Linux set -M do de do-not-fragment-bit en -s nimt de ICMP-lading, dus in frame fan 1,500 byte antwurdet by 1,472 byte lading nei’t de IP-header fan 20 byte en de ICMP-header fan 8 byte ôflutsen binne. Gean mei de lading omheech oant de proef mislearret, spring dan nei in jumbo-grutte om te sjen oft it paad it hielendal draacht.

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

In paad dat 1,472 trochlit en by 8,972 mislearret, kin in ynderlik pakket fan 1,500 byte plus overhead net yn ien úterlik pakket drage. Dat is it antwurd dat jo nedich hiene foardat jo de VPN-konfiguraasje iepenen. It beslút ek hokker fan de twa folgjende seksjes op jo fan tapassing is, dus hâld de twa proefresultaten by it ticket. Rieden hjir kostet in ûnderhâldsfinster, want in tunnel dy’t him as aktyf meldt, seit neat oer it grutste pakket dat it paad akseptearret.

Ferheegje de MTU fan it paad allinnich dêr’t elke hop it mei iens is

Jumbo-frames binne in eigenskip fan ein oant ein, net in ynstelling dy’t jo oansette op de twa einpunten dy’t jo tafallich beheare. Elke switch, router en provider-oerdracht op it úterlike paad moat it mei de gruttere grutte iens wêze, en ien inkeld hop fan 1,500 byte sil it pakket dat jo krekt grutter makke hawwe stilwei weilizze. Allinnich de lokale ynterface ferheegje is de klassike heale feroaring wêrtroch’t de tunnel stikken liket wylst it ûnderlizzende netwurk stil falle lit.

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

Feroarje de ynterface en probearje dan itselde paad opnij foardat jo eat oars feroarje. As de proef noch mislearret, draai werom mei ip link set dev eth1 mtu 1500 en gean oer op fragmintearring ynstee fan te diskusjearjen mei in provider oer in skeakel dy’t jo net besitte.

Brûk tunnelefragmintearring as it ûnderlizzende netwurk net groeie kin

In stipe fragmintearringsmeganisme ûnder it ynderlike pakket lit ferskate úterlike pakketten ien ynderlik pakket drage, en it fiere tunnel-einpunt set se wer byinoar foardat it orizjineel oan de stack jûn wurdt. De UDP-fragmintopsje fan Community OpenVPN is ien implementaasje fan dat idee, en it is net itselde as gewoane IP-fragmintearring fan it úterlike pakket. Beide kanten moatte in ferzje draaie dy’t it formaat stipet, en it datapaad moat wêze dat jo tinke: OpenVPN 3-klanten en kernel-fersnelde datakanalen hawwe ferskillende grinzen, dus in profyl dat op ien klant wurket, kin op in oare mislearje.

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

Gewoane úterlike fragmintearring is de oare opsje, en dy is de swakkere. IPv6-routers fragmintearje in trochstjoerd pakket hielendal net, dus in te grut úterlik pakket stjert gewoan en de ferstjoerder heart der allinnich fan as it oanbelangjende ICMPv6-berjocht it paad oerlibbet. Fragminten freegje ek om filtering en ferliesfersterking, dêrom behannelje ik dit as in fallback en net as in plan.

In stream-basearre úterlike drager giet de gruttefrage foarby troch syn eigen bytestream te segmintearjen, en it weromelde ynderlike pakket kin noch hieltyd 1,500 byte wêze. Dat is in ferfiersbeslút mei eigen kosten, ynklusyf it bekende gedrach fan TCP yn TCP, dus nim it bewust en net as byeffekt fan in MTU-diskusje.

Befêstigje dat it ynderlike pakket ûnferoare oankomt

Ferifikaasje is net in slagge handshake. Fange op de tunnel-ynterface oan beide kanten en fergelykje de grutte en ynhâld fan it pakket dat de applikaasje wirklik stjoerde mei dat’t de fiere kant ûntfong.

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'

As de opname it ynderlike pakket fan folsleine grutte oan de fiere kant sjen lit, wurket de ferfierskar en is de oerbleaune taak it fêst te lizzen. As it neat sjen lit wylst de tunnel him as aktyf meldt, wurdt it úterlike pakket earne tusken de einpunten weilizze, wat jo weromstjoert nei de proef en net nei de sjifer-ynstellingen.

Skriuw trije dingen op it ticket foardat jo it slute: it mjitten úterlike budzjet, it meganisme dat jo keazen en de opdracht dy’t bewiisde dat it ynderlike pakket oerlibbe. De folgjende persoan dy’t dizze tunnel oanreizget, hat alle trije nedich, en gjinien kin út it konfiguraasjebestân allinnich werboud wurde.

Relatearre artikelen