Podignete tunel, pošaljete ping na fe80::1 s tunelom kao izvornim interfejsom i ne dobijete ništa natrag. To nije firewall pravilo koje ste zaboravili. Link-local adresa ima značenje samo na jedinom linku na kojem je nastala, a rutirani VPN nije taj link. fe80::1 udaljenog rutera živi na udaljenom LAN segmentu; vi ste jedan hop dalje na drugom segmentu, a IPv6 nema nikakav mehanizam da ruter uopće prosljeđuje link-local pakete.

Prefiks fe80 opisuje domet, a ne raspon

Link-local unicast je fe80::/10, a bitno svojstvo nije broj nego domet. Adresa vrijedi samo na jednom linku i svaki interfejs je formira iz vlastitog identifikatora, zato dva nepovezana računara na dvije nepovezane mreže mogu oba odgovarati na fe80::1 bez ikakvog sukoba. Prefiks u suštini kaže “na nekom linku”; sam link dolazi iz konteksta.

Na hostu je taj kontekst zona, odnosno scope ID, koji dodajete nakon znaka procenta: fe80::1%eth0 na Linuxu, fe80::1%3 ili fe80::1%12 na Windowsu i u alatima koji izlažu indekse interfejsa. Kernel razrješava adresu zajedno s indeksom interfejsa i zatim šalje. Izbacite zonu i odredište postaje dvosmisleno, pa stack nema načina da odabere segment.

Zašto je rutirani tunel ne može dostaviti

Rutirani VPN je point-to-point interfejs koji nosi vlastite adrese, obično /64 jedinstveno-lokalnog ili privatnog IPv6 prostora unutar tunela. Udaljeni LAN je zaseban link, do kojeg se dolazi rutiranjem i prosljeđivanjem krajnje točke tunela 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 osobitost vašeg klijenta: ruteri ne prosljeđuju pakete s link-local izvorom ili odredištem. Zato paket umire i kada tablica rutiranja izgleda ispravno. Dodajte rutu za fe80::/64 prema tunelu i stack usklađen sa standardom ili će je odbiti ili će je prihvatiti i odbaciti svaki odgovarajući paket: domet odredišta kaže “samo ovaj link”, a izlazni interfejs nije taj link.

Otkrivanje susjeda pojačava istu granicu. Hostovi razrješavaju link-local sljedeće hopove zahtjevom susjedima poslanim na multicast dometa linka s ograničenjem hopova 255, pa ruteri mogu odbiti sve što se proslijedi. Učiniti to preko tunela značilo bi proxy otkrivanja za udaljeni segment, što je Layer 2 premosnica u drugom šeširu.

Postoji i tiši drugi kvar i on zbunjuje ljude koji ipak pokušaju nasilno postaviti rutu: zona. Koju god zonu upišete lokalno, ona imenuje interfejs tunela, dok je adresa koju želite vezana za interfejs udaljenog LAN-a. Njih dvoje se nikada ne poklapaju, pa se paket ne može usmjeriti na pravi interfejs na udaljenom kraju.

Kako kvar izgleda u praksi

Izlaz alata za grešku u dometu čita se kao greška rutiranja ili firewall-a, i upravo zato ljudi provedu popodne u pogrešnom sloju.

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

Treći red gubi najviše vremena, jer ssh klijent bez izlaza izgleda kao problem usluge koja sluša. Ako imate ikakav ulaz, provjerite udaljenu stranu i potvrdite je li sshd vezan na sve adrese ili samo na jednu.

Koristite adresu koja je i namijenjena rutiranju

Za sve do čega trebate doći kroz tunel koristite adresu koju je usluga dobila upravo za to: globalnu unicast adresu ili jedinstveno-lokalnu adresu iz fc00::/7, raspona rezerviranog točno za ovaj interni slučaj. Potvrdite da je slušatelj stvarno veže i provjerite povratni put i svako pravilo firewall-a na hostu.

Gledajte udaljeni host umjesto da nagađate. ip -6 addr show navodi adrese koje postoje, a ss -6 -ltn navodi na što démon sluša. Usluga vezana samo na fe80:: dostupna je samo sa svog segmenta, što je obično zadana postavka koju nitko nije namjerno odabrao i može se promijeniti uz suglasnost administratora.

Kada se usluga doista ne može ponovno vezati, podignite premosnicu na aplikacijski sloj umjesto na mrežni. Posrednik na udaljenom hostu koji sluša na rutabilnoj adresi i spaja se na link-local adresu rješava problem bez proširenja ijednog segmenta:

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

Ovdje zona stoji na ispravnoj strani, na hostu koji doista ima eth0 na tom linku. Vaš klijent razgovara s fd00:1:2::10, koji se normalno rutira, a posrednik link-local hop čini lokalnim. Isti trik radi za web sučelje uređaja ili stari BMC koji objavljuje samo link-local adresu.

Kada je premošćivanje doista rješenje i što provjeriti

Neke implementacije doista trebaju jedan zajednički segment: uređaj koji govori samo link-local otkrivanje, uređaj koji ovisi o multicastu, laboratorij koji reproducira ravni LAN. To je problem Layer 2 i traži odgovor Layer 2, poput tap uređaja premoštenog na udaljeni interfejs ili klijentskog proizvoda s izričitim premoštenim načinom. To vas košta broadcast i multicast prometa kroz tunel plus otkrivanja susjeda koje mora raditi od kraja do kraja.

Ne pokušavajte to približiti dodavanjem fe80::/64 rutiranom profilu. Tako nastaje najgore stanje: konfiguracija izgleda dovršeno, tablica rutiranja pokazuje zapis, a svaki paket se i dalje odbacuje negdje između dva stacka koja se oba ponašaju ispravno.

Provjeravajte interfejsom, a ne pingom. ip -6 addr show tun0 kaže je li link tunela formirao vlastitu link-local adresu, a ip -6 route get fe80::1%tun0 kaže što bi kernel doista učinio sa scoped odredištem. Kada kernel kaže da je odredište nedostupno na tom interfejsu, 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 rutabilni prefiks.
  • Ako je fe80::, ponovno vežite uslugu, posredujte na tom hostu ili premostite segment; ako je rutabilna, popravite rutu, firewall ili adresu vezanja.
  • Provjerite zonu pri svakom ponovnom testiranju, jer kopirana naredba obično zadrži pogrešan interfejs.

Izvori: RFC 4291, IPv6 arhitektura adresiranja.

Povezani članci