Keď pridáte prefix IPv6 do tunela medzi lokalitami, paket necestuje tak, ako naznačuje diagram. Miestna brána vezme celý paket IPv6, zašifruje ho a pred neho vloží vonkajšiu hlavičku IP, ktorej rodinu adries určujú adresy koncových bodov, nie to, čo je vnútri. Vzdialená brána túto vonkajšiu hlavičku odstráni a odošle pôvodný paket do svojej LAN, kde je opäť obyčajným paketom IPv6. Vonkajší tunel a vnútorná prevádzka sú dve oddelené konverzácie, ktoré zdieľajú kľúč, pár koncových bodov a nič ďalšie.

Dve hlavičky, dve rodiny adries

V režime tunela IPsec sa vnútorný paket IPv6 stáva nákladom za hlavičkou ESP. Vonkajšia hlavička nesúca tento paket ESP môže byť IPv4 alebo IPv6 a riadi sa local_addrs a remote_addrs. WireGuard robí to isté s menšou ceremóniou: vnútorný paket je náklad datagramu UDP na koncový bod partnera. Obe nechávajú vnútornú hlavičku nedotknutú, a preto ju vzdialená strana môže po dekapsulácii smerovať.

Cesta medzi lokalitami vidí iba UDP 4500, keď IPsec používa priechod NAT, alebo UDP 51820 pre predvolený počúvač WireGuard. Ktorýkoľvek router na ceste môže byť iba IPv4 a prevádzka IPv6 napriek tomu prechádza, pretože sa na tejto ceste nikdy neobjaví ako paket IPv6. To dáva čisté prvé rozdelenie: tcpdump -ni eth0 udp port 51820 ukazuje šifrovanú cestu, tcpdump -ni wg0 ip6 ukazuje vnútornú prevádzku. Rušný vonkajší odposluch s tichým vnútorným znamená, že jadro nevkladá IPv6 do tunela; to je smerovanie alebo politika, nie stav spoja.

Brána tiež znižuje vnútorný Hop Limit pri preposielaní, takže sa koncové body počítajú ako routery na ceste IPv6. Vonkajší počet skokov a vnútorný Hop Limit sa pohybujú nezávisle a paket, ktorý zomrie na vzdialenej bráne, zomrel pri preposielaní, nie pri šifrovaní.

Selektory a AllowedIPs sú zoznam povolení

IKEv2 vyjednáva, ktoré vnútorné prefixy môže child SA niesť. Na strongSwan 5.9 a novších vyzerá ich vypísanie v swanctl.conf takto:

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

Ak vynecháte local_ts a remote_ts, strongSwan ich odvodí z podsietí zvoleného rozhrania. Na hostiteľovi s dual-stack táto skratka často dáva pár iba IPv4: SA vstane a IPv6 je odmietnutá, skôr než sa dostane ku kódu ESP. Vypísanie oboch prefixov robí SA schopnou ich niesť a start_action = trap ju zdvihne pri prvom zodpovedajúcom pakete.

WireGuard má jeden zoznam plniaci dve úlohy. V bloku partnera je AllowedIPs = 2001:db8:bb::/48, fd00:bb::/48 aj trasou nainštalovanou pri odosielaní, aj filtrom uplatneným pri príjme: dešifrovaný paket, ktorého vnútorný zdroj padne mimo zoznamu tohto partnera, je ticho zahodený. wg-quick pridá trasu pre každý záznam, takže blok partnera nižšie nepotrebuje samostatný príkaz 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 zoznamy musia byť zrkadlové: lokalita B prijíma prefix lokality A ako vzdialený selektor a smeruje ho späť, a tunel funguje len vtedy, keď sa oba smery zhodujú. Asymetrický zoznam dáva príznak, ktorý spotrebuje najviac času — zdravý handshake, počítadlá sa hýbu na jednej strane, a ping z A do B, ktorý uspeje, zatiaľ čo nič z B sa do A nedostane.

Preposielanie, trasy a návratový prefix

Linux nepreposiela IPv6, kým nepoviete, a nastavenie platí pre namespace, nie pre rozhranie:

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

