Nedávno mě v diskusi překvapila otázka na nastavení statických rout v systemd-networkd. Na otázce samotné nic špatného není, ale kreace, co jsou někteří schopní poradit, mě trochu děsí. Opravdu není nutné kvůli nastavení sítě dávat příkazy do rc.local, nebo nedejbože do cronu (@reboot).
Pojdme si tedy ukázat, jaké jsou možnosti nastavení sítě v systemd-networkd.
Předpokládám, že služby systemd-networkd (a případně systemd-resolved) jsou již aktivní.
Nastavení statické IP
Vytvoříme soubor /etc/systemd/network/10-static.network s obsahem:
[Match]
Name=eth0
[Network]
Address=a.b.c.d/e
Gateway=a.b.c.x
DNS=abcd efgh
kde:
Nameje jméno síťové karty, kam chceme přiřadit adresu.AddressaGatewayje primární adresa daného rozhranní a ip routeru sítě.DNSjsou adresy resolverů.
Pokud chceme na síťovku přiřadit více adress, stačí jen zopakovat Address tolikrát, kolik máme adres.
Po restartu služby systemd-networkd by měla být adresa přiřazena, což zkontrolujeme pomocí příkazu
ip address show
nebo zkráceně:
ip a
Podobně můžeme získat jména všech síťových rozhranní pomocí:
ip link show
nebo opět jen
ip l
Statické routy
Dostáváme se k dotazu z poradny. Jak přidat do konfigurace sítě statickou routu?
Jednoduše, do výše uvedeného souboru /etc/systemd/network/10-static.network přidáme sekci:
[Route]
Destination=a.b.c.d/e
Gateway=w.x.y.z
A po restartu služby opět zkontrolujeme pomocí:
ip route
nebo
ip r
Sekcí Route můžeme mít v konfiguračním souboru tolik, kolik je potřeba.
Kompletní znění konfiguračního souboru
Kompletní konfigurační soubor pro síťovku se dvěma adresami a jednou statickou routou potom může vypadat třeba takto:
[Match]
Name=br0
[Network]
Address=xxx/29
Gateway=xxx
Address=192.168.xxx/24
DNS=192.168.xxx 192.168.xxx
[Route]
Destination=10.0.0.0/8
Gateway=192.168.xxx
Nastavení bridge
Tohle už přesahuje téma dotazu v poradně, ale když už je ve výše uvedeném konfiguračním souboru uvedené jméno br0, tedy rozhranní typu bridge, tak to doplním.
Bridge v systemd-networkd můžeme definovat opět velmi snadno. V adresáři /etc/systemd/network vytvoříme soubor 10-br0.netdev s obsahem:
[NetDev]
Name=br0
Kind=bridge
Tím jsme vytvořili bridge, do kterého bychom chtěli zapojit nějaké rozhranní. Vytvoříme tedy další soubor, třeba 10-eth0.network:
[Match]
Name=eth0
[Network]
Bridge=br0
Tímto jsme systemd-networkd sdělili, že síťovka eth0 je součástí bridge br0.
Pomocí výše uvedeného příkladu jsme bridgové síťovce nastavili ip. Po restartu služby je vše nastaveno. Do bridge teď můžeme například připojovat virtuální síťovky kontejnerů.
Nastavení bridge můžeme zkontrolovat příkazem:
bridge link
Jehož výstup bohužel vůbec není tak pěkný jako v případě zastaralého
brctl show
(Zastaralé příkazy nutno používat jen s maximální opatrností!)
Pořadí souborů
Systemd-networkd načítá konfigurace z několika umístění:
/etc/systemd/network/run/systemd/network/lib/systemd/network
Soubory z těchto umístění jsou seřazeny dle abecedy a v tomto pořadí vykonávány. Soubory stejného jména mají přednost dle adresáře, ve kterém jsou umístěny, ve výše uvedeném pořadí.
V Debianu, v době psaní tohoto článku, jsou v adresáři /lib/systemd/network umístěny jen soubory pro aktivaci DHCP v kontejneru, pro snadnější nastavení sítě v nspawn:
80-container-host0.network
Pokud tedy v kontejneru nechceme DHCP, ale potřebujeme kontejneru přiřadit statickou adresu, musíme vytvořit soubor jehož jméno se v abecedním uspořádání dostane před 80-, např. /etc/systemd/network/10-static.network.
Toto mě v minulosti stálo mnoho času a není to zcela zjevné. Konfiguraci můžeme mít zcela správně, ale ve špatně pojmenovaném souboru a místo vašeho nastavení se aplikuje DHCP. Což naštve.
Restart služby
Ještě poznámka úplně na konec k restartu služby networkd. Aktuálně služba pouze přidává a mění adresy definované v konfiguračních souborech. Co není definované, na to nesahá.
Restart provedeme příkazem:
systemctl restart systemd-networkd
Což má za následek to, že pokud nějakou adresu z konfigurace odebereme, tak zůstane přiřazena i po restartu. Musíme ji tedy odstranit ručně (ip a del ...).
Lze předpokládat, že toto chování se časem změní, ale v současnosti je na to potřeba dávat pozor.