Tõstate tunnelid üles, pingite fe80::1, kus tunnel on lähteliides, ja midagi ei tule tagasi. See ei ole tulemüürireegel, mille te unustasite. Lokaalaadress tähendab midagi ainult sellel ühel lülil, kus see moodustati, ja marsruuditud VPN ei ole see lüli. Kaugema ruuteri fe80::1 elab kaugel LAN-segmendil; te istute ühe hüppe kaugusel teisel segmendil ja IPv6-l puudub täielikult mehhanism, millega ruuter lokaalaadressi pakette edasi saadaks.

Eesliide fe80 kirjeldab ulatust, mitte vahemikku

Lokaalne unicast on fe80::/10 ja määrav omadus ei ole number, vaid ulatus. Aadress kehtib ainult ühel lülil ja iga liides moodustab ühe oma identifikaatorist; seepärast võivad kaks seostamata masinat kahes seostamata võrgus mõlemad vastata aadressile fe80::1 ilma vähimagi konfliktita. Eesliide ütleb sisuliselt «mingil lülil»; lüli ise tuleb kontekstist.

Hostis on selleks kontekstiks tsoon ehk ulatuse ID, mille lisate protsendimärgi järele: fe80::1%eth0 Linuxis, fe80::1%3 või fe80::1%12 Windowsis ja tööriistades, mis näitavad liidese indekseid. Kernel lahendab aadressi koos liidese indeksiga ja saadab siis. Kui tsooni ära jätate, on sihtkoht mitmetähenduslik, nii et virnal pole võimalust segmenti valida.

Miks marsruuditud tunnel ei suuda seda kohale toimetada

Marsruuditud VPN on punkt-punkt-liides, mis kannab oma aadresse, tavaliselt /64 unikaalset-lokaalset või privaatset IPv6-ruumi tunneli sees. Kaugem LAN on eraldi lüli, kuhu jõutakse tunneli lõpp-punkti marsruutimise ja edasisaatmise kaudu teie nimel. Need on kaks eri segmenti, seega ühe aadress ei ole teisel kehtiv sihtkoht.

Edasisaatmise reegel on standardis selgesõnaline, mitte teie kliendi veidrus: ruuterid ei saada edasi pakette, mille allikas või sihtkoht on lokaalaadress. Seepärast sureb pakett ka siis, kui marsruutimistabel näib korras olevat. Lisage marsruut fe80::/64 kohta tunnelile ja standardile vastav virn kas lükkab selle tagasi või võtab vastu ja viskab kõik sobivad paketid ära: sihtkoha ulatus ütleb «ainult see lüli» ja väljuv liides ei ole see lüli.

Naabrite avastamine tugevdab sama piiri. Hostid lahendavad lokaalaadressi järgmised hüpped naaberpäringuga, mis saadetakse lüliulatuse multicastile hüppepiiranguga 255, nii et ruuterid saavad edasisaadetu tagasi lükata. Selle tunnelist läbi tööle panemine tähendaks avastamise puhverserverit kaugema segmendi jaoks, mis on 2. taseme sillutamine teise mütsiga.

On ka vaiksem teine tõrge ja see komistab need, kes üritavad marsruudi ikkagi jõuga paika panna: tsoon. Ükskõik millise tsooni lokaalselt sisestate, see nimetab tunneli liidest, samal ajal kui soovitud aadress on seotud kaugema LAN-i liidesega. Need kaks ei klapi kunagi, seega ei saa paketti kaugemas otsas õigele liidesele suunata.

Kuidas tõrge praktikas välja näeb

Tööriistade väljund ulatuse vea korral loetakse marsruutimis- või tulemüüriveana ja just seepärast veedavad inimesed pärastlõuna vales kihis.

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

Kolmas rida raiskab kõige rohkem aega, sest väljundita ssh-klient näeb välja nagu kuulava teenuse probleem. Kui teil on mingi ligipääs, vaadake kaugemat poolt ja kontrollige, kas sshd on seotud kõigi aadressidega või ainult ühega.

Kasutage aadressi, mis oli mõeldud marsruutimiseks

Kõige jaoks, kuhu peate tunneli kaudu jõudma, kasutage aadressi, mille teenus sai just selleks otstarbeks: globaalset unicast-aadressi või unikaalset-lokaalset aadressi vahemikust fc00::/7, vahemikku, mis on reserveeritud täpselt selle sisejuhtumi jaoks. Kinnitage, et kuulaja selle tõesti seob, ning kontrollige tagasiteed ja hosti tulemüürireeglit.

Vaadake kaugemat hosti, selle asemel et oletada. ip -6 addr show loetleb olemasolevad aadressid ja ss -6 -ltn loetleb, mida deemon kuulab. Ainult fe80::-ga seotud teenus on kättesaadav ainult oma segmendist, mis on tavaliselt vaikeväärtus, mida keegi ei valinud meelega ja mida saab administraatori nõusolekul muuta.

Kui teenust tõesti uuesti siduda ei saa, tõstke sild rakenduskihile, mitte võrgukihile. Kaugemas hostis olev relee, mis kuulab marsruuditaval aadressil ja ühendub lokaalaadressiga, lahendab probleemi ilma ühtegi segmenti laiendamata:

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

Siin asub tsoon õigel pool, hostis, millel on tõesti eth0 sellel lülil. Teie klient räägib aadressiga fd00:1:2::10, mida marsruuditakse tavaliselt, ja relee teeb lokaalaadressi hüppe kohapeal. Sama trikk töötab seadme veebiliidese või vana BMC puhul, mis kuulutab ainult lokaalaadressi.

Millal sillutamine tõesti vastuseks on, ja mida kontrollida

Mõned juurutused vajavad tõesti üht ühist segmenti: seade, mis räägib ainult lokaalaadressi avastamist, seade, mis sõltub multicastist, labor, mis taastoodab lamedat LAN-i. See on 2. taseme probleem ja vajab 2. taseme vastust, näiteks kaugemale liidesele sillutatud tap-seadet või selgesõnalise sillarežiimiga klienditoodet. See maksab teile üle tunneli käivat broadcast- ja multicast-liiklust ning naabrite avastamist, mis peab töötama otsast otsani.

Ärge lähendage seda fe80::/64 lisamisega marsruuditud profiilile. See tekitab kõige halvema olukorra: konfiguratsioon näeb valmis välja, marsruutimistabel näitab kirjet ja iga pakett visatakse ikkagi kusagil kahe virna vahel ära, kusjuures mõlemad käituvad korrektselt.

Kontrollige liidesega, mitte pingiga. ip -6 addr show tun0 ütleb, kas tunneli lüli moodustas oma lokaalaadressi, ja ip -6 route get fe80::1%tun0 ütleb, mida kernel ulatusega sihtkohaga tegelikult teeks. Kui kernel ütleb, et sihtkoht on sellel liidesel kättesaamatu, ei muuda seda ükski tunneli seade, ja on aeg profiili muutmine lõpetada.

Lühike jada, mis küsimuse lahendab:

  • Lugege aadress kaugemas hostis ja pange tähele, kas see on fe80:: või marsruuditav eesliide.
  • Kui see on fe80::, siduge teenus uuesti, tehke relee selles hostis või sillutage segment; kui see on marsruuditav, parandage marsruut, tulemüür või sidumisaadress.
  • Kontrollige tsooni iga kord, kui uuesti testite, sest kopeeritud käsk hoiab tavaliselt vale liidest.

Allikad: RFC 4291, IPv6 aadressiarhitektuur.

Seotud artiklid