Låt en ip-regel överleva en återanslutning med systemd-networkd
En ip-regel från skalet försvinner vid nästa länkhändelse. Deklarera regeln, tabellen och rutterna i systemd-networkd så att policyn återskapas.
Lägg till en policyregel med ip rule och den fungerar tills länken försvinner; i det ögonblicket är den helt enkelt borta. Inget misslyckades högljutt: kerneltillståndet ändrades och ingen konfigurationsägare visste att regeln skulle finnas. Det är hela skillnaden mellan en regel som överlever och en som inte gör det. På en värd med systemd-networkd är lösningen att ge regeln en ägare i stället för att köra kommandot igen efter varje återanslutning.
En regel finns bara om någon äger den
Kernelns routingpolicy är tillstånd, inte konfiguration. Den lever i det körande systemet, och allt som river ned gränssnittet den är beroende av kan ta den med sig. Ett skalkommando ändrar det tillståndet och lämnar ingen registrering av avsikten.
Nätverkshanterare arbetar tvärtom: de läser konfiguration, tillämpar den och tillämpar den igen när en länkhändelse gör det föregående tillståndet ogiltigt. En regel som deklareras i deras konfiguration återskapas, medan en regel som läggs till bredvid dem är ett främmande objekt utan ägare.
Den skillnaden har ett namn i networkd, och den är värd att läsa innan du aktiverar något. Främmande regler tas bort som standard i nyare versioner, vilket överraskar dem som förväntade sig att deras manuella poster skulle bestå.
Läs versionen innan du litar på en inställning
Ägarhanteringen styrs av en inställning i networkd.conf, och den inställningen finns inte i äldre systemd-utgåvor. Kontrollera den installerade versionen innan du designar runt den, eftersom en äldre värd beter sig annorlunda än dokumentationen du läser.
Två värden spelar roll. Den ena avgör om regler som inte deklareras i networkd-konfigurationen tas bort, och den andra gör samma sak för rutter. Båda handlar om ägande och inte om policyinnehållet, och båda väljer som standard det strängare beteendet i aktuella utgåvor. Slår du av dem globalt hålls varje främmande regel vid liv, vilket är ett mycket bredare beslut än att deklarera en enda önskad VPN-policy.
systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null
Den grep-en berättar vad som är satt lokalt och vad leverantörens standard är. Frånvaro är också information, eftersom det betyder att den kompilerade standarden gäller. Skriv standarden i dina anteckningar så att nästa person inte behöver upptäcka den igen.
Deklarera regeln och tabellen den pekar på
En regel i en .network-fil namnger en tabell, och det är allt ett namn gör. Den skapar inte rutterna i den tabellen och kontrollerar inte om de är vettiga. Att deklarera regeln utan rutterna ger en policy som matchar trafik och sedan släpper den.
Deklarera rutterna i samma fil, med nåbara nästa hopp och rätt tabell. Behåll prioriteten i den deklarerade regeln så att den landar där du förväntar dig i den ordnade listan. En regel som når fel tabell tidigare än avsett ändrar mer trafik än tjänsten du ville reparera. Läs fragmentet nedan som en form och inte som en komplett fil, eftersom gränssnittsägande och resten av anslutningen fortfarande måste finnas.
[RoutingPolicyRule]
Family=ipv4
IPProtocol=tcp
SourcePort=443
Table=100
Priority=1000
[Route]
Destination=10.80.0.0/24
Gateway=10.80.0.1
Table=100
Ladda sedan om och läs kerneltillståndet i stället för filen. En konfiguration som parsades rent kan ändå ge en regel du inte avsåg, och de två vyerna stämmer bara när deklarationen var komplett.
Välj en ägare för gränssnittet
Två hanterare på en tunnel ger en kamp som ser ut som ett fel i båda. Att importera en befintlig wg-quick-konfiguration i networkd är en migrering och inte ett tillägg, och körs båda lämnas gränssnittet och dess regler under två ägare.
Gör migreringen i ett svep: stoppa den gamla enheten, inaktivera den, deklarera gränssnittet och dess rutter i networkd och ladda sedan om. Kontrollera att den gamla enheten inte kan komma tillbaka vid uppstart. En kvarvarande enhet som aktiveras igen efter en omstart skriver över tillståndet du just deklarerade. Behåll den gamla konfigurationsfilen tills den nya har överlevt en återanslutning, och dra sedan tillbaka den.
Ägandet av märket förtjänar samma omsorg: om en regel matchar ett brandväggsmärke måste något sätta det märket. En regel som hänvisar till ett märke som ingen sätter är död konfiguration som ser avsiktlig ut.
Öva livscykelhändelserna
Konfiguration är bara så bra som sitt beteende över händelser. Ta ned länken, upp igen, starta om tjänsten och förnya adressen. Efter var och en av dem, läs regellistan och tabellens innehåll.
sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd
Det avsedda resultatet är samma ägda policy återskapad och föråldrat tillstånd tillbakadraget, vilket är mer hållbart än att lägga till en skalregel igen efter varje återanslutning. Behåll en rad i ändringsloggen som namnger filen som äger regeln och versionen som stöder den. Då kan nästa ingenjör hitta policyn utan att söka i en skalhistorik. En regel som ingen äger är en regel som går förlorad igen.