Zachovejte pravidlo ip rule i po opětovném připojení se systemd-networkd
Pravidlo ip zadané v shellu zmizí při další události linky. Deklarujte pravidlo, jeho tabulku a trasy v systemd-networkd, aby se politika znovu vytvořila.
Přidejte pravidlo politiky pomocí ip rule a funguje, dokud linka nezmizí; v tu chvíli prostě není. Nic nahlas neselhalo: stav jádra se změnil a žádný vlastník konfigurace nevěděl, že pravidlo má existovat. To je celý rozdíl mezi pravidlem, které přežije, a takovým, které ne. Na hostiteli se systemd-networkd je řešením dát pravidlu vlastníka, místo abyste příkaz spouštěli znovu po každém připojení.
Pravidlo existuje jen tehdy, když ho někdo vlastní
Směrovací politika jádra je stav, nikoli konfigurace. Žije v běžícím systému a cokoli, co strhne rozhraní, na kterém závisí, ho může vzít s sebou. Příkaz v shellu tento stav mění a nezanechává záznam o záměru.
Správci sítě pracují obráceně: čtou konfiguraci, aplikují ji a znovu ji aplikují, když událost linky zneplatní předchozí stav. Pravidlo deklarované v jejich konfiguraci se znovu vytvoří, zatímco pravidlo přidané vedle nich je cizí objekt bez vlastníka.
Tento rozdíl má v networkd jméno a stojí za přečtení, než cokoli zapnete. Cizí pravidla se v novějších verzích ve výchozím nastavení odstraňují, což překvapí ty, kdo čekali, že jejich ruční zápisy vydrží.
Přečtěte si verzi, než nastavení uvěříte
Chování vlastnictví řídí nastavení v networkd.conf a toto nastavení ve starších verzích systemd neexistuje. Ověřte nainstalovanou verzi, než kolem něj budete navrhovat, protože starší hostitel se chová jinak než dokumentace, kterou čtete.
Na dvou hodnotách záleží. Jedna určuje, zda se odstraňují pravidla nedeklarovaná v konfiguraci networkd, druhá totéž dělá pro trasy. Obě se týkají vlastnictví, nikoli obsahu politiky, a obě ve výchozím stavu na současných verzích volí přísnější chování. Vypnutí obou globálně udrží každé cizí pravidlo živé, což je mnohem širší rozhodnutí než deklarovat jednu zamýšlenou politiku VPN.
systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null
Tento grep vám řekne, co je nastaveno lokálně a co je výchozí hodnota dodavatele. Nepřítomnost je také informace, protože znamená, že platí zkompilovaná výchozí hodnota. Zapište si ji do poznámek, aby ji příští člověk nemusel znovu objevovat.
Deklarujte pravidlo a tabulku, na kterou ukazuje
Pravidlo v souboru .network pojmenuje tabulku a to je vše, co jméno dělá. Nevytváří trasy uvnitř této tabulky a nekontroluje, zda dávají smysl. Deklarace pravidla bez tras vytvoří politiku, která provoz přiřadí a potom ho zahodí.
Deklarujte trasy ve stejném souboru, s dosažitelnými následujícími skoky a správnou tabulkou. Ponechte prioritu v deklarovaném pravidle, aby se v seřazeném seznamu umístilo tam, kde očekáváte. Pravidlo, které dosáhne špatné tabulky dřív, než je zamýšleno, mění víc provozu než služba, kterou jste chtěli opravit. Čtěte fragment níže jako tvar, nikoli jako úplný soubor, protože vlastnictví rozhraní a zbytek spojení tam stále musí být.
[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
Pak znovu načtěte a přečtěte stav jádra, ne soubor. Konfigurace, která se čistě naparsovala, může přesto vytvořit pravidlo, které jste nezamýšleli, a oba pohledy se shodují jen tehdy, když byla deklarace úplná.
Vyberte jednoho vlastníka rozhraní
Dva správci na jednom tunelu vyvolají souboj, který vypadá jako chyba v obou. Import existujícího nastavení wg-quick do networkd je migrace, nikoli přidání, a běh obou nechává rozhraní a jeho pravidla pod dvěma vlastníky.
Proveďte migraci najednou: zastavte starou jednotku, zakažte ji, deklarujte rozhraní a jeho trasy v networkd, pak znovu načtěte. Ověřte, že stará jednotka nemůže při startu ožít. Zbytková jednotka, která se po restartu znovu aktivuje, přepíše stav, který jste právě deklarovali. Ponechte starý konfigurační soubor, dokud nový nepřežije opětovné připojení, a potom ho vyřaďte.
Vlastnictví značky si zaslouží stejnou péči: pokud pravidlo odpovídá značce firewallu, někdo musí tuto značku nastavit. Pravidlo odkazující na značku, kterou nikdo nenastavuje, je mrtvá konfigurace, která vypadá záměrně.
Nacvičte události životního cyklu
Konfigurace je jen tak dobrá, jak dobré je její chování napříč událostmi. Sundejte linku, zvedněte ji, restartujte službu a obnovte adresu. Po každé z nich přečtěte seznam pravidel a obsah tabulky.
sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd
Zamýšleným výsledkem je stejná politika s vlastníkem znovu vytvořená a zastaralý stav vyřazen, což je trvanlivější než znovu přidávat pravidlo ze shellu po každém připojení. Ponechte v záznamu změn jeden řádek, který pojmenuje soubor vlastnící pravidlo a verzi, jež ho podporuje. Pak příští inženýr najde politiku bez hledání v historii shellu. Pravidlo, které nikdo nevlastní, je pravidlo, které se znovu ztratí.