Rute default IPv6 hilang setelah mengaktifkan penerusan di Linux
Mengaktifkan penerusan IPv6 membuat kernel mengabaikan router advertisement di uplink, sehingga rute default yang dipelajari kedaluwarsa. Perbaiki dengan accept_ra.
Saya memasang net.ipv6.conf.all.forwarding=1 pada gateway Debian agar bisa meneruskan lalu lintas klien VPN, dan sekitar setengah jam kemudian mesin tidak lagi memiliki rute default IPv6. Router hulu hidup, tetangga link-local masih menjawab, dan uplink masih memegang alamat globalnya. Yang berhenti adalah kesediaan kernel untuk terus menerima router advertisement pada antarmuka itu. Rute itu tidak hilang saat saya mengetik sysctl; ia hilang ketika masa berlaku rute default hasil pembelajaran RA habis dan tidak ada yang memperbaruinya.
Sekilas tidak ada yang tampak rusak. Penerusan bekerja, klien masih lolos selama rute lama masih di cache, dan kegagalan datang lebih lambat daripada perubahan yang menyebabkannya. Jeda itulah sebabnya masalah ini disalahkan pada sisi hulu atau pada aturan firewall yang tidak pernah terlibat.
Baca tabel rute sebelum menyentuh sysctl apa pun
Mulailah dengan ip -6 route show default dan baca atributnya, bukan hanya gateway. Rute default hasil pembelajaran RA ditandai proto ra, membawa preferensi, dan menampilkan hitungan mundur expires. Rute yang Anda tambahkan sendiri tidak memiliki keduanya, dan perbedaan itu memberi tahu Anda mekanisme mana yang memiliki rute tersebut.
$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref mediumLalu lihat alamatnya: ip -6 addr show dev eth0. Alamat global dengan masa pakai pilihan dan sah yang diukur dalam jam akan bertahan lebih lama daripada rute default yang masa pakai routernya diukur dalam menit. Alamat ada tetapi rute default tidak ada adalah tanda masalah iklan. Jika alamatnya juga tidak ada, yang harus dikejar lebih dulu adalah tautan, informasi prefiks, atau deteksi alamat duplikat.
Mengapa penerusan mematikan pemrosesan RA
RA adalah paket ICMPv6 bertipe 134, dikirim dari sumber link-local dengan batas hop 255. Sebelum kernel memakainya, ia memeriksa accept_ra antarmuka. Nilai defaultnya 1, dan 1 tidak berarti ya. Artinya: terima hanya selama host ini tidak meneruskan. Setel forwarding=1 dan syarat itu gagal, jadi iklan dibuang sebelum prefiks atau router default di dalamnya dipertimbangkan.
Ada tiga nilai, dan hanya nilai ketiga yang bertahan dari penerusan:
accept_ra | forwarding=0 | forwarding=1 |
|---|---|---|
| 0 | ignored | ignored |
| 1 (default) | accepted | ignored |
| 2 | accepted | accepted |
Dua flag lain menentukan apa yang benar-benar dipasang. accept_ra_defrtr mengatur apakah router default dalam iklan menjadi rute, dan accept_ra_pinfo mengatur apakah informasi prefiks dipakai untuk konfigurasi alamat. Mematikan accept_ra_defrtr adalah cara biasa mempertahankan alamat SLAAC pada host yang meneruskan tanpa mempelajari rute default. Itu tuas yang berbeda dari accept_ra, dan itulah yang dipakai ketika Anda ingin alamat tetapi tidak ingin rute. Referensi kernel untuk IP sysctl mencantumkan ketiganya.
Konfirmasi dengan tiga perintah
Pertama, baca nilai yang sedang aktif alih-alih berkas yang Anda anggap termuat:
sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtrKedua, buktikan bahwa iklan masih datang. Menyaring berdasarkan bita tipe ICMPv6 sudah cukup, dan itu menghindari membaca dinding lalu lintas penemuan tetangga:
tcpdump -ni eth0 'icmp6 and ip6[40] == 134'Jika tidak ada yang muncul selama beberapa menit, accept_ra bukan masalah Anda. Sisi hulu berhenti mengiklankan, sesuatu di jalur menyaring ICMPv6, atau antarmuka itu memang tidak berada di segmen yang Anda kira. Ketiga, minta iklan sendiri dan baca bidang-bidangnya:
rdisc6 eth0rdisc6 tersedia dalam paket ndisc6 pada Debian dan Ubuntu. Pada keluarannya, lihat masa pakai router dan preferensi sebelum mengubah hal lain. Iklan dengan masa pakai router 0 adalah instruksi untuk menghapus router default, dan tidak ada nilai accept_ra yang mengubahnya menjadi rute yang bisa dipakai. Dengan cara ini Anda juga menangkap CPE hulu dalam mode bridge yang membagikan prefiks tetapi tidak pernah menawarkan diri sebagai router.
Jadikan uplink satu-satunya antarmuka yang permisif
Jika sisi hulu seharusnya menjadi router default, terimalah iklan di sana meskipun penerusan aktif, dan tidak di tempat lain:
# /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 = 1Pembatasan itu penting karena penerusan IPv6 di Linux adalah satu sakelar global, bukan satu per tautan. Tulis 1 ke net.ipv6.conf.wg0.forwarding lalu baca net.ipv6.conf.all.forwarding: nilai global berbalik dan setiap antarmuka mulai meneruskan. Anda tidak bisa menjadi router di terowongan dan host biasa di LAN. Yang bisa Anda batasi adalah penerimaannya. Pertahankan accept_ra=2 di uplink dan biarkan antarmuka terowongan dan LAN pada 1 atau 0, agar iklan tersesat yang datang lewat terowongan tidak bisa memasang rute default yang menunjuk ke dalamnya.
sysctl -w sementara tidak akan bertahan setelah reboot berikutnya, dan systemd-networkd maupun NetworkManager menulis nilai-nilai ini dari konfigurasi mereka sendiri. Di networkd, setel IPv6Forwarding=yes dan IPv6AcceptRA=yes di berkas .network uplink; networkd mendokumentasikan IPv6Forwarding sebagai global karena alasan kernel yang sama. Pada NetworkManager, ipv6.method=auto di uplink itulah yang mengendalikan nilai accept_ra, jadi baca ulang sysctl setelah nmcli connection up alih-alih memercayai pemeriksaan pertama.
Alternatif statis, ip -6 route add default via fe80::1 dev eth0, memang bekerja, dan itu jawaban yang wajar ketika router hulu memiliki alamat link-local yang stabil. Ketahui dengan jelas apa yang Anda lepaskan. Rute default statis tidak pernah diperbarui dan tidak pernah ditarik, jadi ia tetap menunjuk ke tetangga yang mati setelah sisi hulu diganti. Rute RA gagal dengan aman; yang statis gagal diam-diam.
Uji paket yang diteruskan, bukan paket gateway itu sendiri
Ping gateway sendiri bisa berhasil pada rute yang tidak bisa dipakai klien mana pun, dan bisa juga berhasil karena gateway adalah sumbernya. Uji dari klien yang terhubung, lalu tanyakan kepada gateway apa yang akan ia lakukan untuk alamat klien itu:
# 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::2Lalu tunggu satu masa pakai router dan lihat lagi. Keadaan stabil yang Anda inginkan adalah rute default bertanda proto ra yang nilai expires-nya terus direset, plus all.forwarding=1. Jika expires hanya menghitung mundur, iklan masih dibuang di suatu tempat, dan penyebab biasanya adalah manajer jaringan yang menulis ulang accept_ra setelah sysctl saat boot sudah dijalankan.
Sebelum menutup ini, konfirmasi empat hal: rute default adalah proto ra dan diperbarui, accept_ra=2 hanya berlaku untuk uplink, penerusan masih 1 setelah reboot dan setelah manajer dijalankan ulang, dan klien, bukan gateway, yang menyelesaikan ping IPv6. Jika klien masih gagal dengan rute yang sehat, tersangka berikutnya adalah jalur balik atau firewall hulu, bukan iklannya.