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 a Gateway 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.