Moet IPv6-verkeer deur die VPN of direk gaan?
Besluit of ::/0 binne die tonnel hoort, aan die hand van drie voorwaardes: uitgangsondersteuning, bereikbaarheid van die eindpunt en netwerke wat net plaaslik is.
Twee mense het my verlede maand vir teenoorgestelde uitkomste gevra: een wou hê IPv6 moet deur die VPN gedek word, die ander wou hê die kantoor se drukker moet aanhou werk. 'n Enkele roete ::/0 kan nie albei alleen lewer nie. Of daardie roete binne die tonnel hoort, hang van drie voorwaardes af, en die eerste een sluit dit vir die meeste kommersiële uitgange uit. As die uitgang geen IPv6 dra nie, verberg die stuur van die verstekroete daarin jou verkeer in 'n tonnel wat nêrens het om dit heen te stuur nie.
Drie voorwaardes bepaal die antwoord
Die verstekroete is een reël, ::/0, en dit pas by enige IPv6-bestemming sonder 'n meer spesifieke roete (RFC 4291). Dit is maklik om dit te installeer. Om te besluit of jy dit moet doen, kom op drie voorwaardes neer.
Voorwaarde een: die uitgang waaraan jy koppel, het werkende IPv6 en is bereid om dit aan te stuur. Voorwaarde twee: jou kliënt kan 'n pad na die tonnel-eindpunt behou, wat gewoonlik binne die reeks lê wat jy op die punt staan om te stuur. Voorwaarde drie: jy kan die plaaslike IPv6-bestemmings noem wat buite die tonnel moet bly.
Elke voorwaarde faal op sy eie manier, en daarom kos raai 'n hele aand. 'n Mislukte voorwaarde een gee jou stilte en 'n roetetabel wat korrek lyk. 'n Mislukte voorwaarde twee maak die handskud dood 'n paar sekondes nadat dit begin het. 'n Mislukte voorwaarde drie laat 'n werkende tonnel en 'n ongelukkige kollega by die drukker.
| 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 |
Dra die uitgang werklik IPv6?
'n Tonnelkoppelvlak met 'n IPv6-adres bewys niks oor die oorkant nie. Baie kommersiële profiele is binne slegs IPv4: die bediener gee jou 'n v4-adres en laat alles anders val. Installeer 'n verstek uit AllowedIPs boonop daarby en die kernel sal IPv6 met graagte in 'n koppelvlak stuur waarvan die eweknie dit nooit sien nie.
Toets vanaf die kliënt terwyl die tonnel op is. ping -6 -c 3 2001:4860:4860::8888 en ip -6 route get 2001:4860:4860::8888 beantwoord verskillende vrae: of 'n antwoord terugkom, en watter toestel die kernel gekies het. Wanneer die tweede jou tonnel noem en die eerste niks teruggee nie, is die uitgang die probleem, nie die roete nie.
As jy die uitgang self bestuur, kan die kliënttoets slaag en die pad steeds doodloop. Bevestig net.ipv6.conf.all.forwarding=1 op die gateway en dat sy firewall pakkette aanvaar wat uit die tonnel aangestuur word. 'n Korrek geroteerde pakket na 'n uitgang wat weier om deur te stuur, lyk presies soos 'n roetefout van die kliënt se kant af.
Kan die kliënt sy pad na die eindpunt behou?
Dit is die een wat my gevang het op 'n skootrekenaar met 'n slegs-IPv6 WireGuard-eindpunt. Die eindpuntadres is 'n gewone globale adres, so dit val binne ::/0. Stuur die hele voorvoegsel in die koppelvlak in en die handskudpakkette jaag hulself in die tonnel wat hulle nog probeer bou. Die tonnel kom nooit op nie, en niks in die kliënt se uitvoer sê hoekom nie.
wg-quick hanteer dit op Linux. Dit lei roetes van AllowedIPs af, installeer hulle in sy eie tabel en voeg 'n beleidsreël by sodat verkeer na die eindpunt eerste deur die hooftabel opgelos word: die suppress_prefixlength 0-reël wat jy in ip -6 rule vind. Daarom slaag wg-quick up waar 'n handgeskrewe ip -6 route add default dev wg0 jou afsny.
Kontroleer albei toestande met ip -6 route get <endpoint-v6>, voor en nadat jy die tonnel opgebring het. As die antwoord na jou tonneltoestel verander, het jy die pad verwyder wat die tonnel nodig het. Wanneer jy die roetes self skryf, voeg 'n gasheerreute vir die eindpunt deur die oorspronklike gateway by, of koppel aan die eindpunt oor IPv4 en laat IPv6 aan die vrag.
Wat moet buite die tonnel bly?
Meer spesifieke roetes klop die verstek, so 'n skakel-voorvoegsel of 'n ULA-reeks met sy eie roete bly sonder ekstra moeite werk. Dit is die stille rede waarom so baie voltonnel-IPv4-opstellings oorleef: die LAN-voorvoegsels is meer spesifiek as die verstek en gaan nooit in die tonnel in nie.
Dit breek wanneer 'n plaaslike toestel deur 'n globale adres bereikbaar is, wat normaal is vir 'n drukker wat deur dieselfde router van 'n openbare voorvoegsel voorsien is, 'n NAS of 'n televisie. Daardie adresse pas by ::/0 en niks anders nie, so hulle skuif saam met alles anders in die tonnel in en verdwyn.
Besluit per bestemming, nie per protokol nie. As twee of drie plaaslike gashere saak maak, gee hulle voorvoegsels 'n roete uit die fisiese koppelvlak, of haal hulle uit die onderhandelde stel. As die lys aanhou groei, is die eerlike antwoord splitsingstonnel vir IPv6 met 'n geskrewe uitsonderingslys, nie 'n verstek wat jy aanhou pleister nie.
As die antwoord nee is, blokkeer dit
Om IPv6 ongeroteer te laat, is nie dieselfde as om dit alleen te laat nie. 'n Gasheer met 'n werkende IPv6-verstek hou aan om dit te gebruik terwyl die tonnel IPv4 dra, so die verkeer verlaat die VPN langs en elke diens wat IPv6 verkies, sien jou werklike adres. Dit is 'n lek, nie 'n splitsingstonnel nie.
Kies een en skryf neer watter een jy gekies het. Stuur die verstek en aanvaar die afwegings hierbo, of skakel IPv6 af vir die duur van die tonnel. Om die voorvoegsel uit AllowedIPs weg te laat, is op sy eie nie genoeg nie, want die bedryfstelsel hou sy eie verstek. Op Linux is die bot weergawe sysctl -w net.ipv6.conf.all.disable_ipv6=1; die fyner weergawe laat IPv6 buite die tonnel val met 'n firewall-reël. Foonkliënte het 'n uitdruklike blokkeer-IPv6-skakelaar wat dieselfde werk doen.
Verifieer dit soos 'n lek
Bring die tonnel op en lees die toestand in plaas daarvan om die skakelaar te vertrou. ip -6 route show default behoort een verstek te wys, en ip -6 route get vir 'n bestemming buite jou LAN behoort die tonneltoestel te noem. Herhaal albei ná 'n ontkoppeling: 'n verstek wat die tonnel oorleef, is die fout waarna jy gesoek het.
Toets dan die ander rigting. Vanaf 'n gasheer op die plaaslike netwerk, bereik die kliënt op sy plaaslike IPv6-adres. As dit ophou werk, was voorwaarde drie nooit bevredig nie, wat die roetetabel ook al destyds beweer het.
Skryf die uitkoms neer waar die volgende persoon dit sal vind: watter voorvoegsels plaaslik bly, hoekom, en wat die kliënt ná 'n ontkoppeling doen. Twee reëls in 'n runbook spaar die volgende ingenieur daarvan om die eindpunt-lus om middernag te herontdek.