IPv6 usmjeravanje politike kada dva uzlazna linka dijele fe80::1
Dva uzlazna linka mogu prikazati isti sljedeći skok fe80::1 na različitim vezama. Odaberite jednu tablicu po politici, preuzmite vlasništvo nad trajanjima i provjerite pretragom rute.
Imate dva uzlazna linka, a ip -6 route show ispisuje isti sljedeći skok na oba: default via fe80::1 dev uplink0 i default via fe80::1 dev uplink1. To nije sukob dupliciranih adresa, a kopiranje golog sljedećeg skoka fe80::1 u tablicu politike ne govori kernelu na koju vezu ste mislili. Pravo pitanje uže je od onoga što simptom sugerira: treba li drugoj tablici jedna veza ili obje, i što te rute drži živima nakon restarta. Tri uvjeta, provjerena po redu, rješavaju većinu toga.
Isti fe80::1 su dva različita susjeda
Link-local adrese ograničene su na jednu vezu, pa fe80::1 nije jedna adresa ispisana dvaput; to su dva susjeda koja slučajno dijele sufiks. Indeks zone je način na koji host kaže na koju misli, pa su fe80::1%uplink0 i fe80::1%uplink1 različita odredišta za kernel, a taj sufiks nikada ne putuje do udaljenog usmjerivača. RFC 4007 opisuje model zona koji stoji za tim i zato tablica politike mora nositi uređaj uz svaki link-local sljedeći skok.
Generator VPN konfiguracije koji kopira numerički ID zone s jednog hosta u predložak tretira lokalni kontekst kao dio adrese, a datoteka koju zapisuje pogrešna je na svakom stroju čija se imena ili indeksi sučelja razlikuju. Ni tablica politike ne spaja dvije veze u jednu: usmjerena VPN prenosi pakete između mreža, ali ne prenosi link-local identitet udaljenog Ethernet susjeda kroz tunel, pa link-local promet ostaje na svojoj vezi.
Uklonite uređaj i ruta postaje neupisiva. ip -6 route add default via fe80::1 table 200 ne može razriješiti gateway, a iproute2 je odbija s Error: Nexthop has invalid gateway. Dodajte dev uplink0 i naredba uspijeva, jer uređaj je ono što prikvači sljedeći skok za jednog od ta dva susjeda. Ono što vam uređaj ne može reći jest je li uplink0 prava veza za ovu tablicu, a ruta kopirana s drugog hosta donosi imena sučelja tog hosta, i odatle dolaze prave pogreške.
Uvjet prvi: jedna veza ili dvije u tablici
Počnite s tim čemu služi drugi uzlazni link. Ako oba linka nose isti promet i jedan je pričuva, alternativna tablica treba držati oba gatewaya s različitim metrikama: ista odredišta, jedan preferirani put, jedan očigledan drugi izbor. Ako uzlazni linkovi postoje zato što različit promet mora izaći kroz različite pružatelje, ili zato što je to split tunel u kojem dio prometa zaobilazi VPN, a ostatak ostaje unutra, dvije veze uopće ne pripadaju u jednu tablicu. Pripadaju u dvije tablice koje bira pravilo, a pravilo bira tablicu, ne tunel: promet koji zaobilazi označava se prije usmjeravanja, i ta oznaka ga šalje u drugu tablicu.
U tom drugom slučaju pravilo odlučuje kada se tablica pita, a ruta odlučuje kamo paket ide nakon toga:
ip -6 rule add fwmark 0x2 table 201
ip -6 route add default via fe80::1 dev uplink1 metric 100 table 201
ip -6 route add 2001:db8:100::/48 dev uplink1 metric 100 table 201
ip -6 route show table 201Nijedan objekt ne zamjenjuje drugi, a tablica koja drži samo zadanu rutu još uvijek može ne razriješiti svoj gateway. Ako se dodavanje odbije, ili je ruta prisutna ali neupotrebljiva, stavite povezani prefiks tog sučelja u istu tablicu ili označite skok onlink kada se taj prefiks usmjerava drugdje. U bloku iznad 2001:db8:100::/48 zamjenjuje upravo taj povezani prefiks na uplink1, a ne proizvoljno odredište. Pravilo fwmark troši samo oznaku koju mora postaviti nešto drugo, iz pravila nftables ili iptables na putu prosljeđivanja ili iz SO_MARK na soketu, pa blok kopiran bez izvora oznake ne odgovara ničemu.
Uvjet drugi: metrike ne otkrivaju mrtvog pružatelja
Metrika je preferencija među rutama koje postoje, a ne zdravstvena provjera. Kada veza padne, kernel uklanja rute na tom uređaju i druga zadana ruta preuzima. Kada kabel ostane gore, a pružatelj iza njega umre, u tablici se ništa ne mijenja: preferirana ruta je instalirana, susjed je dostupan na sloju 2, a paketi izlaze u crnu rupu. Ako je ta razlika važna za vaše postavljanje, failover mora doći od nečega što provjerava put i uklanja rutu, bilo da je to usmjerivački daemon ili mali skript koji briše i ponovno instalira unos.
Provjerite izbor nakon što je tablica izgrađena, i to onako kako će ga kernel vidjeti. ip -6 route get 2001:db8:100::1 ispisuje rutu koja bi se koristila, uključujući uređaj i odabranu izvornu adresu, i poštuje pravila politike. Izvorna adresa koja pripada pogrešnom uzlaznom linku uobičajen je znak da je pravilo odgovaralo ranije nego što ste očekivali.
Uvjet treći: odlučite ko posjeduje trajnost
Ruta dodana s ip -6 route add preživljava do restarta ili dok je nešto ne ispere. Zadana ruta naučena iz oglasa usmjerivača nosi trajanje i usmjerivač je može povući, dok ručno dodana zadana ruta nikada sama ne istječe. Miješanje dvaju u jednoj tablici način je na koji zastarjela trajna ruta počne nadjačavati svježe oglašenu, dugo nakon što uzlazni link koji je opisivala prestane postojati.
Odaberite jednog vlasnika po tablici. Ako mrežni upravitelj ili usmjerivački daemon već upravlja sučeljem, opišite rutu politike tamo i ostavite kernel na miru. Ako to skriptirate, učinite skript idempotentnim i napišite uklanjanje u isto vrijeme, jer će vam trebati tijekom prve loše promjene:
ip -6 route flush table 201
ip -6 rule del fwmark 0x2 table 201Na usmjerivaču koji prosljeđuje za druge hostove provjerite net.ipv6.conf.all.forwarding prije nego okrivite tablicu. S isključenim prosljeđivanjem paketi upućeni drugoj mreži se odbacuju, koliko god tablica 201 bila ispravna.
Zabilježite dizajn kako bi ga sljedeća osoba mogla revidirati
Inventar koji čuva samo fe80::1 odbacuje polja koja su važna. Zabilježite odredište, sljedeći skok, uređaj, tablicu i metriku zajedno, plus odakle svaka ruta dolazi—oglašena, generirana od upravitelja ili statična. Kada netko kasnije pita nosi li drugi uzlazni link doista promet, taj zapis odgovara na pitanje bez nagađanja.
Prije nego tablicu proglasite gotovom, potvrdite susjeda s ip -6 neigh show dev uplink0, ponovno pročitajte ip -6 rule show zbog nezgoda s redoslijedom i testirajte prometom koji odgovara pravilu umjesto pingom koji uzima zadanu rutu. Zatim namjerno isključite jedan uzlazni link i promatrajte na koju se rutu kernel vraća; odgovor bi trebao odgovarati onome što ste zapisali.