Postavio sam net.ipv6.conf.all.forwarding=1 na Debian gateway da bi mogao prosljeđivati promet VPN klijenata, i otprilike pola sata kasnije stroj više nije imao IPv6 podrazumijevanu rutu. Uzlazni router je bio aktivan, link-local susjed je još odgovarao, a uplink je i dalje imao svoju globalnu adresu. Ono što je prestalo bila je spremnost kernela da na tom sučelju i dalje prihvaća router oglase. Ruta nije nestala kada sam otipkao sysctl; nestala je kada je istekao životni vijek RA-naučene podrazumijevane rute i ništa ju nije obnovilo.

Ništa nije izgledalo pokvareno na prvi pogled. Prosljeđivanje je radilo, klijenti su prolazili dok je stara ruta još bila u predmemoriji, a kvar je došao kasnije od promjene koja ga je uzrokovala. To kašnjenje je razlog zašto se to pripisuje uplinku ili firewall pravilu koje nikada nije bilo uključeno.

Pročitajte tablicu ruta prije nego dotaknete bilo koji sysctl

Počnite s ip -6 route show default i pročitajte atribute, ne samo gateway. RA-naučena podrazumijevana ruta označena je s proto ra, nosi preferenciju i pokazuje expires odbrojavanje. Ruta koju ste dodali ručno nema ni jedno ni drugo, a ta razlika vam kaže koji mehanizam posjeduje rutu.

$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref medium

Zatim pogledajte adresu: ip -6 addr show dev eth0. Globalna adresa s preferiranim i važećim životnim vijekovima mjerenim u satima nadživjet će podrazumijevanu rutu čiji se životni vijek routera mjeri u minutama. Adresa postoji, a podrazumijevana ruta nedostaje, to je potpis problema s oglasima. Ako nedostaje i adresa, prvo treba loviti link, informacije o prefiksu ili detekciju dupliciranih adresa.

Zašto prosljeđivanje isključuje obradu RA

RA je ICMPv6 paket tipa 134, poslan s link-local izvora s ograničenjem skoka 255. Prije nego što ga kernel upotrijebi, provjerava accept_ra sučelja. Zadana vrijednost je 1, a 1 ne znači da. Znači: prihvati samo dok ovaj host ne prosljeđuje. Postavite forwarding=1 i taj uvjet pada pa se oglas odbacuje prije nego što se u njemu razmotri bilo koji prefiks ili podrazumijevani router.

Postoje tri vrijednosti, a samo treća preživljava prosljeđivanje:

accept_raforwarding=0forwarding=1
0ignoredignored
1 (default)acceptedignored
2acceptedaccepted

Dvije druge zastavice odlučuju što se stvarno instalira. accept_ra_defrtr kontrolira hoće li podrazumijevani router iz oglasa postati ruta, a accept_ra_pinfo kontrolira hoće li se informacije o prefiksu koristiti za konfiguraciju adrese. Isključivanje accept_ra_defrtr uobičajen je način da se SLAAC adrese zadrže na hostu koji prosljeđuje bez učenja podrazumijevane rute. To je druga poluga od accept_ra i po nju posežete kada želite adrese, ali ne rutu. Referenca kernela za IP sysctl navodi sve tri.

Potvrdite to s tri naredbe

Prvo pročitajte žive vrijednosti umjesto datoteke za koju mislite da je učitana:

sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
       net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtr

Drugo, dokažite da oglasi još dolaze. Filtriranje po bajtu tipa ICMPv6 dovoljno je i izbjegava čitanje zida prometa otkrivanja susjeda:

tcpdump -ni eth0 'icmp6 and ip6[40] == 134'

Ako se ništa ne pojavi tijekom nekoliko minuta, accept_ra nije vaš problem. Uzlazna strana je prestala oglašavati, nešto na putu filtrira ICMPv6 ili to sučelje zapravo nije na segmentu na kojem mislite. Treće, sami zatražite oglas i pročitajte njegova polja:

rdisc6 eth0

