Anda mempunyai dua uplink, dan ip -6 route show mencetak hop seterusnya yang sama pada kedua-duanya: default via fe80::1 dev uplink0 dan default via fe80::1 dev uplink1. Ini bukan konflik alamat berganda, dan menyalin hop seterusnya kosong fe80::1 ke dalam jadual dasar tidak memberitahu kernel pautan mana yang anda maksudkan. Soalan sebenar lebih sempit daripada yang disyorkan oleh simptom: adakah jadual kedua memerlukan satu pautan atau kedua-duanya, dan apa yang mengekalkan laluan itu hidup selepas but semula. Tiga syarat, diperiksa mengikut urutan, menyelesaikan sebahagian besarnya.

fe80::1 yang sama ialah dua jiran berbeza

Alamat pautan setempat berlingkup kepada satu pautan sahaja, jadi fe80::1 bukan satu alamat yang dicetak dua kali; ia dua jiran yang kebetulan berkongsi akhiran. Indeks zon ialah cara hos menyatakan yang mana satu dimaksudkan, jadi fe80::1%uplink0 dan fe80::1%uplink1 ialah destinasi berbeza bagi kernel, dan akhiran itu tidak pernah bergerak ke penghala jauh. RFC 4007 menerangkan model zon di sebaliknya, dan itulah sebabnya jadual dasar mesti membawa peranti dengan setiap hop seterusnya pautan setempat.

Penjana konfigurasi VPN yang menyalin ID zon berangka daripada satu hos ke dalam templat memperlakukan konteks setempat seolah-olah ia sebahagian daripada alamat, dan fail yang ditulisnya salah pada setiap mesin yang nama atau indeks antara mukanya berbeza. Jadual dasar juga tidak menggabungkan dua pautan menjadi satu: VPN berpenghalaan menyalurkan paket antara rangkaian, tetapi ia tidak membawa identiti pautan setempat jiran Ethernet jauh merentasi terowong, jadi trafik pautan setempat kekal pada pautannya sendiri.

Buang peranti itu dan laluan menjadi tidak boleh ditulis. ip -6 route add default via fe80::1 table 200 tidak dapat menyelesaikan get laluan, dan iproute2 menolaknya dengan Error: Nexthop has invalid gateway. ralat. Tambah dev uplink0 dan arahan itu berjaya, kerana peranti itulah yang memaku hop seterusnya kepada salah satu daripada dua jiran tersebut. Apa yang peranti tidak dapat beritahu ialah sama ada uplink0 ialah pautan yang betul untuk jadual ini, dan laluan yang disalin daripada hos lain membawa nama antara muka hos itu bersama-sama, di situlah kesilapan sebenar datang.

Syarat satu: satu pautan atau dua dalam jadual

Mulakan dengan tujuan uplink kedua. Jika kedua-dua pautan membawa trafik yang sama dan satu adalah siap sedia, jadual alternatif harus memegang kedua-dua get laluan dengan metrik berbeza: destinasi yang sama, satu laluan pilihan, satu pilihan kedua yang jelas. Jika uplink itu wujud kerana trafik berbeza mesti keluar melalui pembekal berbeza, atau kerana ini terowong terpisah di mana sebahagian trafik memintas VPN manakala selebihnya kekal di dalam, kedua-dua pautan itu tidak tergolong dalam satu jadual sama sekali. Ia tergolong dalam dua jadual, dipilih oleh peraturan, dan peraturan memilih jadual, bukan terowong: trafik yang memintas ditanda sebelum ia dihalakan, dan tanda itulah yang menghantarnya ke jadual kedua.

Dalam kes kedua itu, peraturan menentukan bila jadual dirujuk, dan laluan menentukan ke mana paket pergi selepasnya:

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 201

