Lisa ip rule'iga poliitikareegel ja see töötab, kuni link kaob; sel hetkel on see lihtsalt kadunud. Miski ei ebaõnnestunud valjult: kerneli olek muutus ja ükski konfiguratsiooni omanik ei teadnud, et reegel peaks eksisteerima. See ongi kogu vahe reegli vahel, mis jääb püsima, ja selle vahel, mis ei jää. systemd-networkd'iga hostis on lahendus anda reeglile omanik, mitte käivitada käsku uuesti pärast igat taasühendust.

Reegel on olemas ainult siis, kui kellelgi on see omanikuna

Kerneli marsruutimispoliitika on olek, mitte konfiguratsioon. See elab jooksvas süsteemis ja kõik, mis lammutab liidese, millest see sõltub, võib selle kaasa võtta. Kestakäsk muudab seda olekut ega jäta kavatsusest mingit jälge.

Võrguhaldurid töötavad vastupidi: nad loevad konfiguratsiooni, rakendavad seda ja rakendavad uuesti, kui lingisündmus muudab eelmise oleku kehtetuks. Nende konfiguratsioonis deklareeritud reegel luuakse uuesti, samas kui nende kõrvale lisatud reegel on võõras objekt ilma omanikuta.

Sellel eristusel on networkd-is nimi ja seda tasub lugeda enne, kui midagi lubad. Võõrad reeglid eemaldatakse uuemates versioonides vaikimisi, mis üllatab neid, kes ootasid, et nende käsitsi sisestatud kirjed püsivad.

Loe versiooni enne, kui usaldad seadet

Omandikäitumist juhib säte failis networkd.conf ja seda sätet vanemates systemd-i väljalasetes ei ole. Kontrolli paigaldatud versiooni enne selle ümber projekteerimist, sest vanem host käitub teisiti kui dokumentatsioon, mida loed.

Kaks väärtust loevad. Üks otsustab, kas reeglid, mida networkd-i konfiguratsioonis ei deklareerita, eemaldatakse, ja teine teeb sama marsruutide puhul. Mõlemad puudutavad omandit, mitte poliitika sisu, ja mõlemad valivad praegustes väljalasetes vaikimisi rangema käitumise. Nende globaalne väljalülitamine hoiab iga võõra reegli elus, mis on palju laiem otsus kui ühe soovitud VPN-poliitika deklareerimine.

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

See grep ütleb sulle, mis on lokaalselt seatud ja mis on tarnija vaikeväärtus. Puudumine on samuti informatsioon, sest see tähendab, et kehtib kompileeritud vaikeväärtus. Kirjuta vaikeväärtus märkmetesse, et järgmine inimene ei peaks seda uuesti avastama.

Deklareeri reegel ja tabel, millele see osutab

Reegel .network-failis nimetab tabelit ja see on kõik, mida nimi teeb. See ei loo marsruute selle tabeli sees ega kontrolli, kas need on mõistlikud. Reegli deklareerimine ilma marsruutideta annab poliitika, mis sobitab liikluse ja seejärel viskab selle ära.

Deklareeri marsruudid samas failis, kättesaadavate järgmiste hüpetega ja õige tabeliga. Hoia prioriteet deklareeritud reeglis, et see maanduks järjestatud loendis sinna, kuhu ootad. Reegel, mis jõuab valesse tabelisse varem kui kavatsetud, muudab rohkem liiklust kui teenus, mida tahtsid parandada. Loe allolevat fragmenti kujuna, mitte täieliku failina, sest liidese omand ja ülejäänud ühendus peavad ikka olemas olema.

[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

Seejärel laadi uuesti ja loe kerneli olekut, mitte faili. Puhtalt parsitud konfiguratsioon võib ikkagi anda reegli, mida sa ei kavatsenud, ja kaks vaadet langevad kokku ainult siis, kui deklaratsioon oli täielik.

Vali liidesele üks omanik

Kaks haldurit ühel tunnelil tekitavad kakluse, mis näeb mõlemas välja nagu viga. Olemasoleva wg-quick-seadistuse importimine networkd-i on migratsioon, mitte lisand, ja mõlema käitamine jätab liidese ja selle reeglid kahe omaniku alla.

Tee migratsioon ühe hooga: peata vana unit, keela see, deklareeri liides ja selle marsruudid networkd-is, seejärel laadi uuesti. Kontrolli, et vana unit ei saa alglaadimisel tagasi tulla. Ülejäänud unit, mis pärast taaskäivitust uuesti aktiveerub, kirjutab üle oleku, mille just deklareerisid. Hoia vana konfiguratsioonifaili seni, kuni uus on taasühenduse üle elanud, ja siis võta see kasutusest maha.

Märgi omand väärib sama hoolt: kui reegel sobib tulemüüri märgiga, peab keegi selle märgi seadma. Reegel, mis viitab märgile, mida keegi ei sea, on surnud konfiguratsioon, mis näeb sihilik välja.

Harjuta elutsükli sündmusi

Konfiguratsioon on nii hea, kui hea on selle käitumine sündmuste lõikes. Võta link alla, too üles, taaskäivita teenus ja uuenda aadress. Pärast igaüht loe reeglite loendit ja tabeli sisu.

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

Kavatsetud tulemus on sama omanikuga poliitika uuesti loodud ja aegunud olek kasutusest võetud, mis on vastupidavam kui kestareegli uuesti lisamine pärast igat taasühendust. Hoia muudatuste registris üks rida, mis nimetab reegli omanikfaili ja seda toetava versiooni. Siis leiab järgmine insener poliitika ilma kestaajalugu otsimata. Reegel, millel pole omanikku, on reegel, mis läheb jälle kaduma.

Seotud artiklid