Treba li IPv6 saobraćaj ici kroz VPN ili direktno?
Odlučite da li ::/0 pripada unutar tunela, po tri uslova: podrška izlaza, dostupnost krajnje tačke i samo lokalne mreže.
Dvije osobe su mi prošlog mjeseca tražile suprotne ishode: jedna je htjela da IPv6 bude pokriven VPN-om, druga je htjela da uredski printer nastavi raditi. Jedna ruta ::/0 ne može sama pružiti oboje. Da li ta ruta pripada unutar tunela zavisi od tri uslova, a prvi je isključuje za većinu komercijalnih izlaza. Ako izlaz ne nosi IPv6, usmjeravanje podrazumijevane rute u njega skriva vaš saobraćaj u tunelu koji nema kuda da ga pošalje.
Tri uslova odlučuju odgovor
Podrazumijevana ruta je jedan red, ::/0, i poklapa se sa svakim IPv6 odredištem bez specifičnije rute (RFC 4291). Instalirati je lako. Odluka da li biste trebali svodi se na tri uslova.
Uslov prvi: izlaz na koji se spajate ima ispravan IPv6 i spreman je da ga proslijedi. Uslov drugi: vaš klijent može zadržati put do krajnje tačke tunela, koja obično leži unutar opsega koji ćete usmjeravati. Uslov treći: možete navesti lokalna IPv6 odredišta koja moraju ostati izvan tunela.
Svaki uslov pada na svoj način, zato nagađanje košta cijelu večer. Neuspjeli prvi uslov daje vam tišinu i tabelu ruta koja izgleda ispravno. Neuspjeli drugi uslov ubija rukovanje nekoliko sekundi nakon početka. Neuspjeli treći uslov ostavlja ispravan tunel i nezadovoljnog kolegu kod printera.
| 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 |
Nosi li izlaz zaista IPv6?
Interfejs tunela sa IPv6 adresom ne dokazuje ništa o drugoj strani. Mnogi komercijalni profili su iznutra samo IPv4: server vam daje v4 adresu i odbacuje sve ostalo. Instalirajte podrazumijevanu rutu iz AllowedIPs povrh toga i kernel će rado slati IPv6 u interfejs čiji partner to nikada ne vidi.
Testirajte s klijenta dok je tunel aktivan. ping -6 -c 3 2001:4860:4860::8888 i ip -6 route get 2001:4860:4860::8888 odgovaraju na različita pitanja: da li se odgovor vraća i koji je uređaj kernel odabrao. Kada drugo navede vaš tunel, a prvo ne vrati ništa, problem je u izlazu, ne u ruti.
Ako sami vodite izlaz, klijentski test može proći, a put ipak završiti u slijepoj ulici. Potvrdite net.ipv6.conf.all.forwarding=1 na gatewayu i da njegov firewall prihvata pakete proslijeđene iz tunela. Ispravno rutiran paket u izlaz koji odbija da prosljeđuje izgleda s klijentske strane tačno kao greška u rutiranju.
Može li klijent zadržati put do krajnje tačke?
Ovo je slučaj koji me uhvatio na laptopu s WireGuard krajnjom tačkom koja radi samo na IPv6. Adresa krajnje tačke je obična globalna adresa, pa pada unutar ::/0. Usmjerite cijeli prefiks u interfejs i paketi rukovanja će sami sebe tjerati u tunel koji tek pokušavaju izgraditi. Tunel se nikada ne podiže, a ništa u izlazu klijenta ne kaže zašto.
wg-quick to rješava na Linuxu. Izvede rute iz AllowedIPs, instalira ih u svoju tabelu i doda pravilo politike tako da se saobraćaj do krajnje tačke prvo rješava kroz glavnu tabelu: pravilo suppress_prefixlength 0 koje nalazite u ip -6 rule. Zato wg-quick up uspijeva tamo gdje rukom napisana ip -6 route add default dev wg0 presiječe vezu.
Provjerite oba stanja pomoću ip -6 route get <endpoint-v6>, prije i poslije podizanja tunela. Ako se odgovor promijeni na vaš tunelski uređaj, uklonili ste put koji je tunelu potreban. Kada sami pišete rute, dodajte host rutu za krajnju tačku kroz originalni gateway ili se spojite na krajnju tačku preko IPv4 i ostavite IPv6 korisnom teretu.
Šta mora ostati izvan tunela?
Specifičnije rute pobjeđuju podrazumijevanu, pa on-link prefiks ili ULA opseg s vlastitom rutom nastavlja raditi bez dodatnog truda. To je tihi razlog zašto toliko full-tunnel IPv4 postavki preživi: LAN prefiksi su specifičniji od podrazumijevanog i nikada ne ulaze u tunel.
To se kvari kada je lokalni uređaj dostupan preko globalne adrese, što je normalno za printer koji je isti ruter dobio javnim prefiksom, NAS ili televizor. Te adrese odgovaraju ::/0 i ničemu drugom, pa se sele u tunel sa svim ostalim i nestaju.
Odluku donosite po odredištu, ne po protokolu. Ako su dva ili tri lokalna hosta važna, dajte njihovim prefiksima rutu kroz fizički interfejs ili ih izbacite iz dogovorenog skupa. Ako lista nastavi rasti, iskren odgovor je split tunneling za IPv6 s napisanom listom izuzetaka, a ne podrazumijevana ruta koju stalno krpite.
Ako je odgovor ne, blokirajte to
Ostaviti IPv6 bez rute nije isto kao ostaviti ga na miru. Host s ispravnom podrazumijevanom IPv6 rutom nastavlja je koristiti dok tunel nosi IPv4, pa saobraćaj izlazi pored VPN-a i svaka usluga koja preferira IPv6 vidi vašu stvarnu adresu. To je curenje, a ne split tunnel.
Odaberite jedno i zapišite šta ste odabrali. Usmjerite podrazumijevanu rutu i prihvatite kompromise gore, ili isključite IPv6 za vrijeme trajanja tunela. Izostavljanje prefiksa iz AllowedIPs nije dovoljno samo po sebi, jer operativni sistem čuva svoju podrazumijevanu rutu. Na Linuxu gruba verzija je sysctl -w net.ipv6.conf.all.disable_ipv6=1; finija verzija izbacuje IPv6 izvan tunela pravilom firewalla. Telefonski klijenti imaju eksplicitni prekidač za blokiranje IPv6 koji radi isti posao.
Provjerite to kao curenje
Podignite tunel i pročitajte stanje umjesto da vjerujete prekidaču. ip -6 route show default treba pokazati jednu podrazumijevanu rutu, a ip -6 route get za odredište izvan vaše LAN mreže treba navesti tunelski uređaj. Ponovite oboje nakon prekida veze: podrazumijevana ruta koja nadživi tunel je greška koju ste tražili.
Zatim testirajte drugi smjer. S hosta na lokalnoj mreži dosegnite klijent na njegovoj lokalnoj IPv6 adresi. Ako to prestane raditi, uslov treći nikada nije bio ispunjen, šta god tada tvrdila tabela ruta.
Zapišite ishod tamo gdje će ga sljedeća osoba naći: koji prefiksi ostaju lokalni, zašto i šta klijent radi nakon prekida veze. Dva reda u runbooku poštedjet će sljedećeg inženjera ponovnog otkrivanja petlje krajnje tačke u ponoć.