Nastavení sítě pomocí systemd-networkd
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 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á.
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.