Ko v tunel med lokacijama dodate predpono IPv6, paket ne potuje tako, kot nakazuje diagram. Krajevna prehodna točka vzame celoten paket IPv6, ga šifrira in pred njega postavi zunanji naslov IP, katerega družino naslovov določajo naslovi končnih točk, ne pa tisto, kar je znotraj. Oddaljena prehodna točka to zunanjo glavo odstrani in prvotni paket posreduje v svoj LAN, kjer je znova običajen paket IPv6. Zunanji tunel in notranji promet sta dva ločena pogovora, ki si delita ključ, par končnih točk in nič drugega.

Dve glavi, dve družini naslovov

V načinu tunela IPsec notranji paket IPv6 postane tovor za glavo ESP. Zunanja glava, ki prenaša ta paket ESP, je lahko IPv4 ali IPv6 in sledi local_addrs in remote_addrs. WireGuard stori enako z manj ceremonialnosti: notranji paket je tovor datagrama UDP na končno točko partnerja. Oba pustita notranjo glavo nedotaknjeno, zato jo oddaljena stran lahko usmeri po dekapsulaciji.

Pot med lokacijama vidi samo UDP 4500, ko IPsec uporablja prehod NAT, ali UDP 51820 za privzetega poslušalca WireGuard. Vsak usmerjevalnik na poti je lahko samo IPv4 in promet IPv6 vseeno preide, ker se na tej poti nikoli ne pojavi kot paket IPv6. To da čisto prvo delitev: tcpdump -ni eth0 udp port 51820 prikazuje šifrirano pot, tcpdump -ni wg0 ip6 prikazuje notranji promet. Zasedeno zunanje zajemanje s tihim notranjim pomeni, da jedro ne vstavlja IPv6 v tunel; to je usmerjanje ali politika, ne stanje povezave.

Prehodna točka tudi zmanjša notranji Hop Limit med posredovanjem, zato se končne točke štejejo kot usmerjevalniki na poti IPv6. Zunanje število skokov in notranji Hop Limit se premikata neodvisno, paket, ki umre na oddaljeni prehodni točki, pa je umrl pri posredovanju, ne pri šifriranju.

Selektorji in AllowedIPs so seznam dovoljenj

IKEv2 se pogaja, katere notranje predpone lahko nosi child SA. V strongSwan 5.9 in novejših je njihov zapis v swanctl.conf videti takole:

children {
  net6 {
    local_ts  = 2001:db8:aa::/48
    remote_ts = 2001:db8:bb::/48
    mode = tunnel
    esp_proposals = aes256gcm16-prfsha384-ecp384
    start_action = trap
  }
}

Če izpustite local_ts in remote_ts, jih strongSwan izpelje iz podomrežij izbranega vmesnika. Na gostitelju z dual-stack ta bližnjica pogosto da par samo IPv4: SA se dvigne in IPv6 je zavrnjen, preden doseže kodo ESP. Zapis obeh predpon naredi SA sposobno, da ju nosi, in start_action = trap jo dvigne ob prvem ustreznem paketu.

WireGuard ima en seznam z dvema nalogama. V bloku partnerja je AllowedIPs = 2001:db8:bb::/48, fd00:bb::/48 hkrati pot, nameščena pri pošiljanju, in filter, uporabljen pri prejemu: dešifriran paket, katerega notranji vir pade izven seznama tega partnerja, je tiho zavržen. wg-quick doda pot za vsak vnos, zato spodnji blok partnerja ne potrebuje ločenega ukaza ip -6 route.

[Interface]
Address = 2001:db8:aa:ff::1/64, fd00:aa:ff::1/64
ListenPort = 51820

[Peer]
PublicKey = <site-b-public-key>
Endpoint = 203.0.113.20:51820
AllowedIPs = 2001:db8:bb::/48, fd00:bb::/48

Oba seznama morata biti zrcalna: lokacija B sprejme predpono lokacije A kot oddaljeni selektor in jo usmeri nazaj, tunel pa deluje le, kadar se obe smeri ujemata. Asimetričen seznam da simptom, ki požre največ časa — zdrav stisk roke, števci se premikajo na eni strani, in ping od A do B, ki uspe, medtem ko nič iz B ne doseže A.

Posredovanje, poti in povratna predpona

Linux ne posreduje IPv6, dokler ne rečete, in nastavitev velja za imenski prostor, ne za vmesnik:

