Сіз туннельді көтересіз, туннельді бастауыш интерфейс ретінде пайдаланып 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 runWhat you seeWhat it means
ping fe80::1 with no zoneInvalid argument on Linux, or a transmit failure on WindowsThe stack cannot pick an interface for an ambiguous destination
ping -6 -I tun0 fe80::1Destination unreachable, or a silent timeoutThe address is not on the tunnel link, so there is nothing on-link to answer
ssh user@fe80::1 after the tunnel is upHangs, then no route to hostThe SYN never left the machine in a deliverable form; the server logs nothing
ip -6 neigh show dev tun0Empty tableNo neighbor entry can exist for a link-local host that is not on this link
fe80::/64 inside AllowedIPs or route-ipv6Config accepted, traffic still droppedThe 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 секірісін жергілікті жерде орындайды. Сол трюк құрылғының веб-интерфейсі немесе тек 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 мекенжай архитектурасы.

Қатысты мақалалар