VPN клиентүүдийн урсгалыг дамжуулахын тулд Debian гарц дээр net.ipv6.conf.all.forwarding=1 тавьсан бөгөөд хагас цагийн дараа машинд IPv6-ийн өгөгдмөл зам огт үлдээгүй. Дээд маршрутлагч ажиллаж байсан, link-local хөрш нь хариу үйлдэл хийсэн хэвээр байсан бөгөөд uplink нь өөрийн глобал хаягийг хадгалсан хэвээр байв. Зогссон зүйл нь цөмийн тэр интерфэйс дээр router advertisements хүлээн авахыг үргэлжлүүлэх хүсэл байв. Би sysctl бичих үед зам алга болоогүй; RA-аас сурсан өгөгдмөл замын хугацаа дуусахад алга болсон бөгөөд үүнийг юу ч сэргээгээгүй.

Эхлээд харахад эвдэрсэн зүйл байгаагүй. Дамжуулалт ажиллаж, хуучин зам кэшт байх хугацаанд клиентүүд гарч байсан бөгөөд гэмтэл нь түүнийг үүсгэсэн өөрчлөлтөөс хожуу ирсэн. Яг энэ саатал нь үүнийг дээд тал эсвэл хэзээ ч оролцоогүй firewall дүрэмд хамааруулах шалтгаан болдог.

Ямар ч sysctl-д хүрэхээс өмнө маршрутын хүснэгтийг уншина уу

ip -6 route show default-ээр эхэлж, зөвхөн гарц биш шинж чанаруудыг уншина уу. RA-аас сурсан өгөгдмөл зам нь proto ra гэж тэмдэглэгдсэн, давуу тал агуулж, expires-ийн тоолуурыг көрсөнө. Гараар нэмсэн замд энэ хоёр байхгүй бөгөөд энэ ялгаа нь зам аль механизмд хамаарахыг хэлж өгнө.

$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref medium

Дараа нь хаягийг хараарай: ip -6 addr show dev eth0. Цагаар хэмжсэн давуу болон хүчинтэй хугацаатай глобал хаяг нь маршрутлагчийн хугацаа минутаар хэмжигддэг өгөгдмөл замаас илүү удаан амьдарна. Хаяг байгаа ч өгөгдмөл зам байхгүй бол энэ нь зарлалын асуудлын гарын үсэг юм. Хаяг ч байхгүй бол эхлээд холбоос, префиксийн мэдээлэл эсвэл давхардсан хаяг илрүүлэлтийг шалгах хэрэгтэй.

Яагаад дамжуулалт RA боловсруулалтыг унтраадаг вэ

RA гэдэг нь 255 хопын хязгаартай link-local эх сурвалжаас илгээсэн 134 төрлийн ICMPv6 пакет юм. Цөм үүнийг ашиглахын өмнө интерфэйсийн accept_ra утгыг шалгана. Өгөгдмөл утга нь 1 бөгөөд 1 нь тийм гэсэн үг биш. Энэ нь: энэ хост дамжуулаагүй л бол хүлээн ав гэсэн үг. forwarding=1 тавьбал энэ нөхцөл биелэхгүй тул зарлал доторх аливаа префикс эсвэл өгөгдмөл маршрутлагчийг авч үзэхээс өмнө хаягдана.

Гурван утга байдаг бөгөөд дамжуулалтыг зөвхөн гурав дахь нь давдаг:

accept_raforwarding=0forwarding=1
0ignoredignored
1 (default)acceptedignored
2acceptedaccepted

Өөр хоёр туг юу үнэхээр суулгахыг шийддэг. accept_ra_defrtr нь зарлал дахь өгөгдмөл маршрутлагч зам болох эсэхийг удирдана, accept_ra_pinfo нь префиксийн мэдээлэл хаягийн тохиргоонд ашиглагдах эсэхийг удирдана. accept_ra_defrtr-ийг унтраах нь дамжуулж буй хост дээр өгөгдмөл зам сурахгүйгээр SLAAC хаягуудыг хадгалах ердийн арга юм. Энэ нь accept_ra-оос өөр хөшүүрэг бөгөөд хаяг хэрэгтэй ч зам хэрэггүй үед түүнд хандана. Цөмийн IP sysctl-ийн лавлагаа бүгдийг нь жагсаасан.

Үүнийг гурван командаар баталгаажуулна уу

Эхлээд ачаалагдсан гэж бодож буй файлын оронд амьд утгуудыг уншина уу:

sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
       net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtr

Хоёрдугаарт, зарлалууд ирсээр байгааг нотлоорой. ICMPv6-ийн төрлийн байтаар шүүх хангалттай бөгөөд хөршийн илрүүлгийн урсгалын ханыг уншихаас чөлөөлнө:

tcpdump -ni eth0 'icmp6 and ip6[40] == 134'

Хэдэн минутын дотор юу ч гарч ирэхгүй бол accept_ra таны асуудал биш. Дээд тал зарлахаа больсон, зам дээр ямар нэг зүйл ICMPv6 шүүж байна, эсвэл тэр интерфэйс үнэхээр таны бодож байгаа сегмент дээр биш. Гуравдугаарт, зарлалыг өөрөө хүсэж, талбаруудыг нь уншина уу:

rdisc6 eth0

rdisc6 нь Debian болон Ubuntu дээр ndisc6 багцад ирдэг. Гаралтаас маршрутлагчийн хугацаа болон давуу талыг өөр щ юу ч өөрчлөхөөс өмнө хараарай. Маршрутлагчийн хугацаа 0 байгаа зарлал нь өгөгдмөл маршрутлагчийг устгах тушаал бөгөөд ямар ч accept_ra утга үүнийг ашиглах боломжтой зам болгохгүй. Ингэснээр гүүрэн горимд байгаа дээд CPE-г барьж чадна, тэр нь префикс тараадаг ч өөрийгөө маршрутлагч болгон хэзээ ч санал болгодоггүй.

Uplink-ийг цор ганц зөвшөөрөх интерфэйс болгоорой

Хэрэв дээд тал өгөгдмөл маршрутлагч байх ёстой бол дамжуулалтыг үл харгалзан зарлалыг тэнд хүлээн авч, өөр газар биш:

# /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 = 1

Хязгаарлалт нь чухал, учир нь Linux дээр IPv6 дамжуулалт нь нэг глобал унтраалга бөгөөд холбоос бүрт нэг биш. net.ipv6.conf.wg0.forwarding дотор 1 бичээд дараа нь net.ipv6.conf.all.forwarding-ыг уншина уу: глобал утга эргэж, интерфэйс бүр дамжуулж эхэлнэ. Та туннель дээр маршрутлагч, LAN дээр энгийн хост байж чадахгүй. Таны хязгаарлаж болох зүйл бол хүлээн авалт юм. accept_ra=2-ыг uplink дээр байлгаж, туннель болон LAN интерфэйсүүдийг 1 эсвэл 0 дээр үлдээгээрэй, ингэснээр туннелиар ирсэн төөрсөн зарлал түүн рүү чиглэсэн өгөгдмөл зам суулгаж чадахгүй.

Түр зуурын sysctl -w дараагийн ачаалалтыг давахгүй бөгөөд systemd-networkd болон NetworkManager хоёулаа эдгээр утгыг өөрийн тохиргооноос бичдэг. networkd дээр uplink-ийн .network файлд IPv6Forwarding=yes болон IPv6AcceptRA=yes-ыг тавина; networkd нь IPv6Forwarding-ийг цөм дэх ижил шалтгаанаар глобалаар тодорхойлдог. NetworkManager-ийн хувьд uplink дээрх ipv6.method=auto нь accept_ra утгыг удирддаг тул nmcli connection up-ийн дараа sysctl-ийг дахин уншиж, эхний шалгалтад найдаж болохгүй.

Статик хувилбар, ip -6 route add default via fe80::1 dev eth0, үнэхээр ажилладаг бөгөөд дээд маршрутлагч тогтвортой link-local хаягтай үед боломжийн хариулт юм. Юу алдаж байгаагаа тодорхой мэдэж байгаарай. Статик өгөгдмөл зам хэзээ ч шинэчлэгддэггүй, хэзээ ч буцаагддаггүй тул дээд талыг сольсны дараа ч үхсэн хөрш рүү заасаар байна. RA-ийн зам аюулгүйгээр бүтэлгүйтдэг; статик нь чимээгүйхэн бүтэлгүйтдэг.

Гарцын өөрийнх нь биш, дамжуулсан пакетыг шалгаарай

Гарцын өөрийн ping нь ямар ч клиент ашиглаж чадахгүй зам дээр амжилттай болж болох бөгөөд гарц эх сурвалж учраас ч амжилттай болж болно. Холбогдсон клиентээс шалгаад дараа нь гарцаас тэр клиентийн хаягийн талаар юу хийхийг асуугаарай:

# 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::2

Дараа нь нэг маршрутлагчийн хугацаа хүлээгээд дахин хараарай. Таны хүсэж буй тогтвортой байдал нь proto ra гэж тэмдэглэгдсэн өгөгдмөл зам бөгөөд түүний expires утга байнга шинэчлэгддэг, нэмээд all.forwarding=1. Хэрэв expires зөвхөн буурч байвал зарлалууд хаа нэгтээ хасагдаж байгаа хэрэг бөгөөд ердийн буруутан нь ачаалалтын үеийн sysctl аль хэдийн ажилласны дараа accept_ra-ыг дарж бичдэг сүлжээний менежер юм.

Үүнийг хаахаас өмнө дөрвөн зүйлийг баталгаажуулаарай: өгөгдмөл зам нь proto ra бөгөөд шинэчлэгдэж байна, accept_ra=2 зөвхөн uplink-д хамаарна, дамжуулалт дахин ачаалсны дараа ч, менежерийг дахин эхлүүлсний дараа ч 1 хэвээр байна, IPv6 ping-ийг гарц биш клиент гүйцэтгэдэг. Хэрэв клиент эрүүл замтай байсан ч бүтэлгүйтсээр байвал дараагийн сэжигтэн бол буцах зам эсвэл дээд firewall, зарлал биш.

Холбоотой нийтлэлүүд