rdisc6 dolazi u paketu ndisc6 na Debianu i Ubuntuu. U izlazu pogledajte životni vijek routera i preferenciju prije nego što bilo što drugo promijenite. Oglas sa životnim vijekom routera 0 nalog je za uklanjanje podrazumijevanog routera i nijedna accept_ra vrijednost to ne pretvara u upotrebljivu rutu. Tako također uhvatite uzlazni CPE u načinu mosta koji dijeli prefikse, ali se nikada ne nudi kao router.

Učinite uplink jedinim popustljivim sučeljem

Ako uzlazna strana treba biti podrazumijevani router, ondje prihvaćajte oglase unatoč prosljeđivanju i nigdje drugdje:

# /etc/sysctl.d/60-ipv6-router.conf
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.eth0.accept_ra = 2
net.ipv6.conf.eth0.accept_ra_defrtr = 1

Ograničenje je važno jer je IPv6 prosljeđivanje jedan globalni prekidač u Linuxu, a ne jedan po linku. Upišite 1 u net.ipv6.conf.wg0.forwarding i zatim pročitajte net.ipv6.conf.all.forwarding: globalna vrijednost se preokrene i svako sučelje počinje prosljeđivati. Ne možete biti router na tunelu i običan host na LAN-u. Ono što možete ograničiti je prihvaćanje. Držite accept_ra=2 na uplinku, a sučelja tunela i LAN-a ostavite na 1 ili 0, kako zalutali oglas koji stigne preko tunela ne bi mogao instalirati podrazumijevanu rutu koja pokazuje u njega.

Privremeni sysctl -w neće preživjeti sljedeće podizanje sustava, a i systemd-networkd i NetworkManager upisuju te vrijednosti iz vlastite konfiguracije. U networkd postavite IPv6Forwarding=yes i IPv6AcceptRA=yes u .network datoteci uplinka; networkd dokumentira IPv6Forwarding kao globalno zbog istog razloga u kernelu. S NetworkManagerom, ipv6.method=auto na uplinku je ono što pokreće accept_ra vrijednost pa ponovno pročitajte sysctl nakon nmcli connection up umjesto da vjerujete prvoj provjeri.

Statička alternativa, ip -6 route add default via fe80::1 dev eth0, doista radi i razuman je odgovor kada uzlazni router ima stabilnu link-local adresu. Budite jasni oko toga što gubite. Statička podrazumijevana ruta nikada se ne obnavlja i nikada se ne povlači pa nastavlja pokazivati na mrtvog susjeda nakon što se uzlazni router zamijeni. RA ruta pada sigurno; statička pada tiho.

Testirajte proslijeđeni paket, a ne gatewayev vlastiti

Gatewayevi vlastiti pingovi mogu uspjeti na ruti koju nijedan klijent ne može koristiti, a mogu uspjeti i zato što je gateway izvor. Testirajte s povezanog klijenta, a zatim pitajte gateway što bi učinio za adresu tog klijenta:

# on the VPN client
ping -6 -c 3 2001:4860:4860::8888

# on the gateway, using a client address
ip -6 route get 2001:4860:4860::8888 from fd42:20::2

Zatim pričekajte jedan životni vijek routera i pogledajte ponovno. Stabilno stanje koje želite je podrazumijevana ruta označena proto ra čija se expires vrijednost stalno resetira, plus all.forwarding=1. Ako expires samo odbrojava, oglasi se još negdje odbacuju, a uobičajeni krivac je mrežni upravitelj koji prepisuje accept_ra nakon što se sysctl pri podizanju već izvršio.

Prije nego što ovo zaključite, potvrdite četiri stvari: podrazumijevana ruta je proto ra i obnavlja se, accept_ra=2 vrijedi samo za uplink, prosljeđivanje je i dalje 1 nakon podizanja sustava i nakon ponovnog pokretanja upravitelja, i klijent, a ne gateway, završava IPv6 ping. Ako klijent i dalje ne uspijeva sa zdravom rutom, sljedeći sumnjivac je povratni put ili uzlazni firewall, a ne oglas.

Povezani članci