VPN дээгүүр IPv6 link-local ажиллахгүй байна: fe80 яагаад холбоос дээр зогсдог
fe80:: хаяг нь зөвхөн нэг холбоос дээр утгатай. Маршрутлагдсан VPN яагаад түүнийг дамжуулж чадахгүй, алдаа хэрхэн харагдах, оронд нь аль хаягийг ашиглахыг үзээрэй.
Та туннелийг өргөж, туннелийг эх интерфэйс болгон fe80::1 рүү ping хийхэд юу ч буцаж ирэхгүй. Энэ нь таны мартсан firewall дүрэм биш. Link-local хаяг нь зөвхөн түүний үүссэн нэг холбоос дээр утгатай бөгөөд маршрутлагдсан VPN нь тэр холбоос биш. Алсын чиглүүлэгчийн fe80::1 нь алсын LAN сегмент дээр байдаг; та өөр сегмент дээр нэг үсрэлтийн зайд байгаа бөгөөд IPv6-д чиглүүлэгч link-local пакетыг дамжуулах механизм огт байхгүй.
fe80 угтвар нь хүрээг дүрсэлдэг, муж биш
Link-local unicast нь fe80::/10 бөгөөд тодорхойлогч шинж нь тоо биш, хүрээ юм. Хаяг нь зөвхөн нэг холбоос дээр хүчинтэй бөгөөд интерфэйс бүр өөрийн танигчаас нэгийг үүсгэдэг тул хоёр хамааралгүй сүлжээн дэх хоёр хамааралгүй машин ямар ч зөрчилгүйгээр хоёулаа fe80::1-д хариулж чадна. Угтвар нь үндсэндээ «ямар нэг холбоос дээр» гэж хэлдэг; холбоос нь өөрөө контекстээс ирдэг.
Хост дээр тэр контекст нь хувийн тэмдгийн дараа нэмэх бүс буюу scope ID юм: Linux дээр fe80::1%eth0, Windows болон интерфэйсийн индекс харуулдаг хэрэгслүүд дээр fe80::1%3 эсвэл fe80::1%12. Цөм нь хаягийг интерфэйсийн индекстэй хамт шийдэж, дараа нь илгээдэг. Бүсийг хасаж орхивол очих газар хоёрдмол утгатай болж, стек сегмент сонгох аргагүй болно.
Маршрутлагдсан туннель яагаад түүнийг хүргэж чадахгүй вэ
Маршрутлагдсан VPN нь өөрийн хаягуудыг агуулсан цэгээс цэгт интерфэйс бөгөөд ихэвчлэн туннелийн доторх unique-local эсвэл хувийн IPv6 орон зайн /64. Алсын LAN нь тусдаа холбоос бөгөөд туннелийн төгсгөл таны өмнөөс маршрутлаж, дамжуулж түүнд хүрдэг. Эдгээр нь хоёр өөр сегмент тул нэгнийх нь хаяг нөгөөд хүчинтэй очих газар болохгүй.
Дамжуулах дүрэм нь таны клиентийн онцлог биш, стандартад тодорхой бичигдсэн: чиглүүлэгчид link-local эх эсвэл очих газартай пакетыг дамжуулдаггүй. Тиймээс маршрутын хүснэгт зөв харагдаж байсан ч пакет үхдэг. fe80::/64-д туннель рүү чиглэсэн маршрут нэмбэл стандартад нийцсэн стек үүнийг няцаах эсвэл хүлээн аваад тохирох бүх пакетыг хаяна: очих газрын хүрээ «зөвхөн энэ холбоос» гэж хэлдэг бөгөөд гарч буй интерфэйс нь тэр холбоос биш.
Хөршийн илрүүлэлт ижил хил хязгаарыг бэхжүүлдэг. Хостнууд link-local дараагийн үсрэлтүүдийг 255 үсрэлтийн хязгаартай холбоосын хүрээний multicast руу илгээсэн хөршийн хүсэлтээр шийддэг тул чиглүүлэгчид дамжуулсан бүхнийг няцааж чадна. Үүнийг туннелиар дамжуулан ажиллуулах нь алсын сегментийн илрүүлэлтийг проксилох гэсэн үг бөгөөд энэ нь өөр малгай өмссөн Layer 2 гүүр юм.
Хоёр дахь, илүү нам гүм алдаа байдаг бөгөөд энэ нь маршрутыг хүчээр тулгах гэж оролддог хүмүүсийг барьдаг: бүс. Та локал дээр ямар ч бүс бичсэн, тэр нь туннелийн интерфэйсийг нэрлэдэг бол таны хүссэн хаяг нь алсын LAN интерфэйстэй холбогдсон байдаг. Хоёр нь хэзээ ч таарахгүй тул пакетыг алсын төгсгөлд зөв интерфэйс рүү чиглүүлж чадахгүй.
Практикт алдаа хэрхэн харагдах вэ
Хүрээний алдааны хэрэгслийн гаралт нь маршрутлалт эсвэл firewall-ийн алдаа мэт уншигддаг бөгөөд хүмүүс буруу давхаргад хагас өдөр өнгөрөөдөг шалтгаан нь яг энэ юм.
| What you run | What you see | What it means |
|---|---|---|
| ping fe80::1 with no zone | Invalid argument on Linux, or a transmit failure on Windows | The stack cannot pick an interface for an ambiguous destination |
| ping -6 -I tun0 fe80::1 | Destination unreachable, or a silent timeout | The address is not on the tunnel link, so there is nothing on-link to answer |
| ssh user@fe80::1 after the tunnel is up | Hangs, then no route to host | The SYN never left the machine in a deliverable form; the server logs nothing |
| ip -6 neigh show dev tun0 | Empty table | No neighbor entry can exist for a link-local host that is not on this link |
| fe80::/64 inside AllowedIPs or route-ipv6 | Config accepted, traffic still dropped | The tunnel carried the packet; the receiving stack refused to forward it |
Гурав дахь мөр хамгийн их цагийг үрэхдэг, учир нь гаралтгүй ssh клиент сонсож буй үйлчилгээний асуудал мэт харагддаг. Дотогш орох ямар нэг арга байвал алсын талыг шалгаж, sshd бүх хаягт эсвэл зөвхөн нэгэнд холбогдсон эсэхийг баталгаажуулаарай.
Маршрутлахад зориулагдсан хаягийг ашиглана уу
Туннелиар хүрэх шаардлагатай бүхэнд үйлчилгээнд яг энэ зорилгоор өгсөн хаягийг ашиглана уу: глобал unicast хаяг, эсвэл fc00::/7-оос unique-local хаяг, яг энэ дотоод тохиолдолд зориулсан муж. Сонсогч үүнийг үнэхээр холбож байгаа эсэхийг баталгаажуулж, буцах зам болон хостны аливаа firewall дүрмийг шалгаарай.
Таамаглахын оронд алсын хост руу хар. ip -6 addr show байгаа хаягуудыг жагсааж, ss -6 -ltn демон юунд сонсож байгааг жагсаана. Зөвхөн fe80:: хаягт холбогдсон үйлчилгээ нь зөвхөн өөрийн сегментээс хүрэх боломжтой бөгөөд энэ нь ихэвчлэн хэн ч зориуд сонгоогүй өгөгдмөл утга бөгөөд администраторын зөвшөөрлөөр өөрчилж болно.
Үйлчилгээг үнэхээр дахин холбож чадахгүй бол гүүрийг сүлжээний давхаргын оронд програмын давхарга руу дээшлүүл. Алсын хост дээр маршрутлагдах хаяг дээр сонсож, link-local руу холбогддог реле нь ямар ч сегментийг өргөтгөхгүйгээр асуудлыг шийднэ:
socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80Энд бүс нь зөв талд, тухайн холбоос дээр үнэхээр eth0-той хост дээр байна. Таны клиент fd00:1:2::10-той ярьж, энэ нь хэвийн маршрутлагдаж, реле нь link-local үсрэлтийг локалаар гүйцэтгэдэг. Ижил арга нь төхөөрөмжийн вэб UI эсвэл зөвхөн link-local хаяг зарладаг хуучин BMC-д ч ажилладаг.
Гүүрлэлт үнэхээр хариулт болох үед, юуг шалгах вэ
Зарим байршуулалтад үнэхээр нэг хуваалцсан сегмент хэрэгтэй: зөвхөн link-local илрүүлэлтээр ярьдаг төхөөрөмж, multicast-аас хамааралтай төхөөрөмж, хавтгай LAN-ыг дахин бүтээдэг лаборатори. Энэ нь Layer 2-ын асуудал бөгөөд Layer 2-ын хариулт шаарддаг, жишээлбэл алсын интерфэйс рүү гүүрлэсэн tap төхөөрөмж эсвэл тодорхой гүүрлэсэн горимтой клиент бүтээгдэхүүн. Энэ нь туннелийг гатлах broadcast болон multicast урсгал, мөн төгсгөлөөс төгсгөл хүртэл ажиллах ёстой хөршийн илрүүлэлтийг танд зарцуулна.
Үүнийг маршрутлагдсан профайлд fe80::/64 нэмэх замаар ойртуулж болохгүй. Энэ нь хамгийн муу төлөвийг үүсгэдэг: тохиргоо дууссан мэт харагдаж, маршрутын хүснэгт бичлэг харуулж, гэхдээ пакет бүр хоёулаа зөв ажиллаж буй хоёр стекийн хооронд хаа нэгтээ хаягдаж байна.
ping биш, интерфэйсээр баталгаажуул. ip -6 addr show tun0 нь туннелийн холбоос өөрийн link-local хаягийг үүсгэсэн эсэхийг хэлж, ip -6 route get fe80::1%tun0 нь цөм хүрээтэй очих газартай үнэхээр юу хийхийг хэлнэ. Цөм тэр интерфэйс дээр очих газар хүрэхгүй гэж хэлбэл ямар ч туннелийн тохиргоо үүнийг өөрчлөхгүй бөгөөд профайлыг засварлахаа болих цаг болсон.
Асуудлыг шийдэх богино дараалал:
- Алсын хост дээрх хаягийг уншиж, fe80:: эсвэл маршрутлагдах угтвар эсэхийг тэмдэглэ.
- Хэрэв fe80:: бол үйлчилгээг дахин холбо, тэр хост дээр реле хий, эсвэл сегментийг гүүрлэ; маршрутлагдах бол маршрут, firewall эсвэл холболтын хаягийг зас.
- Дахин тестлэх бүрт бүсийг дахин шалга, учир нь хуулсан команд ихэвчлэн буруу интерфэйсийг хадгалдаг.
Эх сурвалж: RFC 4291, IPv6 хаягийн архитектур.