La en ip-regel overleve en gjentilkobling med systemd-networkd
En ip-regel fra skallet forsvinner ved neste linkhendelse. Deklarer regelen, tabellen og rutene i systemd-networkd, slik at policyen gjenopprettes.
Legg til en policyregel med ip rule, og den virker til lenken forsvinner; på det tidspunktet er den rett og slett borte. Ingenting feilet med lyd: kjernetilstanden endret seg, og ingen konfigurasjonseier visste at regelen skulle finnes. Det er hele forskjellen mellom en regel som overlever og en som ikke gjør det. På en vert med systemd-networkd er løsningen å gi regelen en eier i stedet for å kjøre kommandoen på nytt etter hver gjentilkobling.
En regel finnes bare hvis noen eier den
Kjernens rutingpolicy er tilstand, ikke konfigurasjon. Den lever i det kjørende systemet, og alt som river ned grensesnittet den avhenger av, kan ta den med seg. En skallkommando endrer den tilstanden og etterlater ingen registrering av intensjonen.
Nettverksbehandlere jobber motsatt: de leser konfigurasjon, anvender den og anvender den på nytt når en linkhendelse gjør den forrige tilstanden ugyldig. En regel som er deklarert i konfigurasjonen deres, gjenopprettes, mens en regel som er lagt til ved siden av, er et fremmed objekt uten eier.
Den forskjellen har et navn i networkd, og den er verdt å lese før du aktiverer noe. Fremmede regler fjernes som standard i nyere versjoner, noe som overrasker dem som forventet at de manuelle oppføringene skulle bestå.
Les versjonen før du stoler på en innstilling
Eieradferden styres av en innstilling i networkd.conf, og den innstillingen finnes ikke i eldre systemd-utgivelser. Sjekk den installerte versjonen før du designer rundt den, fordi en eldre vert oppfører seg annerledes enn dokumentasjonen du leser.
To verdier betyr noe. Den ene avgjør om regler som ikke er deklarert i networkd-konfigurasjonen fjernes, og den andre gjør det samme for ruter. Begge handler om eierskap og ikke om policyens innhold, og begge velger som standard den strengere atferden i gjeldende utgivelser. Slår du dem av globalt, holder du hver fremmed regel i live, noe som er en langt bredere beslutning enn å deklarere én ønsket VPN-policy.
systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null
Den grep-en forteller deg hva som er satt lokalt og hva leverandørens standard er. Fravær er også informasjon, fordi det betyr at den kompilerte standarden gjelder. Skriv standarden i notatene dine, så den neste personen ikke må gjenoppdage den.
Deklarer regelen og tabellen den peker på
En regel i en .network-fil navngir en tabell, og det er alt et navn gjør. Den oppretter ikke rutene i den tabellen og sjekker ikke om de gir mening. Deklarerer du regelen uten rutene, får du en policy som matcher trafikk og deretter slipper den.
Deklarer rutene i samme fil, med nåbare neste hopp og riktig tabell. Behold prioriteten i den deklarerte regelen, slik at den lander der du forventer i den ordnede listen. En regel som når feil tabell tidligere enn tiltenkt, endrer mer trafikk enn tjenesten du ville reparere. Les fragmentet nedenfor som en form og ikke som en fullstendig fil, fordi grensesnitteierskap og resten av forbindelsen fortsatt må være til stede.
[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
Last deretter inn på nytt og les kjernetilstanden i stedet for filen. En konfigurasjon som ble parset rent, kan likevel gi en regel du ikke hadde tenkt deg, og de to visningene stemmer bare når deklarasjonen var komplett.
Velg én eier for grensesnittet
To behandlere på én tunnel gir en kamp som ser ut som en feil i begge. Å importere et eksisterende wg-quick-oppsett i networkd er en migrering og ikke et tillegg, og kjører begge, blir grensesnittet og reglene liggende under to eiere.
Gjør migreringen i ett slag: stopp den gamle enheten, deaktiver den, deklarer grensesnittet og rutene i networkd, og last deretter inn på nytt. Kontroller at den gamle enheten ikke kan komme tilbake ved oppstart. En gjenværende enhet som aktiveres igjen etter omstart, overskriver tilstanden du nettopp deklarerte. Behold den gamle konfigurasjonsfilen til den nye har overlevd en gjentilkobling, og pensjoner den deretter.
Eierskap av merket fortjener samme omhu: hvis en regel matcher et brannmurmerke, må noe sette det merket. En regel som viser til et merke ingen setter, er død konfigurasjon som ser bevisst ut.
Øv på livssyklushendelsene
Konfigurasjon er bare så god som atferden gjennom hendelser. Ta lenken ned, opp igjen, start tjenesten på nytt og forny adressen. Etter hver av dem, les regellisten og innholdet i tabellen.
sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd
Det tiltenkte resultatet er den samme eide policyen gjenopprettet og utdatert tilstand pensjonert, noe som er mer holdbart enn å legge til en skallregel på nytt etter hver gjentilkobling. Behold én linje i endringsloggen som navngir filen som eier regelen og versjonen som støtter den. Da kan den neste ingeniøren finne policyen uten å lete i en skallhistorikk. En regel ingen eier, er en regel som går tapt igjen.