sysctl -w net.ipv6.conf.all.forwarding=1
ip -6 route add 2001:db8:bb::/48 dev wg0
ip -6 route get 2001:db8:bb::10 from 2001:db8:aa::10

Druga vrstica je tista, ki jo ljudje v načrtih, ki temeljijo na poteh, pozabijo. IPsec, ki temelji na politiki, namesti politiko XFRM, ki ustreza predponam, vendar nastavitev, ki temelji na poteh z vti6 ali WireGuard, potrebuje resnično pot IPv6, ki kaže na to napravo. Shranite sysctl pod /etc/sysctl.d/; sicer ponovni zagon tiho vrne posredovanje v izklopljeno stanje.

Posredovanje ima stranski učinek, ki ga je vredno poznati: jedro takrat prezre obvestila usmerjevalnikov, razen če je net.ipv6.conf.<wan>.accept_ra enak 2, zato lahko prehodna točka, katere naslov WAN pride prek SLAAC, izgubi privzeto pot v trenutku, ko omogočite posredovanje. Nastavite accept_ra = 2 na tem vmesniku v isti datoteki in pot preživi. Jedro lokacije B se mora prav tako naučiti 2001:db8:aa::/48 od prehodne točke tunela, s statično potjo ali usmerjevalnim protokolom nad tunelom, sicer odgovor umre znotraj lastnega omrežja B.

Preverjanje v štirih korakih, ki lokalizira prekinitev

Delajte v tem vrstnem redu in se ustavite pri prvem koraku, ki spodleti, ker je vsak naslednji korak odvisen od prejšnjih.

  1. Selektorji: swanctl --list-sas bi moral pokazati par predpon IPv6 na child SA, ali wg show wg0 allowed-ips oddaljeno predpono s svežim latest-handshakes.
  2. Pot jedra: ip -6 route get 2001:db8:bb::10 mora odgovoriti z napravo tunela, ne z vmesnikom WAN.
  3. Notranje zajemanje: tcpdump -ni wg0 ip6 med pinganjem med resničnimi gostitelji LAN. Paketi, ki odidejo, a nobeden se ne vrne, kažejo na pot ali požarni zid B; popolnoma noben paket kaže nazaj na korak 1 ali 2.
  4. Cilj: na gostitelju B ss -6 -ltn potrdi, da storitev posluša na IPv6, lokalni števci požarnega zidu pa kažejo, ali je bil paket sprejet ali zavržen.

MTU sodi v isti prehod. Usmerjevalniki IPv6 ne drobijo, zato je prevelik paket zavržen in Packet Too Big se vrne pošiljatelju. Če stiski rok in majhni pingi delujejo, prenos datoteke pa se ustavi, zmanjšajte tovor, dokler ne gre skozi: ping -6 -s 1400 -c 3 2001:db8:bb::10. Vmesniki WireGuard imajo privzeto MTU 1420 bajtov in IPsec nad IPv4 odvzame več, zato je nastavitev notranjega MTU boljša od upanja na odkrivanje MTU poti skozi požarni zid, ki zavrže ICMPv6.

Načini odpovedi, ki izgledajo kot težave s požarnim zidom

Najpogostejši sploh ni požarni zid: storitev se veže na 0.0.0.0 namesto na ::, zapis AAAA obstaja, odjemalec pa prejme hitro zavrnitev prek IPv6, ki jo brskalnik z dual-stack skrije z vrnitvijo na IPv4. Če spodletijo le nekatere aplikacije, preverite poslušajočo družino, preden se dotaknete nabora pravil.

Drugi je filtriranje ICMPv6. Neighbor Discovery in Packet Too Big sta del običajnega delovanja, ne diagnostike, in politika, ki zavrže ves ICMPv6, ustvari tunel, ki se poveže, overi in se nato ustavi na čemur koli večjem od majhnega paketa. Dovolite vrste, od katerih je odvisna pot, in pustite števce vklopljene, da je zavrženje vidno.

Tretji je predpona, dodana tunelu, a nikoli naslovnemu načrtu lokacije, ki jo ima v lasti, zato je noben usmerjevalnik ne oznani in noben gostitelj ne more odgovoriti z nje. Začnite z eno predpono in enim parom gostiteljev, dokažite obe smeri s štirimi koraki in nato dodajte preostanek; pokvarjena predpona ostane ena vrstica v konfiguraciji namesto prenove. Edini uradni vir, ki ga je vredno imeti odprtega, je RFC 8200, ki določa glavo, ki jo tunel nosi.

Sorodni članki