Voeg een beleidsregel toe met ip rule en hij werkt tot de link verdwijnt; op dat moment is hij gewoon weg. Niets faalde luid: de kerneltoestand veranderde, en geen enkele configuratie-eigenaar wist dat de regel zou moeten bestaan. Dat is het hele verschil tussen een regel die overleeft en een die dat niet doet. Op een host met systemd-networkd is de oplossing de regel een eigenaar geven in plaats van het commando na elke herverbinding opnieuw uit te voeren.

Een regel bestaat alleen als iemand hem bezit

Kernel-routingbeleid is toestand, geen configuratie. Het leeft in het draaiende systeem, en alles wat de interface afbreekt waarvan het afhangt, kan het meenemen. Een shellcommando verandert die toestand en laat geen registratie van de bedoeling achter.

Netwerkbeheerders werken omgekeerd: ze lezen configuratie, passen die toe en passen die opnieuw toe wanneer een link-gebeurtenis de vorige toestand ongeldig maakt. Een regel die in hun configuratie is gedeclareerd, wordt opnieuw aangemaakt, terwijl een regel die ernaast is toegevoegd een vreemd object zonder eigenaar is.

Dat onderscheid heeft een naam in networkd, en het is de moeite waard om het te lezen voordat je iets inschakelt. Vreemde regels worden in recente versies standaard verwijderd, wat mensen verrast die verwachtten dat hun handmatige invoer zou blijven bestaan.

Lees de versie voordat je een instelling vertrouwt

Het eigenaarsgedrag wordt beheerd door een instelling in networkd.conf, en die instelling bestaat niet in oudere systemd-versies. Controleer de geïnstalleerde versie voordat je daaromheen ontwerpt, want een oudere host gedraagt zich anders dan de documentatie die je leest.

Twee waarden tellen. De ene bepaalt of regels die niet in de networkd-configuratie zijn gedeclareerd worden verwijderd, en de andere doet hetzelfde voor routes. Beide gaan over eigenaarschap en niet over de inhoud van het beleid, en beide kiezen in huidige versies standaard het strengere gedrag. Ze globaal uitschakelen houdt elke vreemde regel in leven, wat een veel bredere beslissing is dan één gewenst VPN-beleid declareren.

systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null

Die grep vertelt je wat lokaal is ingesteld en wat de standaard van de leverancier is. Afwezigheid is ook informatie, want het betekent dat de gecompileerde standaard geldt. Schrijf de standaard in je notities, zodat de volgende persoon hem niet opnieuw hoeft te ontdekken.

Declareer de regel en de tabel waarnaar hij wijst

Een regel in een .network-bestand noemt een tabel, en dat is alles wat een naam doet. Hij maakt de routes in die tabel niet aan en controleert niet of ze logisch zijn. De regel zonder de routes declareren levert een beleid op dat verkeer matcht en het daarna laat vallen.

Declareer de routes in hetzelfde bestand, met bereikbare volgende hops en de juiste tabel. Houd de prioriteit in de gedeclareerde regel zodat hij landt waar je hem verwacht in de geordende lijst. Een regel die de verkeerde tabel eerder dan bedoeld bereikt, verandert meer verkeer dan de dienst die je wilde repareren. Lees het fragment hieronder als een vorm en niet als een volledig bestand, want interface-eigenaarschap en de rest van de verbinding moeten er nog steeds zijn.

[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

Herlaad daarna en lees de kerneltoestand terug in plaats van het bestand. Een configuratie die schoon is geparseerd kan nog steeds een regel opleveren die je niet bedoelde, en de twee weergaven komen alleen overeen als de declaratie compleet was.

Kies één eigenaar voor de interface

Twee beheerders op één tunnel zorgen voor een strijd die in beide op een bug lijkt. Een bestaande wg-quick-opzet naar networkd importeren is een migratie en geen toevoeging, en beide laten draaien laat de interface en zijn regels onder twee eigenaren.

Doe de migratie in één keer: stop de oude unit, schakel hem uit, declareer de interface en zijn routes in networkd en herlaad daarna. Controleer dat de oude unit bij het opstarten niet kan terugkomen. Een achtergebleven unit die na een herstart opnieuw activeert, overschrijft de toestand die je net hebt gedeclareerd. Bewaar het oude configuratiebestand tot het nieuwe een herverbinding heeft overleefd, en trek het dan terug.

Eigenaarschap van de markering verdient dezelfde zorg: als een regel overeenkomt met een firewallmarkering, moet iets die markering zetten. Een regel die verwijst naar een markering die niemand zet, is dode configuratie die opzettelijk lijkt.

Oefen de levenscyclusgebeurtenissen

Configuratie is alleen zo goed als zijn gedrag over gebeurtenissen. Haal de link neer, breng hem op, herstart de dienst en vernieuw het adres. Lees na elk daarvan de regellijst en de inhoud van de tabel.

sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd

Het bedoelde resultaat is hetzelfde beleid met eigenaar opnieuw aangemaakt en verouderde toestand teruggetrokken, wat duurzamer is dan na elke herverbinding opnieuw een shellregel toevoegen. Houd één regel in het wijzigingsregister die het bestand noemt dat de regel bezit en de versie die hem ondersteunt. Dan kan de volgende ingenieur het beleid vinden zonder een shellgeschiedenis te doorzoeken. Een regel die niemand bezit, is een regel die weer verloren gaat.

Gerelateerde artikelen