Postavio sam net.ipv6.conf.all.forwarding=1 na Debian gateway kako bi mogao prosljeđivati promet VPN klijenata, i otprilike pola sata kasnije stroj više nije imao IPv6 zadanu rutu. Uzlazni usmjerivač bio je aktivan, link-local susjed još je odgovarao, a uplink je i dalje imao svoju globalnu adresu. Ono što je prestalo bila je spremnost jezgre 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 zadane 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 razlog je 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 zadana 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 govori 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 zadanu rutu čiji se životni vijek usmjerivača mjeri u minutama. Adresa postoji, a zadana ruta nedostaje, to je potpis problema s oglasima. Ako nedostaje i adresa, prvo treba loviti link, informacije o prefiksu ili otkrivanje 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 jezgra 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 zadani usmjerivač.

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 zadani usmjerivač 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 zadane rute. To je druga poluga od accept_ra i po nju posežete kada želite adrese, ali ne rutu. Referenca jezgre 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 prestala je 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 usmjerivača i preferenciju prije nego što bilo što drugo promijenite. Oglas sa životnim vijekom usmjerivača 0 nalog je za uklanjanje zadanog usmjerivača 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 usmjerivač.

Učinite uplink jedinim popustljivim sučeljem

Ako uzlazna strana treba biti zadani usmjerivač, 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 usmjerivač 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 zadanu 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 jezgri. S NetworkManagerom je ipv6.method=auto na uplinku 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 usmjerivač ima stabilnu link-local adresu. Budite jasni oko toga što gubite. Statička zadana ruta nikada se ne obnavlja i nikada se ne povlači pa nastavlja pokazivati na mrtvog susjeda nakon što se uzlazni usmjerivač 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 usmjerivača i pogledajte ponovno. Stabilno stanje koje želite je zadana 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: zadana 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