Naj promet IPv6 poteka skozi VPN ali neposredno?
Odločite, ali ::/0 spada v notranjost tunela, po treh pogojih: podpora izhoda, dosegljivost končne točke in samo lokalna omrežja.
Prejšnji mesec sta me dve osebi prosili za nasprotna rezultata: ena je želela, da VPN pokriva IPv6, druga je želela, da pisarniški tiskalnik še naprej deluje. Ena sama pot ::/0 ne more zagotoviti obojega. Ali ta pot spada v notranjost tunela, je odvisno od treh pogojev, prvi pa jo izključi za večino komercialnih izhodov. Če izhod ne prenaša IPv6, usmerjanje privzete poti tja skrije vaš promet v tunelu, ki ga nima kam poslati.
Trije pogoji odločajo o odgovoru
Privzeta pot je ena vrstica, ::/0, in se ujema z vsakim ciljem IPv6 brez bolj specifične poti (RFC 4291). Namestiti jo je enostavno. Odločitev, ali bi morali, se zoži na tri pogoje.
Prvi pogoj: izhod, s katerim se povežete, ima delujoč IPv6 in ga je pripravljen posredovati. Drugi pogoj: vaš odjemalec lahko ohrani pot do končne točke tunela, ki običajno leži v obsegu, ki ga nameravate usmerjati. Tretji pogoj: lahko poimenujete lokalne cilje IPv6, ki morajo ostati zunaj tunela.
Vsak pogoj odpove na svoj način, zato ugibanje stane cel večer. Spodleteli prvi pogoj vam da tišino in usmerjevalno tabelo, ki je videti pravilna. Spodleteli drugi pogoj ubije rokovanje nekaj sekund po začetku. Spodleteli tretji pogoj pusti delujoč tunel in nezadovoljnega sodelavca pri tiskalniku.
| What you see | Decision |
|---|---|
| Exit answers IPv6 probes, no local IPv6 devices to protect | Route ::/0 into the tunnel |
| Exit answers IPv6 probes, printer or NAS reachable by a global address | Route ::/0, then give those prefixes a route of their own |
| Exit is IPv4-only inside the tunnel | Do not route ::/0; block IPv6 on the client |
Endpoint is reached over IPv6 and sits inside ::/0 | Install a host route for the endpoint first |
Ali izhod res prenaša IPv6?
Vmesnik tunela z naslovom IPv6 ne dokazuje ničesar o drugi strani. Mnogi komercialni profili so znotraj samo IPv4: strežnik vam da naslov v4 in zavrže vse ostalo. Nad to namestite privzeto pot iz AllowedIPs in jedro bo z veseljem poslalo IPv6 v vmesnik, katerega partner ga nikoli ne vidi.
Preizkusite z odjemalca, ko je tunel vzpostavljen. ping -6 -c 3 2001:4860:4860::8888 in ip -6 route get 2001:4860:4860::8888 odgovarjata na različni vprašanji: ali se odgovor vrne in katero napravo je izbralo jedro. Ko drugo poimenuje vaš tunel, prvo pa ne vrne ničesar, je težava v izhodu, ne v poti.
Če izhod upravljate sami, lahko preizkus odjemalca uspe, pot pa se vseeno konča v slepi ulici. Potrdite net.ipv6.conf.all.forwarding=1 na prehodu in da njegov požarni zid sprejema pakete, posredovane iz tunela. Pravilno usmerjen paket v izhod, ki noče posredovati, je z vidika odjemalca videti natanko kot napaka usmerjanja.
Ali lahko odjemalec ohrani pot do končne točke?
To je primer, ki me je ujel na prenosniku s končno točko WireGuard samo IPv6. Naslov končne točke je običajen globalni naslov, zato pade v ::/0. Usmerite celotno predpono v vmesnik in paketi rokovanja bodo lovili sami sebe v tunel, ki ga še poskušajo zgraditi. Tunel se nikoli ne dvigne in nič v izhodu odjemalca ne pove, zakaj.
wg-quick to rešuje v Linuxu. Izpelje poti iz AllowedIPs, namesti jih v svojo tabelo in doda pravilo politike, da se promet do končne točke najprej razreši prek glavne tabele: pravilo suppress_prefixlength 0, ki ga najdete v ip -6 rule. Zato wg-quick up uspe tam, kjer ročno napisana ip -6 route add default dev wg0 vas odreže.
Preverite obe stanji s ip -6 route get <endpoint-v6>, pred dvigom tunela in po njem. Če se odgovor spremeni na vašo tunelsko napravo, ste odstranili pot, ki jo tunel potrebuje. Ko poti pišete sami, dodajte pot gostitelja do končne točke skozi prvotni prehod, ali se povežite s končno točko prek IPv4 in pustite IPv6 tovoru.
Kaj mora ostati zunaj tunela?
Bolj specifične poti premagajo privzeto, zato predpona na povezavi ali obseg ULA z lastno potjo deluje naprej brez dodatnega truda. To je tihi razlog, da toliko nastavitev IPv4 s polnim tunelom preživi: predpone LAN so bolj specifične od privzete in nikoli ne vstopijo v tunel.
Zlomi se, ko je lokalna naprava dosegljiva prek globalnega naslova, kar je običajno za tiskalnik, ki mu je isti usmerjevalnik dal javno predpono, NAS ali televizor. Ti naslovi ustrezajo ::/0 in ničemur drugemu, zato se preselijo v tunel z vsem ostalim in izginejo.
Odločajte po cilju, ne po protokolu. Če sta pomembna dva ali trije lokalni gostitelji, dajte njihovim predponam pot ven skozi fizični vmesnik, ali jih odstranite iz dogovorjenega nabora. Če seznam še naprej raste, je pošten odgovor split tunneling za IPv6 s pisnim seznamom izjem, ne privzeta pot, ki jo nenehno krpate.
Če je odgovor ne, ga blokirajte
Pustiti IPv6 brez poti ni isto kot pustiti ga pri miru. Gostitelj z delujočo privzeto potjo IPv6 jo še naprej uporablja, medtem ko tunel prenaša IPv4, zato promet odide ob VPN in vsaka storitev, ki daje prednost IPv6, vidi vaš pravi naslov. To je uhajanje, ne razdeljen tunel.
Izberite eno in zapišite, katero ste izbrali. Usmerite privzeto in sprejmite kompromise zgoraj, ali onemogočite IPv6 za čas trajanja tunela. Izpustitev predpone iz AllowedIPs sama po sebi ni dovolj, ker operacijski sistem obdrži svojo privzeto pot. V Linuxu je groba različica sysctl -w net.ipv6.conf.all.disable_ipv6=1; finejša različica spusti IPv6 zunaj tunela s pravilom požarnega zidu. Telefonski odjemalci imajo izrecno stikalo za blokiranje IPv6, ki opravi isto delo.
Preverite kot uhajanje
Dvignite tunel in preberite stanje, namesto da bi zaupali stikalu. ip -6 route show default bi moral pokazati eno privzeto pot, ip -6 route get pa bi moral za cilj zunaj vaše LAN poimenovati tunelsko napravo. Ponovite oboje po prekinitvi: privzeta pot, ki preživi tunel, je napaka, ki ste jo iskali.
Nato preizkusite nasprotno smer. Z gostitelja v lokalnem omrežju dosezite odjemalca na njegovem lokalnem naslovu IPv6. Če to preneha delovati, tretji pogoj ni bil nikoli izpolnjen, kar koli je takrat trdila usmerjevalna tabela.
Rezultat zapišite tam, kjer ga bo našla naslednja oseba: katere predpone ostanejo lokalne, zakaj in kaj odjemalec naredi po prekinitvi. Dve vrstici v runbooku prihranita naslednjemu inženirju ponovno odkrivanje zanke končne točke opolnoči.