IPv6 loka-ligila adreso ne funkcias tra VPN: kial fe80 haltas ĉe la ligilo
Adreso fe80:: signifas ion nur sur unu ligilo. Vidu kial enkursigita VPN ne povas transporti ĝin, kiel la fiasko aspektas, kaj kiun adreson uzi anstataŭe.
Vi starigas la tunelon, pings fe80::1 kun la tunelo kiel fonta interfaco, kaj nenio revenas. Ĝi ne estas fajroŝirma regulo, kiun vi forgesis. Loka-ligila adreso signifas ion nur sur la unu ligilo, kie ĝi formiĝis, kaj enkursigita VPN ne estas tiu ligilo. La fe80::1 de la malproksima enkursigilo loĝas sur la malproksima LAN-segmento; vi sidas unu salton for sur alia segmento, kaj IPv6 tute ne havas meĥanismon por ke enkursigilo plusendu loka-ligilajn pakaĵojn.
La prefikso fe80 priskribas amplekson, ne intervalon
Loka-ligila unuopaĵo estas fe80::/10, kaj la difina eco ne estas la nombro sed la amplekso. La adreso validas nur sur unu ligilo, kaj ĉiu interfaco formas unu el sia propra identigilo; tial du senrilataj maŝinoj sur du senrilataj retoj povas ambaŭ respondi al fe80::1 sen la plej eta konflikto. La prefikso esence diras «sur iu ligilo»; la ligilo mem venas el la kunteksto.
Sur gastiganto tiu kunteksto estas la zono, aŭ la ampleksa identigilo, kiun vi aldonas post elcenta signo: fe80::1%eth0 en Linux, fe80::1%3 aŭ fe80::1%12 en Windows kaj en iloj, kiuj montras interfacajn indeksojn. La kerno solvas la adreson kune kun la interfaca indekso kaj poste sendas. Forigu la zonon kaj la celo fariĝas ambigua, do la stako havas neniun manieron elekti segmenton.
Kial enkursigita tunelo ne povas ĝin liveri
Enkursigita VPN estas punkt-al-punkta interfaco, kiu portas siajn proprajn adresojn, kutime /64 da unika-loka aŭ privata IPv6-spaco ene de la tunelo. La malproksima LAN estas aparta ligilo, atingata per enkursigado kaj plusendado de la tunela finpunkto por vi. Tiuj estas du apartaj segmentoj, do adreso el unu ne estas valida celo sur la alia.
La plusenda regulo estas eksplicita en la normo, ne kapriceco de via kliento: enkursigiloj ne plusendas pakaĵojn kun loka-ligila fonto aŭ celo. Tial la pakaĵo mortas eĉ kiam la enkursiga tabelo aspektas ĝusta. Aldonu itineron por fe80::/64 al la tunelo, kaj normkonforma stako aŭ rifuzas ĝin aŭ akceptas ĝin kaj forĵetas ĉiun kongruan pakaĵon: la amplekso de la celo diras «nur ĉi tiu ligilo», kaj la elira interfaco ne estas tiu ligilo.
Najbara malkovro plifortigas la saman limon. Gastigantoj solvas loka-ligilajn sekvajn saltojn per najbara peto sendita al multelsendo de ligila amplekso kun salta limo 255, do enkursigiloj povas rifuzi ĉion plusenditan. Funkciigi tion trans tunelo signifus prokuri la malkovron por malproksima segmento, kio estas tavol-2 pontado en alia ĉapelo.
Estas pli silenta dua fiasko, kaj ĝi faligas homojn, kiuj tamen provas devigi la itineron: la zono. Kiun ajn zonon vi tajpas loke, ĝi nomas la tunelan interfacon, dum la adreso, kiun vi volas, estas ligita al la interfaco de la malproksima LAN. La du neniam kongruas, do la pakaĵo ne povas esti direktita al la ĝusta interfaco ĉe la malproksima fino.
Kiel la fiasko aspektas praktike
Ilaj eligaĵoj por ampleksa eraro legiĝas kiel enkursiga aŭ fajroŝirma eraro, kaj ĝuste tial homoj pasigas posttagmezon en la malĝusta tavolo.
| 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 |
La tria vico malŝparas la plej multe da tempo, ĉar ssh-kliento sen eligo aspektas kiel problemo de aŭskultanta servo. Se vi havas iun ajn eniron, rigardu la malproksiman flankon kaj konfirmu, ĉu sshd estas ligita al ĉiuj adresoj aŭ nur unu.
Uzu adreson, kiu estis destinita por enkursigado
Por ĉio, al kio vi devas atingi tra la tunelo, uzu la adreson, kiun la servo ricevis ĝuste por tiu celo: tutmondan unuopaĵan adreson, aŭ unikan-lokan adreson el fc00::/7, la intervalon rezervitan ĝuste por ĉi tiu interna kazo. Konfirmu, ke la aŭskultanto vere ligas ĝin, kaj kontrolu la revenan vojon kaj ĉiun fajroŝirman regulon de la gastiganto.
Rigardu la malproksiman gastiganton anstataŭ diveni. ip -6 addr show listigas la ekzistantajn adresojn, kaj ss -6 -ltn listigas, al kio la demono aŭskultas. Servo ligita nur al fe80:: estas atingebla nur el sia propra segmento, kio kutime estas defaŭlta agordo, kiun neniu elektis intence kaj kiun oni povas ŝanĝi kun konsento de la administranto.
Kiam la servo vere ne povas esti religita, levu la ponton al la aplikaĵa tavolo anstataŭ la reta. Relajso sur la malproksima gastiganto, kiu aŭskultas sur enkursigebla adreso kaj konektiĝas al la loka-ligila, solvas la problemon sen etendi iun segmenton:
socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80Ĉi tie la zono sidas sur la ĝusta flanko, sur la gastiganto, kiu vere havas eth0 sur tiu ligilo. Via kliento parolas kun fd00:1:2::10, kiu enkursiĝas normale, kaj la relajso faras la loka-ligilan salton loke. La sama artifiko funkcias por reta fasado de aparato aŭ malnova BMC, kiu anoncas nur loka-ligilan adreson.
Kiam pontado vere estas la respondo, kaj kion kontroli
Iuj instaladoj vere bezonas unu komunan segmenton: aparato, kiu parolas nur loka-ligilan malkovron, aparato, kiu dependas de multelsendo, laboratorio, kiu reproduktas platigitan LAN. Tio estas tavol-2 problemo kaj ĝi bezonas tavol-2 respondon, ekzemple tap-aparaton pontitan al la malproksima interfaco aŭ klientan produkton kun eksplicita ponta reĝimo. Ĝi kostas al vi dissendan kaj multelsendan trafikon tra la tunelo plus najbaran malkovron, kiu devas funkcii de fino al fino.
Ne proksimumu ĝin aldonante fe80::/64 al enkursigita profilo. Tio produktas la plej malbonan staton el ĉiuj: la agordo aspektas finita, la enkursiga tabelo montras eron, kaj ĉiu pakaĵo ankoraŭ estas forĵetata ie inter du stakoj, kiuj ambaŭ kondutas ĝuste.
Kontrolu per la interfaco, ne per ping. ip -6 addr show tun0 diras al vi, ĉu la tunela ligilo formis propran loka-ligilan adreson, kaj ip -6 route get fe80::1%tun0 diras, kion la kerno vere farus kun ampleksa celo. Kiam la kerno diras, ke la celo estas neatingebla sur tiu interfaco, neniu tunela agordo tion ŝanĝos, kaj estas tempo ĉesi redakti la profilon.
Mallonga sinsekvo, kiu solvas la demandon:
- Legu la adreson sur la malproksima gastiganto kaj notu, ĉu ĝi estas fe80:: aŭ enkursigebla prefikso.
- Se ĝi estas fe80::, religu la servon, relajsu sur tiu gastiganto aŭ pontu la segmenton; se ĝi estas enkursigebla, riparu la itineron, la fajroŝirmon aŭ la ligadan adreson.
- Rekontrolu la zonon ĉiufoje, kiam vi retestas, ĉar kopiita komando kutime konservas la malĝustan interfacon.
Fontoj: RFC 4291, IPv6-adresada arĥitekturo.