IPv6-plaaslike skakeladres werk nie oor 'n VPN nie: waarom fe80 by die skakel bly
'n fe80::-adres beteken net iets op een skakel. Sien waarom 'n gerouteerde VPN dit nie kan dra nie, hoe die fout lyk en watter adres jy eerder moet gebruik.
Jy bring die tonnel op, ping fe80::1 met die tonnel as die bronkoppelvlak, en kry niks terug nie. Dit is nie 'n vuurmuurreël wat jy vergeet het nie. 'n Plaaslike-skakeladres beteken net iets op die enkele skakel waar dit gevorm is, en 'n gerouteerde VPN is nie daardie skakel nie. Die afgeleë roeteerder se fe80::1 woon op die afgeleë LAN-segment; jy sit een hop weg op 'n ander segment, en IPv6 het geen meganisme vir 'n roeteerder om plaaslike-skakelpakette hoegenaamd aan te stuur nie.
Die fe80-voorvoegsel beskryf 'n omvang, nie 'n reeks nie
Plaaslike-skakel-unicast is fe80::/10, en die bepalende eienskap is nie die getal nie, maar die omvang. Die adres geld net op een skakel, en elke koppelvlak vorm een uit sy eie identifiseerder; daarom kan twee onverwante masjiene op twee onverwante netwerke albei op fe80::1 antwoord sonder die minste konflik. Die voorvoegsel sê basies “op een of ander skakel”; die skakel self kom uit konteks.
Op 'n gasheer is daardie konteks die sone, of omvang-ID, wat jy ná 'n persentteken byvoeg: fe80::1%eth0 op Linux, fe80::1%3 of fe80::1%12 op Windows en in gereedskap wat koppelvlakindekse blootlê. Die kern los die adres saam met die koppelvlakindeks op en stuur dan. Los die sone weg en die bestemming is dubbelsinnig, so die stapel het geen manier om 'n segment te kies nie.
Waarom 'n gerouteerde tonnel dit nie kan aflewer nie
'n Gerouteerde VPN is 'n punt-tot-punt-koppelvlak wat sy eie adresse dra, gewoonlik 'n /64 van unieke-plaaslike of private IPv6-ruimte binne die tonnel. Die afgeleë LAN is 'n aparte skakel, bereik deur die tonnel-eindpunt wat namens jou roeteer en aanstuur. Dit is twee afsonderlike segmente, so 'n adres uit die een is nie 'n geldige bestemming op die ander nie.
Die aanstuurreël is eksplisiet in die standaard eerder as 'n eienaardigheid van jou kliënt: roeteerders stuur nie pakette met 'n plaaslike-skakelbron of -bestemming aan nie. Daarom sterf die pakket selfs wanneer die roetetabel korrek lyk. Voeg 'n roete vir fe80::/64 by wat na die tonnel wys, en 'n standaardnakende stapel verwerp dit óf aanvaar dit en laat val elke ooreenstemmende pakket: die bestemmingsomvang sê “net hierdie skakel”, en die uitgaande koppelvlak is nie daardie skakel nie.
Buurontdekking versterk dieselfde grens. Gashere los plaaslike-skakel-volgende spronge op met buurversoeke wat na skakel-omvang-multicast gestuur word met 'n spronglimiet van 255, sodat roeteerders enigiets wat aangestuur word kan verwerp. Om dit oor 'n tonnel te laat werk, sou beteken om ontdekking vir 'n afgeleë segment te proxie, wat Laag 2-oorbrugging met 'n ander hoed is.
Daar is 'n stiller tweede fout, en dit laat mense struikel wat die roete tog probeer forseer: die sone. Watter sone jy plaaslik tik, benoem die tonnelkoppelvlak, terwyl die adres wat jy wil hê aan die afgeleë LAN-koppelvlak gebind is. Die twee pas nooit nie, so die pakket kan nie aan die verre kant na die regte koppelvlak gestuur word nie.
Hoe die fout in die praktyk lyk
Gereedskapuitset vir 'n omvangfout lees soos 'n roeteer- of vuurmuurfout, en dit is juis waarom mense 'n middag in die verkeerde laag deurbring.
| 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 |
Die derde ry mors die meeste tyd, want 'n ssh-kliënt sonder uitset lyk soos 'n luisterdiensprobleem. As jy enige manier in het, kyk na die verre kant en bevestig of sshd aan alle adresse of net een gebind is.
Gebruik 'n adres wat bedoel was om geroteer te word
Vir enigiets wat jy deur die tonnel moet bereik, gebruik die adres wat die diens vir daardie doel gekry het: 'n globale unicast-adres, of 'n unieke-plaaslike adres uit fc00::/7, die reeks wat juis vir hierdie interne geval gereserveer is. Bevestig dat die luisteraar dit werklik bind, en bevestig die terugroete en enige gasheer-vuurmuurreël.
Kyk na die afgeleë gasheer eerder as om te raai. ip -6 addr show lys die adresse wat bestaan, en ss -6 -ltn lys waarop die daemon luister. 'n Diens wat net aan fe80:: gebind is, is net van sy eie segment bereikbaar, wat gewoonlik 'n verstek is wat niemand doelbewus gekies het nie en met die administrateur se instemming verander kan word.
Wanneer die diens werklik nie herbind kan word nie, skuif die brug op na die toepassingslaag in plaas van die netwerklaag. 'n Herleier op die afgeleë gasheer wat op 'n roeteerbare adres luister en aan die plaaslike-skakel-een koppel, los die probleem op sonder om enige segment uit te brei:
socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80Hier sit die sone aan die regte kant, op die gasheer wat werklik eth0 op daardie skakel het. Jou kliënt praat met fd00:1:2::10, wat normaal roeteer, en die herleier maak die plaaslike-skakel-sprong plaaslik. Dieselfde truuk werk vir 'n toestel se webkoppelvlak of 'n ou BMC wat net 'n plaaslike-skakeladres adverteer.
Wanneer oorbrugging werklik die antwoord is, en wat om na te gaan
Sommige ontplooiings het wel een gedeelde segment nodig: 'n toestel wat net plaaslike-skakel-ontdekking praat, 'n toestel wat van multicast afhanklik is, 'n laboratorium wat 'n plat LAN herproduseer. Dit is 'n Laag 2-probleem en dit het 'n Laag 2-antwoord nodig, soos 'n tap-toestel wat aan die afgeleë koppelvlak oorbrug is of 'n kliëntproduk met 'n eksplisiete oorbrugde modus. Dit kos jou uitsaai- en multicast-verkeer wat die tonnel kruis, plus buurontdekking wat van punt tot punt moet werk.
Moenie dit benader deur fe80::/64 by 'n gerouteerde profiel te voeg nie. Dit lewer die slegste toestand van alles: die konfigurasie lyk klaar, die roetetabel wys 'n inskrywing, en elke pakket word steeds êrens tussen twee stapels wat albei korrek optree, weggegooi.
Verifieer met die koppelvlak eerder as met die ping. ip -6 addr show tun0 vertel jou of die tonnelskakel sy eie plaaslike-skakeladres gevorm het, en ip -6 route get fe80::1%tun0 vertel wat die kern werklik met 'n omvangbestemming sou doen. Wanneer die kern sê die bestemming is onbereikbaar op daardie koppelvlak, sal geen tonnelinstelling dit verander nie, en dit is tyd om op te hou om die profiel te redigeer.
'n Kort reeks wat die vraag besleg:
- Lees die adres op die afgeleë gasheer en let op of dit fe80:: of 'n roeteerbare voorvoegsel is.
- As dit fe80:: is, herbind die diens, herlei op daardie gasheer, of oorbrug die segment; as dit roeteerbaar is, maak die roete, vuurmuur of bindadres reg.
- Gaan die sone elke keer na wanneer jy weer toets, want 'n gekopieerde opdrag hou gewoonlik die verkeerde koppelvlak.