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:
Name
je jméno síťové karty, kam chceme přiřadit adresu.Address
aGateway
je primární adresa daného rozhranní a ip routeru sítě.DNS
jsou 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.