Druhá riadka je tá, na ktorú ľudia v návrhoch založených na trasách zabúdajú. IPsec založený na politike inštaluje politiku XFRM zodpovedajúcu prefixom, ale nastavenie založené na trasách s vti6 alebo WireGuard potrebuje skutočnú trasu IPv6 ukazujúcu na toto zariadenie. Uložte sysctl pod /etc/sysctl.d/; inak reštart ticho vráti preposielanie do vypnutého stavu.

Preposielanie má vedľajší účinok, ktorý stojí za to poznať: jadro potom ignoruje oznámenia routerov, ak net.ipv6.conf.<wan>.accept_ra nie je 2, takže brána, ktorej adresa WAN prichádza cez SLAAC, môže stratiť predvolenú trasu vo chvíli, keď preposielanie zapnete. Nastavte accept_ra = 2 na tomto rozhraní v rovnakom súbore a trasa prežije. Jadro lokality B sa tiež musí naučiť 2001:db8:aa::/48 od brány tunela, statickou trasou alebo smerovacím protokolom nad tunelom, inak odpoveď zomrie vnútri vlastnej siete B.

Kontrola v štyroch krokoch, ktorá lokalizuje poruchu

Pracujte v tomto poradí a zastavte sa pri prvom kroku, ktorý zlyhá, pretože každý ďalší krok závisí od predchádzajúcich.

  1. Selektory: swanctl --list-sas by mal ukázať pár prefixov IPv6 na child SA, alebo wg show wg0 allowed-ips vzdialený prefix s čerstvým latest-handshakes.
  2. Trasa jadra: ip -6 route get 2001:db8:bb::10 musí odpovedať zariadením tunela, nie rozhraním WAN.
  3. Vnútorný odposluch: tcpdump -ni wg0 ip6 pri pingovaní medzi skutočnými hostiteľmi LAN. Pakety, ktoré odchádzajú, ale žiadny sa nevracia, ukazujú na trasu alebo firewall B; vôbec žiadne pakety ukazujú späť na krok 1 alebo 2.
  4. Cieľ: na hostiteľovi B ss -6 -ltn potvrdzuje, že služba počúva na IPv6, a miestne počítadlá firewallu ukazujú, či bol paket prijatý alebo zahodený.

MTU patrí do rovnakého priechodu. Routery IPv6 nefragmentujú, takže príliš veľký paket je zahodený a Packet Too Big sa vracia odosielateľovi. Ak handshaky a malé pingy fungujú, ale prenos súboru sa zasekne, zmenšite náklad, kým neprejde: ping -6 -s 1400 -c 3 2001:db8:bb::10. Rozhrania WireGuard majú štandardne MTU 1420 bajtov a IPsec nad IPv4 uberá viac, takže nastavenie vnútorného MTU je lepšie než dúfať v objavenie MTU cesty cez firewall, ktorý zahadzuje ICMPv6.

Režimy zlyhania, ktoré vyzerajú ako problémy firewallu

Najčastejší vôbec nie je firewall: služba sa viaže na 0.0.0.0 namiesto ::, záznam AAAA existuje a klient dostane rýchle odmietnutie cez IPv6, ktoré prehliadač s dual-stack skryje návratom k IPv4. Ak zlyhávajú len niektoré aplikácie, skontrolujte počúvajúcu rodinu, skôr než sa dotknete sady pravidiel.

Druhý je filtrovanie ICMPv6. Neighbor Discovery a Packet Too Big sú súčasťou normálnej prevádzky, nie diagnostiky, a politika, ktorá zahadzuje celé ICMPv6, vytvára tunel, ktorý sa pripojí, overí a potom sa zasekne na čomkoľvek väčšom než malý paket. Povoľte typy, na ktorých cesta závisí, a nechajte počítadlá zapnuté, aby bolo zahodenie vidieť.

Tretí je prefix pridaný do tunela, ale nikdy do adresného plánu lokality, ktorá ho vlastní, takže ho žiadny router neoznamuje a žiadny hostiteľ z neho nemôže odpovedať. Začnite jedným prefixom a jedným párom hostiteľov, preukážte oba smery štyrmi krokmi a potom pridajte zvyšok; pokazený prefix zostane jednou riadkou v konfigurácii namiesto prestavby. Jediná oficiálna referencia, ktorú stojí za to držať otvorenú, je RFC 8200, ktorá definuje hlavičku, ktorú tunel nesie.

Súvisiace články