Tiada objek menggantikan yang lain, dan jadual yang hanya memegang laluan lalai masih boleh gagal menyelesaikan get laluannya. Jika penambahan ditolak, atau laluan ada tetapi tidak boleh digunakan, letakkan awalan bersambung antara muka itu ke dalam jadual yang sama, atau tandakan hop itu onlink apabila awalan itu dihalakan di tempat lain. Dalam blok di atas, 2001:db8:100::/48 mewakili awalan bersambung itu pada uplink1, bukan destinasi sewenang-wenangnya. Peraturan fwmark hanya menggunakan tanda yang perlu ditetapkan oleh perkara lain, daripada peraturan nftables atau iptables pada laluan penghantaran atau daripada SO_MARK pada soket, jadi blok yang disalin tanpa sumber tanda tidak memadankan apa-apa.

Syarat dua: metrik tidak mengesan pembekal yang mati

Metrik ialah keutamaan antara laluan yang wujud, bukan pemeriksaan kesihatan. Apabila pembawa terputus, kernel mengalihkan laluan pada peranti itu dan laluan lalai kedua mengambil alih. Apabila kabel kekal hidup dan pembekal di belakangnya mati, tiada apa berubah dalam jadual: laluan pilihan dipasang, jiran boleh dicapai pada lapisan 2, dan paket keluar ke lubang hitam. Jika perbezaan itu penting untuk persediaan anda, pengalihan gagal mesti datang daripada sesuatu yang menyiasat laluan dan mengalihkan laluan itu, sama ada daemon penghalaan atau skrip kecil yang memadam dan memasang semula entri itu.

Sahkan pilihan selepas jadual dibina, dan sahkan dengan cara kernel akan melihatnya. ip -6 route get 2001:db8:100::1 mencetak laluan yang akan digunakan, termasuk peranti dan alamat sumber yang dipilih, dan ia mematuhi peraturan dasar. Alamat sumber milik uplink yang salah ialah tanda biasa bahawa peraturan dipadankan lebih awal daripada yang anda jangkakan.

Syarat tiga: tentukan siapa memiliki kegigihan

Laluan yang ditambah dengan ip -6 route add kekal sehingga but semula atau sehingga sesuatu menyapunya. Lalai yang dipelajari daripada iklan penghala membawa jangka hayat dan boleh ditarik balik oleh penghala, manakala lalai yang ditambah secara manual tidak pernah tamat dengan sendirinya. Mencampurkan kedua-duanya dalam satu jadual ialah cara laluan kekal yang basi akhirnya mengatasi laluan yang baru diiklankan, lama selepas uplink yang diperincikannya tidak lagi wujud.

Pilih satu pemilik bagi setiap jadual. Jika pengurus rangkaian atau daemon penghalaan sudah menguruskan antara muka, terangkan laluan dasar di sana dan biarkan kernel. Jika anda skripkannya, jadikan skrip itu idempoten dan tulis pembongkaran pada masa yang sama, kerana anda akan memerlukannya semasa perubahan buruk pertama:

ip -6 route flush table 201
ip -6 rule del fwmark 0x2 table 201

Pada penghala yang menghantar bagi hos lain, semak net.ipv6.conf.all.forwarding sebelum menyalahkan jadual. Dengan penghantaran dimatikan, paket yang dialamatkan ke rangkaian lain digugurkan tidak kira betapa betulnya jadual 201.

Rekod reka bentuk supaya orang seterusnya boleh mengauditnya

Inventori yang menyimpan hanya fe80::1 membuang medan yang penting. Rekodkan destinasi, hop seterusnya, peranti, jadual dan metrik bersama-sama, serta dari mana setiap laluan datang: diiklankan, dijana pengurus atau statik. Apabila seseorang kemudian bertanya sama ada uplink kedua benar-benar membawa trafik, rekod itu menjawab soalan tanpa tekaan.

Sebelum anda mengisytiharkan jadual selesai, sahkan jiran dengan ip -6 neigh show dev uplink0 , baca semula ip -6 rule show untuk kemalangan susunan, dan uji dengan trafik yang sepadan dengan peraturan itu dan bukan ping yang mengambil laluan lalai. Kemudian matikan satu uplink dengan sengaja dan perhatikan laluan mana yang kernel kembali; jawapannya sepatutnya sepadan dengan yang anda tulis.

Artikel berkaitan