IPv6 link-local nedarbojas caur VPN: kāpēc fe80 apstājas saitē
Adresei fe80:: ir nozīme tikai vienā saitē. Uzziniet, kāpēc maršrutēts VPN to nevar pārnest, kā izskatās kļūme un kuru adresi tā vietā izmantot.
Jūs paceļat tuneli, pingojat fe80::1, izmantojot tuneli kā avota saskarni, un nekas neatgriežas. Tas nav aizmirsts ugunsmūra noteikums. Link-local adresei ir nozīme tikai tajā vienā saitē, kurā tā izveidojās, un maršrutēts VPN nav šī saite. Attālā maršrutētāja fe80::1 atrodas attālajā LAN segmentā; jūs esat vienu lēcienu tālāk citā segmentā, un IPv6 vispār nav mehānisma, ar kuru maršrutētājs pārsūtītu link-local paketes.
fe80 prefikss apraksta tvērumu, nevis diapazonu
Link-local unicast ir fe80::/10, un noteicošā īpašība ir nevis skaitlis, bet tvērums. Adrese ir derīga tikai vienā saitē, un katra saskarne izveido vienu no sava identifikatora, tāpēc divas nesaistītas mašīnas divos nesaistītos tīklos var abas atbildēt uz fe80::1 bez mazākā konflikta. Prefikss būtībā saka “kaut kādā saitē”; pati saite nāk no konteksta.
Resursdatorā šis konteksts ir zona jeb scope ID, ko pievieno aiz procentu zīmes: fe80::1%eth0 Linux, fe80::1%3 vai fe80::1%12 Windows un rīkos, kas parāda saskarnes indeksus. Kodols atrisina adresi kopā ar saskarnes indeksu un pēc tam sūta. Ja noņemat zonu, galamērķis kļūst neviennozīmīgs, tāpēc stekam nav veida, kā izvēlēties segmentu.
Kāpēc maršrutēts tunelis to nevar nogādāt
Maršrutēts VPN ir punkts-punktā saskarne, kas nes savas adreses, parasti /64 no unique-local vai privātā IPv6 lauka tunelī. Attālais LAN ir atsevišķa saite, ko sasniedz tuneļa galapunkts, maršrutējot un pārsūtot jūsu vietā. Tie ir divi atšķirīgi segmenti, tāpēc viena adrese nav derīgs galamērķis otrā.
Pārsūtīšanas noteikums ir skaidri ierakstīts standartā, nevis jūsu klienta dīvainība: maršrutētāji nepārsūta paketes ar link-local avotu vai galamērķi. Tāpēc pakete iet bojā arī tad, kad maršrutu tabula izskatās pareiza. Pievienojiet maršrutu fe80::/64 uz tuneli, un standartam atbilstošs steks vai nu to noraida, vai pieņem un izmet katru atbilstošo paketi: galamērķa tvērums saka “tikai šī saite”, un izejošā saskarne nav šī saite.
Kaimiņu atklāšana nostiprina to pašu robežu. Resursdatori atrisina link-local nākamos lēcienus ar kaimiņa pieprasījumu, kas nosūtīts uz saites tvēruma multicast ar lēcienu ierobežojumu 255, tāpēc maršrutētāji var noraidīt visu pārsūtīto. Padarīt to darbināmu pāri tunelim nozīmētu starpniekot atklāšanu attālam segmentam, kas ir Layer 2 tiltēšana citā cepurē.
Ir klusāka otrā kļūme, un tā pieķer cilvēkus, kuri tomēr mēģina piespiest maršrutu: zona. Kādu zonu jūs ierakstītu lokāli, tā nosauc tuneļa saskarni, bet vēlamā adrese ir piesaistīta attālā LAN saskarnei. Abas nekad nesakrīt, tāpēc paketi nevar novirzīt uz pareizo saskarni tālajā galā.
Kā kļūme izskatās praksē
Rīka izvade tvēruma kļūdai lasās kā maršrutēšanas vai ugunsmūra kļūda, un tieši tāpēc cilvēki pavada pēcpusdienu nepareizajā slānī.
| 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šā rinda iztērē visvairāk laika, jo ssh klients bez izvades izskatās kā klausošas pakalpojuma problēma. Ja jums ir kāds veids, kā iekļūt, pārbaudiet tālo pusi un apstipriniet, vai sshd ir piesaistīts visām adresēm vai tikai vienai.
Izmantojiet adresi, kas bija paredzēta maršrutēšanai
Visam, kam jāpiekļūst caur tuneli, izmantojiet adresi, kas pakalpojumam tika dota tieši šim nolūkam: globālu unicast adresi vai unique-local adresi no fc00::/7, diapazonu, kas rezervēts tieši šim iekšējam gadījumam. Apstipriniet, ka klausītājs to patiešām saista, un pārbaudiet atgriešanās ceļu un jebkuru resursdatora ugunsmūra noteikumu.
Skatieties uz attālo resursdatoru, nevis miniet. ip -6 addr show uzskaita esošās adreses, un ss -6 -ltn uzskaita, ko dēmons klausās. Pakalpojums, kas piesaistīts tikai fe80::, ir sasniedzams tikai no sava segmenta, kas parasti ir noklusējums, ko neviens nav apzināti izvēlējies un ko var mainīt ar administratora piekrišanu.
Kad pakalpojumu patiešām nevar no jauna piesaistīt, pārvietojiet tiltu uz lietojumprogrammu slāni, nevis uz tīkla slāni. Starpnieks attālajā resursdatorā, kas klausās maršrutējamā adresē un savienojas ar link-local, atrisina problēmu, nepaplašinot nevienu segmentu:
socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80Šeit zona atrodas pareizajā pusē, tajā resursdatorā, kuram patiešām ir eth0 šajā saitē. Jūsu klients sazinās ar fd00:1:2::10, kas maršrutējas normāli, un starpnieks veic link-local lēcienu lokāli. Tas pats triks darbojas ierīces tīmekļa saskarnei vai vecam BMC, kas reklamē tikai link-local adresi.
Kad tiltēšana patiešām ir atbilde, un kas jāpārbauda
Dažiem izvietojumiem patiešām vajag vienu kopīgu segmentu: ierīcei, kas runā tikai link-local atklāšanu, aparātam, kas atkarīgs no multicast, laboratorijai, kas atveido plakanu LAN. Tā ir Layer 2 problēma, un tai vajag Layer 2 atbildi, piemēram, tap ierīci, kas tiltēta uz attālo saskarni, vai klienta produktu ar skaidru tiltēšanas režīmu. Tas izmaksā apraides un multicast satiksmi, kas šķērso tuneli, plus kaimiņu atklāšanu, kurai jādarbojas no gala līdz galam.
Netuviniet to, pievienojot fe80::/64 maršrutētam profilam. Tas rada sliktāko stāvokli: konfigurācija izskatās pabeigta, maršrutu tabula rāda ierakstu, un katra pakete joprojām tiek izmesta kaut kur starp diviem stekiem, kuri abi uzvedas pareizi.
Pārbaudiet ar saskarni, nevis ar ping. ip -6 addr show tun0 pasaka, vai tuneļa saite izveidoja savu link-local adresi, un ip -6 route get fe80::1%tun0 pasaka, ko kodols patiešām darītu ar tvēruma galamērķi. Kad kodols saka, ka galamērķis šajā saskarnē nav sasniedzams, nekāds tuneļa iestatījums to nemainīs, un ir laiks pārtraukt profila rediģēšanu.
Īsa secība, kas atrisina jautājumu:
- Izlasiet adresi attālajā resursdatorā un ievērojiet, vai tā ir fe80:: vai maršrutējams prefikss.
- Ja tā ir fe80::, no jauna piesaistiet pakalpojumu, veiciet starpniecību šajā resursdatorā vai tiltējiet segmentu; ja tā ir maršrutējama, izlabojiet maršrutu, ugunsmūri vai piesaistes adresi.
- Katru reizi atkārtoti pārbaudot, pārbaudiet zonu no jauna, jo nokopētā komanda parasti saglabā nepareizo saskarni.