Zdvihnete tunel, pingnete fe80::1 s tunelom ako zdrojovým rozhraním a nič sa nevráti. Nie je to zabudnuté pravidlo firewallu. Adresa link-local má význam len na tom jedinom prepojení, kde vznikla, a smerovaný VPN nie je to prepojenie. fe80::1 vzdialeného smerovača žije vo vzdialenom segmente LAN; vy sedíte o jeden skok ďalej v inom segmente a IPv6 vôbec nemá mechanizmus, ktorým by smerovač preposielal link-local pakety.

Prefix fe80 opisuje rozsah pôsobnosti, nie rozsah adries

Link-local unicast je fe80::/10 a definujúcou vlastnosťou nie je číslo, ale rozsah pôsobnosti. Adresa platí len na jednom prepojení a každé rozhranie si vytvorí jednu z vlastného identifikátora, preto dve nesúvisiace zariadenia v dvoch nesúvisiacich sieťach môžu obe odpovedať na fe80::1 bez najmenšieho konfliktu. Prefix v podstate hovorí „na nejakom prepojení“; samotné prepojenie prichádza z kontextu.

Na hostiteľovi je tým kontextom zóna, čiže scope ID, ktorú pridáte za znak percenta: fe80::1%eth0 v Linuxe, fe80::1%3 alebo fe80::1%12 vo Windows a v nástrojoch, ktoré zobrazujú indexy rozhraní. Jadro vyrieši adresu spolu s indexom rozhrania a potom odošle. Ak zónu vynecháte, cieľ je nejednoznačný, takže zásobník nemá ako vybrať segment.

Prečo smerovaný tunel nedokáže adresu doručiť

Smerovaný VPN je rozhranie bod-bod, ktoré nesie vlastné adresy, zvyčajne /64 z unique-local alebo súkromného priestoru IPv6 v tuneli. Vzdialená LAN je samostatné prepojenie, ku ktorému sa dostane koncový bod tunela smerovaním a preposielaním vo vašom mene. Sú to dva odlišné segmenty, takže adresa z jedného nie je platným cieľom v druhom.

Pravidlo preposielania je výslovne v štandarde, nie je to zvláštnosť vášho klienta: smerovače nepreposielajú pakety s link-local zdrojom alebo cieľom. Preto paket zomrie aj vtedy, keď tabuľka smerovania vyzerá správne. Pridajte trasu pre fe80::/64 k tunelu a zásobník v súlade so štandardom ju buď odmietne, alebo prijme a zahodí každý zodpovedajúci paket: rozsah cieľa hovorí „len toto prepojenie“ a odchádzajúce rozhranie nie je to prepojenie.

Objavovanie susedov posilňuje tú istú hranicu. Hostitelia riešia link-local ďalšie skoky žiadosťou o suseda odoslanou na multicast s rozsahom prepojenia a limitom skoku 255, takže smerovače môžu odmietnuť všetko preposlané. Dosiahnuť, aby to fungovalo cez tunel, by znamenalo proxovať objavovanie pre vzdialený segment, čo je most Layer 2 v inom klobúku.

Existuje tichšia druhá porucha a tá chytá ľudí, ktorí sa trasu aj tak snažia vynútiť: zóna. Akúkoľvek zónu zadáte lokálne, pomenúva rozhranie tunela, zatiaľ čo adresa, ktorú chcete, je viazaná na rozhranie vzdialenej LAN. Tieto dve sa nikdy nezhodujú, takže paket sa nedá nasmerovať na správne rozhranie na vzdialenom konci.

Ako porucha vyzerá v praxi

Výstup nástroja pri chybe rozsahu sa číta ako chyba smerovania alebo firewallu, a práve preto ľudia strávia popoludnie v nesprávnej vrstve.

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

Tretí riadok plytvá najviac času, pretože klient ssh bez výstupu vyzerá ako problém so službou, ktorá počúva. Ak máte akýkoľvek spôsob, ako sa dostať dnu, skontrolujte vzdialenú stranu a potvrďte, či je sshd viazaný na všetky adresy alebo len na jednu.

Použite adresu, ktorá bola určená na smerovanie

Pre všetko, čo potrebujete dosiahnuť cez tunel, použite adresu, ktorú služba dostala práve na tento účel: globálnu unicast adresu alebo unique-local adresu z fc00::/7, rozsah vyhradený presne pre tento interný prípad. Potvrďte, že ju prijímajúci naozaj viaže, a skontrolujte návratovú cestu a akékoľvek pravidlo firewallu hostiteľa.

Pozrite sa na vzdialeného hostiteľa namiesto hádania. ip -6 addr show vypisuje existujúce adresy a ss -6 -ltn vypisuje, na čom démon počúva. Služba viazaná len na fe80:: je dostupná len z vlastného segmentu, čo je zvyčajne predvolená hodnota, ktorú nikto nevybral zámerne a ktorú možno zmeniť so súhlasom správcu.

Keď sa služba naozaj nedá znova pripútať, presuňte most vyššie na aplikačnú vrstvu namiesto sieťovej. Relay na vzdialenom hostiteľovi, ktorý počúva na smerovateľnej adrese a pripája sa k link-local, rieši problém bez rozšírenia akéhokoľvek segmentu:

socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80

Tu zóna sedí na správnej strane, na hostiteľovi, ktorý naozaj má eth0 na tom prepojení. Váš klient komunikuje s fd00:1:2::10, ktorá sa smeruje normálne, a relay vykoná link-local skok lokálne. Rovnaký trik funguje pre webové rozhranie zariadenia alebo starý BMC, ktorý inzeruje iba link-local adresu.

Keď je mostenie naozaj odpoveďou, a čo skontrolovať

Niektoré nasadenia naozaj potrebujú jeden zdieľaný segment: zariadenie, ktoré hovorí iba objavovaním link-local, prístroj závislý od multicastu, laboratórium reprodukujúce plochú LAN. Je to problém Layer 2 a vyžaduje odpoveď Layer 2, napríklad tap zariadenie premostené na vzdialené rozhranie alebo klientsky produkt s výslovným mostovým režimom. Stojí vás to broadcast a multicast prevádzku prechádzajúcu tunelom plus objavovanie susedov, ktoré musí fungovať od konca do konca.

Nepribližujte sa k tomu pridaním fe80::/64 do smerovaného profilu. To vytvára najhorší stav: konfigurácia vyzerá hotová, tabuľka smerovania zobrazuje záznam a každý paket sa stále zahadzuje niekde medzi dvoma zásobníkmi, ktoré sa oba správajú správne.

Overujte rozhraním, nie pingom. ip -6 addr show tun0 vám povie, či prepojenie tunela vytvorilo vlastnú link-local adresu, a ip -6 route get fe80::1%tun0 vám povie, čo by jadro naozaj urobilo s cieľom s rozsahom. Keď jadro povie, že cieľ je na tomto rozhraní nedostupný, žiadne nastavenie tunela to nezmení a je čas prestať upravovať profil.

Krátka postupnosť, ktorá otázku vyrieši:

  • Prečítajte adresu na vzdialenom hostiteľovi a všimnite si, či je to fe80:: alebo smerovateľný prefix.
  • Ak je to fe80::, znova pripnite službu, urobte relay na tomto hostiteľovi alebo premostite segment; ak je smerovateľná, opravte trasu, firewall alebo adresu pripútania.
  • Zónu kontrolujte pri každom opakovanom teste, pretože skopírovaný príkaz zvyčajne zachová nesprávne rozhranie.

Zdroje: RFC 4291, architektúra adresovania IPv6.

Súvisiace články