IPv6 usmjeravanje politike kad dva uplinka dijele fe80::1
Dva uplinka mogu prikazati isti sljedeći skok fe80::1 na različitim vezama. Odaberi jednu tablicu po politici, vodi računa o životnim vijekovima i provjeri pretragom rute.
Imaš dva uplinka, 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 dvostrukih adresa, a kopiranje golog sljedećeg skoka fe80::1 u tablicu politike ne govori kernelu na koju si vezu mislio. Pravo je pitanje uže nego što simptom sugerira: treba li drugoj tablici jedna veza ili obje, i što te rute drži živima nakon ponovnog pokretanja. Tri uvjeta, provjerena po redu, rješavaju većinu.
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. Zonski indeks je način na koji host kaže na koji misli, pa fe80::1%uplink0 i fe80::1%uplink1 su različita odredišta za kernel, a taj sufiks nikada ne putuje do udaljenog usmjerivača. RFC 4007 opisuje zonski model koji stoji za tim, i zato tablica politike mora nositi uređaj sa svakim link-local sljedećim skokom.
Generator VPN konfiguracije koji kopira numerički zonski ID s jednog hosta u predložak tretira lokalni kontekst kao da je dio adrese, a datoteka koju piše pogrešna je na svakom stroju čija se imena ili indeksi sučelja razlikuju. Niti tablica politike 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.
Ukloni uređaj i ruta postaje nezapisiva. ip -6 route add default via fe80::1 table 200 ne može razriješiti pristupnik, a iproute2 ga odbija s Error: Nexthop has invalid gateway. Dodaj dev uplink0 i naredba uspijeva, jer uređaj je ono što prikvačuje sljedeći skok za jednog od ta dva susjeda. Ono što ti 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 jedan: jedna veza ili dvije u tablici
Počni od toga čemu služi drugi uplink. Ako obje veze nose isti promet i jedna je pričuva, alternativna tablica treba držati oba pristupnika s različitim metrikama: ista odredišta, jedan preferirani put, jedan očiti drugi izbor. Ako uplinkovi postoje zato što različit promet mora izaći kroz različite pružatelje, ili zato što je ovo split tunel u kojem dio prometa zaobilazi VPN dok ostatak ostaje unutra, dvije veze uopće ne pripadaju jednoj tablici. Pripadaju dvjema tablicama, odabranima pravilom, a pravilo odabire tablicu, ne tunel: promet koji zaobilazi označava se prije usmjeravanja, i oznaka je ono što ga šalje u drugu tablicu.
U tom drugom slučaju pravilo odlučuje kada se tablica konzultira, a ruta odlučuje kamo paket ide kad se to dogodi:
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 od objekata ne zamjenjuje drugi, a tablica koja drži samo zadanu rutu još uvijek može ne razriješiti svoj pristupnik. Ako se add odbije, ili ruta postoji ali je neupotrebljiva, stavi povezani prefiks tog sučelja u istu tablicu, ili označi skok kao onlink kada se taj prefiks usmjerava drugdje. U gornjem bloku, 2001:db8:100::/48 predstavlja taj povezani prefiks na uplink1, ne proizvoljno odredište. fwmark pravilo troši samo oznaku koju mora postaviti nešto drugo, iz nftables ili iptables pravila na putu prosljeđivanja ili iz SO_MARK na utičnici, pa blok kopiran bez izvora oznake ne odgovara ničemu.
Uvjet dva: metrike ne otkrivaju mrtvog pružatelja
Metrika je preferencija među rutama koje postoje, ne provjera zdravlja. Kad operator padne, kernel uklanja rute na tom uređaju i druga zadana ruta preuzima. Kad 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 odlaze u crnu rupu. Ako ta razlika važi za tvoj postav, failover mora doći od nečega što sondira put i uklanja rutu, bilo da je to usmjerivački daemon ili mali skript koji briše i ponovno instalira unos.
Provjeri odabir nakon što je tablica izgrađena, i provjeri ga 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 uplinku uobičajen je znak da je pravilo odgovaralo ranije nego što si očekivao.
Uvjet tri: odluči kome pripada trajnost
Ruta dodana s ip -6 route add preživljava do ponovnog pokretanja ili dok je nešto ne ispere. Zadana ruta naučena iz oglasa usmjerivača nosi životni vijek i usmjerivač je može povući, dok ručno dodana zadana ruta nikada sama ne istječe. Miješanje to dvoje u jednoj tablici način je na koji zastarjela trajna ruta završi ispred svježe oglašene, davno nakon što je uplink koji je opisivala prestao postojati.
Odaberi jednog vlasnika po tablici. Ako mrežni upravitelj ili usmjerivački daemon već upravlja sučeljem, opiši rutu politike tamo i ostavi kernel na miru. Ako to skriptiraš, učini skript idempotentnim i napiši teardown u isto vrijeme, jer će ti 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, provjeri net.ipv6.conf.all.forwarding prije nego okriviš tablicu. S isključenim prosljeđivanjem, paketi namijenjeni drugoj mreži odbacuju se, koliko god tablica 201 bila ispravna.
Zabilježi dizajn da ga sljedeća osoba može revidirati
Inventar koji pohranjuje samo fe80::1 odbacuje polja koja su važna. Zabilježi odredište, sljedeći skok, uređaj, tablicu i metriku zajedno, plus odakle je svaka ruta došla, je li oglašena, generirana od upravitelja ili statična. Kad netko kasnije pita nosi li drugi uplink stvarno promet, taj zapis odgovara bez nagađanja.
Prije nego proglasiš tablicu gotovom, potvrdi susjeda s ip -6 neigh show dev uplink0, ponovno pročitaj ip -6 rule show zbog nezgoda s redoslijedom, i testiraj prometom koji odgovara pravilu umjesto pingom koji uzima zadanu rutu. Zatim namjerno spusti jedan uplink i promatraj na koju se rutu kernel vraća; odgovor bi trebao odgovarati onome što si zapisao.