Dva zdravé výstupy VPN, jedno dlouhé nahrávání už běží a požadavek, aby další spojení použilo druhý tunel. Existují dva způsoby, jak to splnit, a jen jeden z nich je bezpečný na živém gatewayi. Výměna výchozí trasy přesune každý paket, včetně těch, které patří nahrávání. Plánované vypuštění mění volbu pro nová spojení a sledované toky nechává na cestě, na které začaly.

Dva způsoby, jak přepnout výstup

Výměna trasy je jediný příkaz a dá se vrátit během sekund, proto se používá při incidentech. Je také nerozlišující: pakety stávajícího nahrávání najednou odcházejí jiným tunelem, s jinou veřejnou zdrojovou adresou a odděleným překladovým stavem.

Pokud vzdálená strana sleduje toky podle zdrojové adresy, nahrávání může prostě přestat být rozpoznáváno. Vypuštění tomu předchází tím, že rozhodne jednou pro spojení a uloží to, takže staré nahrávání si drží svůj výstup, dokud neskončí. To je celá hodnota cvičení: vzdálená strana nevidí žádnou změnu, kterou by musela vykládat. Dál dostává pakety, které odpovídají spojení, jež už zná.

Cena je složitost: dvě směrovací tabulky, klasifikátor, který běží na správném hooku, a značky, které je třeba sladit se vším ostatním na stroji.

Dejte každému výstupu vlastní tabulku

Vyhraďte směrovací tabulku pro každý výstup a odlišné hodnoty značek nebo bity pro obě volby. Každá tabulka potřebuje trasy odpovídající své roli, ne jen jméno, a potřebuje záměrný výsledek selhání pro chybějící případ. Prázdná tabulka, která tiše propadne do hlavní tabulky je způsob, jak provoz odchází výstupem, který nikdo nezvolil.

ip rule add fwmark 0x10/0x10 table 101
ip rule add fwmark 0x20/0x20 table 102
ip route add default via 192.0.2.1 dev wg-a table 101
ip route add default via 198.51.100.1 dev wg-b table 102

Přidejte na konec každé tabulky trasu blackhole, aby vyhledání bez shody hlasitě selhalo, místo aby uteklo do výchozí hodnoty, kterou jste nezvolili.

Vyberte jednou, u prvního paketu

Klasifikujte poté, co existuje sledování spojení, a před vyhledáním trasy, na kterém záleží. Pro nové, neklasifikované spojení LAN vyberte výstup a uložte ho do stavu spojení. U dalších paketů obnovte uloženou hodnotu do značky paketu, kterou čte politické směrování.

Jemná část je, co znamená nový. Conntrack může stále hlásit NEW pro rané pakety a opakované přenosy, dokud není vidět odpověď, takže klasifikátor, který se opírá jen o tento stav, může přepsat volbu, kterou už udělal. Před přiřazením ověřte, že pro spojení není uložen žádný výstup.

nftables drží značky paketu a spojení odděleně a průvodce metainformacemi dokumentuje explicitní kopírování mezi nimi. Značka spojení se sama nestane značkou paketu, se kterou vaše pravidlo souhlasí, a to je nejčastější důvod, proč pečlivě napsaný klasifikátor nemá žádný účinek.

Omezte obnovu na směr a provoz, který máte na mysli. Použití značky internetového výstupu na vracející se pakety může poslat odpovědi k výstupu místo k LAN a symptomem je jednosměrné spojení, které vypadá jako problém brány firewall. Přečtěte si cestu odpovědi, než se dotknete pravidla firewallu, protože paket se směruje, jen ne zpět k odesílateli.

Čtyři fáze vypuštění

  1. Připravte B bez dotyku A: směrování, předávání, autorizace, NAT a zpáteční cesta. Nainstalujte jeho tabulku a politiku volby přes stávajícího vlastníka konfigurace gatewaye.

  2. Přepněte klasifikátor, aby nová, neklasifikovaná spojení volila B, a uložené volby zůstaly zachovány. Atomická transakce nftables se vyhne oknu, ve kterém je třeba starý stav vyčistit.

  3. Nechte A běžet, dokud jeho toky neskončí. Jeho rozhraní, tabulka, vzdálený výstup a mapování NAT jsou stále součástí těchto toků a úprava pravidla NAT nepřestavuje vazby, které už existují.

  4. Vyřaďte A, když je splněna podmínka vypuštění, posouzená podle stavu spojení a chování aplikace, ne podle jednoho tichého intervalu.

Co vypuštění nemůže slíbit

Požadavek prohlížeče není nové transportní spojení; sdružování dál posílá požadavky po starém. Naopak tok UDP může zestárnout z conntracku a pozdější paket se klasifikuje znovu. Vypuštění sleduje sledované toky, ne představu aplikace o relaci.

Pokud A selže dřív, než jeho toky skončí, uložená značka je nezachrání. Znovu se připojí přes B, nebo se nepřipojí vůbec. Plánované vypuštění kupuje kontinuitu, dokud je původní cesta zdravá; není to replikace stavu mezi nezávislými výstupy.

Ověřte obě poloviny

Před změnou spusťte dlouhotrvající povolené spojení a po ní skutečně nové. Potvrďte, který tunel každé používá a jakou veřejnou zdrojovou adresu vzdálená strana vidí, a pak zkontrolujte, že se vracející provoz vrací.

Nevyprazdňujte tabulku conntracku, aby se nová volba objevila. To ničí právě ten stav, který má vypuštění zachovat, a mění řízenou migraci ve výpadek s čistě vypadajícím testem.

Související články