Linux'da yo'naltirish yoqilgandan so'ng IPv6 standart marshruti yo'qoldi
IPv6 yo'naltirishni yoqsangiz, yadro uplink'dagi router advertisements'larni e'tiborsiz qoldiradi va o'rganilgan standart marshrut tugaydi. Buni accept_ra bilan tuzating.
VPN mijozlari trafigini o'tkazishi uchun Debian shlyuziga net.ipv6.conf.all.forwarding=1 qo'ydim va taxminan yarim soatdan keyin mashinada IPv6 standart marshruti qolmadi. Yuqori marshrutizator ishlayotgan edi, link-local qo'shni hali javob berardi va uplink o'z global manzilini saqlab turardi. To'xtagan narsa yadroning o'sha interfeysda router advertisements qabul qilishni davom ettirish istagi edi. Marshrut sysctl kiritilgan paytda yo'qolmadi; u RA'dan o'rganilgan standart marshrutning muddati tugaganda yo'qoldi va uni hech narsa yangilamadi.
Birinchi qarashda hech narsa buzilganday ko'rinmadi. Yo'naltirish ishladi, eski marshrut keshda bo'lganicha mijozlar o'tib turdi, nosozlik esa uni keltirib chiqargan o'zgarishdan keyin keldi. Aynan shu kechikish sabab bu yuqori tomonga yoki hech qachon aralashmagan firewall qoidasiga to'nkaladi.
Har qanday sysctl'ga tegishdan oldin marshrut jadvalini o'qing
ip -6 route show default bilan boshlang va nafaqat shlyuzni, balki atributlarni o'qing. RA'dan o'rganilgan standart marshrut proto ra deb belgilangan, afzallik olib yuradi va expires ortga hisobini ko'rsatadi. Qo'lda qo'shilgan marshrutda ikkalasi ham yo'q va bu farq marshrut qaysi mexanizmga tegishli ekanini aytadi.
$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref mediumSo'ngra manzilga qarang: ip -6 addr show dev eth0. Soat bilan o'lchangan afzal va amaldagi umrga ega global manzil, marshrutizator umri daqiqalar bilan o'lchanadigan standart marshrutdan uzoqroq yashaydi. Manzil bor, standart marshrut yo'q, bu e'lon muammosining belgisidir. Manzil ham bo'lmasa, birinchi navbatda bog'lanish, prefiks haqidagi ma'lumot yoki takroriy manzillarni aniqlash bilan shug'ullanish kerak.
Nega yo'naltirish RA ishlovini o'chiradi
RA bu 134 turdagi ICMPv6 paketi bo'lib, 255 sakrash chegarasi bilan link-local manbadan yuboriladi. Yadro undan foydalanishdan oldin interfeysning accept_ra qiymatini tekshiradi. Standart qiymat 1 va 1 «ha» degani emas. U shuni bildiradi: faqat bu xost yo'naltirmaguncha qabul qil. forwarding=1 qo'ysangiz, bu shart bajarilmaydi, shuning uchun e'lon ichidagi har qanday prefiks yoki standart marshrutizator ko'rib chiqilishidan oldin tashlab yuboriladi.
Uchta qiymat bor va yo'naltirishdan faqat uchinchisi omon qoladi:
accept_ra | forwarding=0 | forwarding=1 |
|---|---|---|
| 0 | ignored | ignored |
| 1 (default) | accepted | ignored |
| 2 | accepted | accepted |
Yana ikkita bayroq nima o'rnatilishini hal qiladi. accept_ra_defrtr e'londagi standart marshrutizatorning marshrutga aylanishini boshqaradi, accept_ra_pinfo esa prefiks ma'lumotining manzil konfiguratsiyasida ishlatilishini boshqaradi. accept_ra_defrtr ni o'chirish yo'naltiruvchi xostda standart marshrut o'rganmasdan SLAAC manzillarini saqlashning odatiy usuli. Bu accept_ra dan boshqa richag va manzil kerak, marshrut kerak bo'lmaganda unga murojaat qilasiz. Yadroning IP sysctl ma'lumotnomasi uchtasini ham sanaydi.
Buni uchta buyruq bilan tasdiqlang
Avval yuklangan deb o'ylagan fayl o'rniga jonli qiymatlarni o'qing:
sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtrIkkinchidan, e'lonlar hali ham kelishini isbotlang. ICMPv6 tur bayti bo'yicha filtrlash yetarli va qo'shnilarni aniqlash trafigining devorini o'qishdan xalos qiladi:
tcpdump -ni eth0 'icmp6 and ip6[40] == 134'Agar bir necha daqiqa ichida hech narsa ko'rinmasa, accept_ra sizning muammoingiz emas. Yuqori tomon e'lon qilishni to'xtatdi, yo'lda nimadir ICMPv6 ni filtrlaydi yoki bu interfeys haqiqatan siz o'ylagan segmentda emas. Uchinchidan, e'lonni o'zingiz so'rang va uning maydonlarini o'qing:
rdisc6 eth0rdisc6 Debian va Ubuntu'da ndisc6 paketida keladi. Chiqishda boshqa narsani o'zgartirishdan oldin marshrutizator umriga va afzallikka qarang. Marshrutizator umri 0 bo'lgan e'lon standart marshrutizatorni olib tashlash buyrug'i va hech qanday accept_ra qiymati uni foydali marshrutga aylantirmaydi. Shu tarzda ko'prik rejimidagi yuqori CPE ni ham ushlaysiz, u prefikslarni tarqatadi, lekin o'zini hech qachon marshrutizator sifatida taklif qilmaydi.
Uplink'ni yagona ruxsat beruvchi interfeys qiling
Agar yuqori tomon standart marshrutizator bo'lishi kerak bo'lsa, yo'naltirishga qaramay e'lonlarni o'sha yerda qabul qiling, boshqa joyda emas:
# /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 = 1Cheklash muhim, chunki Linux'da IPv6 yo'naltirish bitta global kalit, har bir bog'lanish uchun bittadan emas. net.ipv6.conf.wg0.forwarding ichiga 1 yozing va keyin net.ipv6.conf.all.forwarding ni o'qing: global qiymat ag'dariladi va har bir interfeys yo'naltira boshlaydi. Siz tunnelda marshrutizator, LAN'da esa oddiy xost bo'la olmaysiz. Cheklashingiz mumkin bo'lgan narsa — qabul qilish. accept_ra=2 ni uplink'da saqlang, tunnel va LAN interfeyslarini 1 yoki 0 da qoldiring, shunda tunnel orqali kelgan adashgan e'lon unga qaragan standart marshrutni o'rnata olmaydi.
Vaqtinchalik sysctl -w keyingi yuklashdan omon qolmaydi va ham systemd-networkd, ham NetworkManager bu qiymatlarni o'z konfiguratsiyasidan yozadi. networkd'da uplink'ning .network faylida IPv6Forwarding=yes va IPv6AcceptRA=yes ni o'rnating; networkd IPv6Forwarding ni yadrodagi xuddi shu sabab bilan global deb hujjatlashtiradi. NetworkManager'da uplink'dagi ipv6.method=auto accept_ra qiymatini boshqaradi, shuning uchun nmcli connection up dan keyin sysctl ni qayta o'qing, birinchi tekshiruvga ishonmang.
Statik muqobil, ip -6 route add default via fe80::1 dev eth0, haqiqatan ishlaydi va yuqori marshrutizator barqaror link-local manzilga ega bo'lganda oqilona javob. Nimadan voz kechayotganingizni aniq biling. Statik standart marshrut hech qachon yangilanmaydi va hech qachon qaytarib olinmaydi, shuning uchun yuqori tomon almashtirilgandan keyin ham o'lik qo'shniga ishora qiladi. RA marshruti xavfsiz tarzda ishdan chiqadi; statik esa jimgina ishdan chiqadi.
Shlyuzning o'z paketini emas, yo'naltirilgan paketni sinang
Shlyuzning o'z pinglari hech bir mijoz foydalana olmaydigan marshrut bo'ylab muvaffaqiyatli o'tishi mumkin va shlyuz manba bo'lgani uchun ham muvaffaqiyatli bo'lishi mumkin. Ulangan mijozdan sinang, so'ngra shlyuzdan o'sha mijoz manzili uchun nima qilishini so'rang:
# 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::2Keyin bitta marshrutizator umrini kuting va yana qarang. Siz xohlagan barqaror holat — proto ra deb belgilangan standart marshrut, uning expires qiymati doimiy yangilanadi, ustiga all.forwarding=1. Agar expires faqat ortga hisoblasa, e'lonlar hali ham qayerdadir tashlanmoqda va odatiy aybdor — yuklash paytidagi sysctl allaqachon bajarilgandan keyin accept_ra ni qayta yozadigan tarmoq menejeri.
Buni yopishdan oldin to'rt narsani tasdiqlang: standart marshrut proto ra va yangilanmoqda, accept_ra=2 faqat uplink'ga tegishli, yo'naltirish qayta yuklashdan keyin ham, menejer qayta ishga tushirilgandan keyin ham 1, va IPv6 pingni shlyuz emas, mijoz yakunlaydi. Agar mijoz sog'lom marshrut bilan ham muvaffaqiyatsiz bo'lsa, keyingi gumondor — qaytish yo'li yoki yuqori firewall, e'lon emas.