Nieuwe verbindingen op een nieuwe VPN-uitgang, oude stromen blijven met rust
Een geplande drain verplaatst alleen ongeclassificeerde stromen. Vergelijk dat met een routewissel, en bekijk de markeringen, tabellen en conntrack-status die het laten werken.
Twee gezonde VPN-uitgangen, één lange upload die al loopt, en de eis dat de volgende verbinding de andere tunnel gebruikt. Er zijn twee manieren om dat te vervullen, en slechts één ervan is veilig op een live gateway. De standaardroute wisselen verplaatst elk pakket, ook de pakketten die bij de upload horen. Een geplande drain verandert de keuze voor nieuwe verbindingen en laat de gevolgde stromen op het pad waarop ze begonnen.
Twee manieren om een uitgang te wisselen
De routewissel is één commando en binnen seconden terug te draaien, daarom wordt hij tijdens incidenten gebruikt. Hij is ook ongedifferentieerd: pakketten van de bestaande upload verlaten plotseling een andere tunnel, met een ander openbaar bronadres en een aparte vertaalstatus.
Als de verre kant stromen op bronadres volgt, kan de upload simpelweg niet meer worden herkend. De drain voorkomt dat door de beslissing één keer per verbinding te nemen en op te slaan, zodat de oude upload zijn uitgang houdt tot hij klaar is. Dat is de hele waarde van de oefening: de verre kant ziet geen verandering die hij moet interpreteren. Hij blijft pakketten ontvangen die bij de verbinding passen die hij al kent.
De prijs is complexiteit: twee routingtabellen, een classificator die op de juiste hook draait, en markeringen die moeten worden afgestemd met alles op de machine wat ze gebruikt.
Geef elke uitgang zijn eigen tabel
Reserveer een routingtabel per uitgang en verschillende markeringswaarden of bits voor de twee keuzes. Elke tabel heeft de routes nodig die bij zijn rol passen, niet alleen een naam, en hij heeft een bewuste faaluitkomst nodig voor het ontbrekende geval. Een lege tabel die stil doorvalt naar de hoofdtabel — zo verlaat verkeer een uitgang die niemand koos.
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 102Voeg een blackhole-route toe aan het einde van elke tabel, zodat een opzoeking zonder overeenkomst luidruchtig faalt in plaats van te ontsnappen naar een standaard die je niet koos.
Kies één keer, bij het eerste pakket
Classificeer nadat verbindingsregistratie bestaat en vóór de routeopzoeking die ertoe doet. Voor een nieuwe, ongeclassificeerde LAN-verbinding kies je de uitgang en slaat die op in de verbindingsstatus. Bij latere pakketten herstel je de opgeslagen waarde in de pakketmarkering die policy routing leest.
Het subtiele deel is wat nieuw betekent. Conntrack kan nog steeds NEW melden voor vroege pakketten en hertransmissies voordat een antwoord is gezien, dus een classificator die alleen op die status afgaat, kan een keuze overschrijven die hij al maakte. Controleer dat er geen uitgang voor de verbinding is opgeslagen voordat je er een toewijst.
nftables houdt pakket- en verbindingsmarkeringen gescheiden, en de handleiding over metainformatie documenteert de expliciete kopie ertussen. Een verbindingsmarkering wordt niet vanzelf de pakketmarkering waar je regel op past, en dat is de meest voorkomende reden dat een zorgvuldig geschreven classificator geen effect heeft.
Beperk het herstel tot de richting en het verkeer die je bedoelt. Een internet-uitgangsmarkering op terugkerende pakketten toepassen kan antwoorden naar de uitgang sturen in plaats van naar de LAN, en het symptoom is een eenrichtingsverbinding die op een firewallprobleem lijkt. Lees het antwoordpad voordat je een firewallregel aanraakt, want het pakket wordt gerouteerd, alleen niet terug naar de afzender.
Vier fasen van een drain
Bereid B voor zonder A aan te raken: routing, doorsturen, autorisatie, NAT en het terugpad. Installeer de tabel en het selectiebeleid via de bestaande configuratie-eigenaar van de gateway.
Schakel de classificator om zodat nieuwe, ongeclassificeerde verbindingen B kiezen, met behoud van opgeslagen keuzes. Een atomaire nftables-transactie voorkomt een venster waarin oude status moet worden gewist.
Laat A draaien terwijl de stromen afronden. De interface, tabel, verre uitgang en NAT-mappings maken nog deel uit van die stromen, en het bewerken van een NAT-regel bouwt bestaande bindingen niet opnieuw op.
Haal A uit bedrijf wanneer aan de drainvoorwaarde is voldaan, beoordeeld op verbindingsstatus en applicatiegedrag in plaats van één rustig interval.
Wat een drain niet kan beloven
Een browserverzoek is geen nieuwe transportverbinding; pooling blijft verzoeken over de oude sturen. Omgekeerd kan een UDP-stroom uit conntrack verouderen en een later pakket wordt opnieuw geclassificeerd. De drain volgt gevolgde stromen, niet het idee van een applicatie over een sessie.
Als A uitvalt voordat de stromen klaar zijn, redt de opgeslagen markering ze niet. Ze verbinden opnieuw via B, of ze verbinden helemaal niet opnieuw. Een geplande drain koopt continuïteit zolang het oorspronkelijke pad gezond is; het is geen statusreplicatie tussen onafhankelijke uitgangen.
Verifieer beide helften
Start een langdurige toegestane verbinding vóór de wijziging en een werkelijk nieuwe erna. Bevestig welke tunnel elke gebruikt en welk openbaar bronadres de verre kant ziet, en controleer dan dat het retourverkeer terugkomt.
Leeg de conntrack-tabel niet om de nieuwe keuze te laten verschijnen. Dat vernietigt precies de status die de drain hoort te bewaren, en het maakt van een gecontroleerde migratie een storing met een schoon ogende test.