Vem äger adressen, rutten, DNS:en och brandväggen på en Linux-VPN?
En Linux-VPN behöver en enda myndighet per objekt: enhet, adress, rutter, DNS, brandvägg. Skriv ner kartan och definiera sedan vad uppstart, återanslutning och nedmontering återställer.
Två skript som slåss om samma rutt är den vanliga formen av ett Linux-VPN-problem som registreras som ett routingfel. En komponent skapar tunnelenheten, en annan lägger till en standardrutt, en tredje skriver om resolverkonfigurationen och en fjärde laddar om brandväggsregler. Vilken som helst av dem kan ångra en annans arbete, och vinnaren är helt enkelt den som kördes sist. Frågan som är värd att besvara är inte vilket paket som ska installeras, utan vilken komponent som har befogenhet över varje del av tillståndet.
Skriv ner den kartan en gång, och de flesta återanslutningsfel slutar vara mystiska. Fyra objekt spelar roll: enheten och dess adresser, rutterna och policyreglerna, DNS-konfigurationen och brandväggen.
Enheten och dess adresser
En tunnelenhet skapas antingen av en hanterare som känner till profilen eller av en daemon som någon startade för hand. Båda arrangemangen fungerar för sig; att blanda dem gör det inte. Om NetworkManager äger profilen, låt den också äga enheten, och starta inte en ohanterad OpenVPN-process mot samma tunnelnamn.
Anteckna vem som tar bort enheten när sessionen slutar. En enhet som överlever sin session är den vanligaste källan till inaktuella adresser och till förvirringen som följer.
Rutter och policyregler
Det är på rutterna som ägarkonflikter gör synlig skada. En anslutningshanterare installerar en standardrutt för tunneln plus en mer specifik rutt för fjärrnätverket; ett handskrivet skript lägger sedan till sin egen standardrutt med ett annat mått och vinner eller förlorar tyst beroende på timingen. Bestäm vilka poster som är anslutningsbundna, vilka som är permanent policy och vilken komponent som uppdaterar dem efter en återanslutning. Håll sedan de andra komponenterna utanför den tabellen.
Policyregler förtjänar samma klarhet, för en regel som pekar på en tabell som ingen fyller skapar ett svart hål som ser exakt ut som en död tunnel. Om en regel finns för att tvinga trafik någonstans måste tabellen den väljer underhållas av samma ägare.
DNS är alltid en separat ägare
En resolver-daemon kör som sin egen process under sin egen identitet, så den ärver inte tunnelns routingbeslut av misstag. När VPN:en trycker ut DNS-servrar måste något översätta det till en konfiguration per länk som resolvern respekterar, och något måste ta bort den efteråt.
Myten här är att det att skriva en namnserver i profilen ändrar vart frågorna går. Det ändrar vad resolvern får veta, inte vilken socket resolvern använder uppströms. Testa med en fråga plus en ruttuppslagning i stället för att lita på filen.
Brandväggens tillstånd, och vem som återställer det
Brandväggsregler är det objekt som oftast skrivs över på en VPN-värd. En hanterare kan lägga till NAT- eller vidarebefordringsregler per anslutning, medan en brandväggstjänst vid uppstart laddar om en sparad regeluppsättning och raderar dem. Välj en enda myndighet för policyn och gör den andra till konsument av den, eller acceptera att en omstart tyst ändrar beteendet. Anslutningsbundna undantag hör hemma i en fil som samma ägare laddar, inte i ett iptables-kommando som skrivs in under felsökning.
Om regler måste överleva en återanslutning, säg det uttryckligen. Om inte, säg det också, för nästa ingenjör kommer att anta det bekvämare svaret.
Livscykel: uppstart, återanslutning, nedmontering
Ge vart och ett av de tre ögonblicken en ägare. Vid uppstart, bestäm vad som förbereder förutsättningarna och i vilken ordning. Vid en mjuk omstart, kom ihåg att enheten kan överleva medan sessionstillståndet inte kan, så en validerare måste köra i stället för en skapare. Vid nedmontering, ta bort bara det som denna anslutning skapade, för att återställa varje rutt eller tömma hela brandväggen är inte samma sak som att ta en tunnel ur drift.
För observation visar ip monitor link address route kärnändringar allteftersom de sker, men det rapporterar händelser snarare än avsikt: en borttagen rutt säger ingenting om vilken process som tog bort den. Para ihop det med ägarkartan, och en förvirrande nedstängning blir en kort lista med kandidater.
Undantag har också ett pris. Att markera en hel enhetsklass som ohanterad för att undkomma en konflikt lämnar det tillståndet till ingen, vilket är ett beslut snarare än en rättelse.