Fă regula ip să supravieţuiască unei reconectări cu systemd-networkd
O regulă ip creată din shell dispare la următorul eveniment de legătură. Declară regula, tabelul ei şi rutele în systemd-networkd pentru ca politica să fie recreată.
Adaugă o regulă de politică cu ip rule şi funcţionează până când legătura dispare; în acel moment pur şi simplu nu mai există. Nimic nu a eşuat zgomotos: starea nucleului s-a schimbat, iar niciun proprietar de configuraţie nu ştia că regula ar trebui să existe. Aceasta este toată diferenţa dintre o regulă care supravieţuieşte şi una care nu. Pe o gazdă cu systemd-networkd, soluţia este să dai regulii un proprietar, nu să rulezi comanda din nou după fiecare reconectare.
O regulă există doar dacă cineva o deţine
Politica de rutare a nucleului este stare, nu configuraţie. Trăieşte în sistemul care rulează, iar orice dărâmă interfaţa de care depinde o poate lua cu sine. O comandă din shell schimbă acea stare şi nu lasă nicio urmă a intenţiei.
Managerii de reţea lucrează invers: citesc configuraţia, o aplică şi o aplică din nou când un eveniment de legătură invalidează starea anterioară. O regulă declarată în configuraţia lor este recreată, în timp ce o regulă adăugată alături este un obiect străin fără proprietar.
Această distincţie are un nume în networkd şi merită citită înainte de a activa ceva. Regulile străine sunt eliminate implicit în versiunile recente, ceea ce îi surprinde pe cei care se aşteptau ca intrările lor manuale să rămână.
Citeşte versiunea înainte de a te încrede într-o setare
Comportamentul de proprietate este controlat de o setare din networkd.conf, iar acea setare nu există în versiunile mai vechi de systemd. Verifică versiunea instalată înainte de a proiecta în jurul ei, pentru că o gazdă mai veche se comportă altfel decât documentaţia pe care o citeşti.
Două valori contează. Una decide dacă regulile nedeclarate în configuraţia networkd sunt eliminate, iar cealaltă face acelaşi lucru pentru rute. Ambele privesc proprietatea, nu conţinutul politicii, şi ambele aleg implicit comportamentul mai strict în versiunile actuale. Dezactivarea lor globală menţine vie fiecare regulă străină, ceea ce este o decizie mult mai largă decât declararea unei singure politici VPN dorite.
systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null
Acel grep îţi spune ce este setat local şi care este valoarea implicită a furnizorului. Absenţa este şi ea informaţie, pentru că înseamnă că se aplică valoarea compilată. Notează valoarea implicită ca următoarea persoană să nu o descopere din nou.
Declară regula şi tabelul către care indică
O regulă într-un fişier .network numeşte un tabel, şi atât face un nume. Nu creează rutele din acel tabel şi nu verifică dacă au sens. Declararea regulii fără rute produce o politică ce potriveşte traficul şi apoi îl aruncă.
Declară rutele în acelaşi fişier, cu salturi următoare accesibile şi tabelul corect. Păstrează prioritatea în regula declarată ca să ajungă unde te aştepţi în lista ordonată. O regulă care ajunge la tabelul greşit mai devreme decât s-a intenţionat schimbă mai mult trafic decât serviciul pe care voiai să-l repari. Citeşte fragmentul de mai jos ca o formă şi nu ca un fişier complet, pentru că proprietatea interfeţei şi restul conexiunii trebuie să fie încă prezente.
[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
Apoi reîncarcă şi citeşte starea nucleului, nu fişierul. O configuraţie analizată curat poate produce totuşi o regulă pe care nu ai intenţionat-o, iar cele două vederi coincid doar când declaraţia a fost completă.
Alege un singur proprietar pentru interfaţă
Doi manageri pe un singur tunel produc o ceartă care arată ca un defect în ambele. Importarea unei configuraţii wg-quick existente în networkd este o migrare şi nu o adăugare, iar rularea ambelor lasă interfaţa şi regulile ei sub doi proprietari.
Fă migrarea dintr-o singură trecere: opreşte unitatea veche, dezactiveaz-o, declară interfaţa şi rutele ei în networkd, apoi reîncarcă. Verifică faptul că unitatea veche nu poate reveni la pornire. O unitate rămasă care se reactivează după o repornire suprascrie starea pe care tocmai ai declarat-o. Păstrează fişierul de configuraţie vechi până când cel nou supravieţuieşte unei reconectări, apoi retrage-l.
Proprietatea mărcii merită aceeaşi grijă: dacă o regulă se potriveşte cu o marcă de firewall, ceva trebuie să seteze acea marcă. O regulă care face referire la o marcă pe care nimeni nu o setează este configuraţie moartă care pare deliberată.
Exersează evenimentele ciclului de viaţă
Configuraţia valorează cât comportamentul ei de-a lungul evenimentelor. Scoate legătura, ridic-o, reporneşte serviciul şi reînnoieşte adresa. După fiecare, citeşte lista de reguli şi conţinutul tabelului.
sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd
Rezultatul dorit este aceeaşi politică cu proprietar recreată şi starea învechită retrasă, ceea ce este mai durabil decât să adaugi din nou o regulă din shell după fiecare reconectare. Păstrează o linie în registrul de modificări care numeşte fişierul proprietar al regulii şi versiunea care o susţine. Atunci următorul inginer poate găsi politica fără să caute într-un istoric de shell. O regulă pe care nimeni nu o deţine este o regulă care se va pierde din nou.