IPv6 link-local ne radi preko VPN-a: zašto se fe80 zaustavlja na linku
Adresa fe80:: ima značenje samo na jednom linku. Pogledajte zašto je rutirani VPN ne može prenijeti, kako izgleda kvar i koju adresu umjesto nje koristiti.
Podignete tunel, pingate fe80::1 s tunelom kao izvornim sučeljem i ne dobijete ništa natrag. To nije firewall pravilo koje ste zaboravili. Link-local adresa ima značenje samo na jednom linku na kojem je nastala, a rutirani VPN nije taj link. fe80::1 udaljenog usmjerivača nalazi se na udaljenom LAN segmentu; vi sjedite jedan skok dalje na drugom segmentu, a IPv6 uopće nema mehanizam kojim bi usmjerivač prosljeđivao link-local pakete.
Prefiks fe80 opisuje doseg, a ne raspon
Link-local unicast je fe80::/10, a definirajuće svojstvo nije broj nego doseg. Adresa vrijedi samo na jednom linku, a svako sučelje stvara jednu iz svog identifikatora, zato dva nepovezana stroja na dvije nepovezane mreže mogu oba odgovarati na fe80::1 bez ikakvog sukoba. Prefiks zapravo kaže “na nekom linku”; sam link dolazi iz konteksta.
Na hostu je taj kontekst zona, odnosno scope ID, koju dodajete nakon znaka postotka: fe80::1%eth0 na Linuxu, fe80::1%3 ili fe80::1%12 na Windowsu i u alatima koji izlažu indekse sučelja. Kernel razrješava adresu zajedno s indeksom sučelja i zatim šalje. Ispustite zonu i odredište je dvosmisleno, pa stack nema načina odabrati segment.
Zašto je rutirani tunel ne može dostaviti
Rutirani VPN je točka-na-točku sučelje koje nosi vlastite adrese, obično /64 unique-local ili privatnog IPv6 prostora unutar tunela. Udaljeni LAN je zaseban link do kojeg se dolazi tako da kraj tunela usmjerava i prosljeđuje u vaše ime. To su dva različita segmenta, pa adresa s jednoga nije valjano odredište na drugome.
Pravilo prosljeđivanja izričito je u standardu, a ne hirovitost vašeg klijenta: usmjerivači ne prosljeđuju pakete s link-local izvorom ili odredištem. Zato paket umire i kad tablica usmjeravanja izgleda ispravno. Dodajte rutu za fe80::/64 prema tunelu i sukladni stack će je ili odbiti ili prihvatiti i odbaciti svaki odgovarajući paket: doseg odredišta kaže “samo ovaj link”, a izlazno sučelje nije taj link.
Otkriće susjeda učvršćuje istu granicu. Hostovi razrješavaju link-local sljedeće skokove zahtjevom za susjeda poslanim na multicast u dosegu linka s ograničenjem skoka 255, pa usmjerivači mogu odbiti sve što se prosljeđuje. Učiniti to preko tunela značilo bi posredovati u otkriću za udaljeni segment, što je Layer 2 premosćivanje u drugom šeširu.
Postoji tiši drugi kvar i on hvata ljude koji ipak pokušavaju forsirati rutu: zona. Koju god zonu upišete lokalno, imenuje sučelje tunela, dok je adresa koju želite vezana uz sučelje udaljenog LAN-a. Njih dvoje nikad se ne podudaraju, pa se paket ne može usmjeriti na pravo sučelje na udaljenom kraju.
Kako kvar izgleda u praksi
Izlaz alata za pogrešku dosega čita se kao pogreška usmjeravanja ili firewalla, i upravo zato ljudi provedu poslijepodne u pogrešnom sloju.
| 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 |
Treći redak troši najviše vremena jer ssh klijent bez izlaza izgleda kao problem servisa koji sluša. Ako imate ikakav način da uđete, provjerite udaljenu stranu i potvrdite je li sshd vezan na sve adrese ili samo na jednu.
Koristite adresu koja je namijenjena usmjeravanju
Za sve do čega trebate doći kroz tunel upotrijebite adresu koju je servis dobio upravo u tu svrhu: globalnu unicast adresu ili unique-local adresu iz fc00::/7, raspon rezerviran upravo za ovaj interni slučaj. Potvrdite da je slušatelj doista veže i provjerite povratni put te svako firewall pravilo na hostu.
Pogledajte udaljeni host umjesto nagađanja. ip -6 addr show popisuje adrese koje postoje, a ss -6 -ltn popisuje na čemu daemon sluša. Servis vezan samo na fe80:: dostupan je samo sa svog segmenta, što je obično zadana vrijednost koju nitko nije namjerno odabrao i može se promijeniti uz suglasnost administratora.
Kad se servis doista ne može ponovno vezati, premjestite premosnicu na aplikacijski sloj umjesto na mrežni. Posrednik na udaljenom hostu koji sluša na adresi koja se može usmjeravati i spaja se na link-local adresu rješava problem bez proširivanja ikakvog segmenta:
socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80Ovdje zona sjedi na ispravnoj strani, na hostu koji doista ima eth0 na tom linku. Vaš klijent razgovara s fd00:1:2::10, koji se normalno usmjerava, a posrednik obavlja link-local skok lokalno. Isti trik radi za web sučelje uređaja ili stari BMC koji oglašava samo link-local adresu.
Kad je premosćivanje doista odgovor, i što provjeriti
Neke implementacije doista trebaju jedan zajednički segment: uređaj koji govori samo link-local otkriće, uređaj koji ovisi o multicastu, laboratorij koji reproducira ravni LAN. To je problem Layer 2 i traži Layer 2 odgovor, poput tap uređaja premoštenog na udaljeno sučelje ili klijentskog proizvoda s izričitim premoštenim načinom. To vas stoji broadcast i multicast prometa koji prelazi tunel te otkrića susjeda koje mora raditi od kraja do kraja.
Ne približavajte to dodavanjem fe80::/64 u rutirani profil. To stvara najgore stanje: konfiguracija izgleda dovršeno, tablica usmjeravanja pokazuje unos, a svaki paket i dalje se odbacuje negdje između dvaju stackova koji se oba ponašaju ispravno.
Provjerite putem sučelja, a ne pingom. ip -6 addr show tun0 kaže je li link tunela stvorio vlastitu link-local adresu, a ip -6 route get fe80::1%tun0 kaže što bi kernel doista učinio sa scoped odredištem. Kad kernel kaže da je odredište nedostupno na tom sučelju, nikakva postavka tunela to neće promijeniti i vrijeme je da prestanete uređivati profil.
Kratak slijed koji rješava pitanje:
- Pročitajte adresu na udaljenom hostu i zabilježite je li fe80:: ili prefiks koji se može usmjeravati.
- Ako je fe80::, ponovno vežite servis, posredujte na tom hostu ili premosnite segment; ako se može usmjeravati, popravite rutu, firewall ili adresu vezanja.
- Provjerite zonu svaki put kad ponovno testirate, jer kopirana naredba obično zadrži pogrešno sučelje.