Nixos - přidělování IP adres na rozhraní

Po restartu mi nixos přestal přidělovat IP adresy na rozhraní. V konfiguraci mám něco jako

  networking.interfaces.venet0.ipv6.addresses = [
    { address = "2a03:3b40:101:6f:34e5:ddde:c1d3:7ba5";  prefixLength = 128; }
    { address = "2a03:3b40:100::1:218";  prefixLength = 128; }
    ...
   ]

Služba, která to dělá, vypíše

sudo systemctl status network-addresses-venet0.service 
...
adding address 2a03:3b40:101:6f:34e5:ddde:c1d3:7ba5/64... done
adding address 2a03:3b40:100::1:218/128... 'ip addr add 2a03:3b40:100::1:218/128 dev venet0' failed: Error: ipv6: address already assigned.

Službu vygeneruje nixos, ve zdrojáku vidím grep na File exists. Google říká, že ip addr add někdy vrací
RTNETLINK answers: File exists

Myslím si, že přidělování přestalo fungovat, protože se po nějaké aktualizaci změnila chybová hláška a nixos s tím nepočítá. Dává to smysl? Přijde mi to tak, ale nenašel jsem report, a nezdá se mi pravděpodobné, že bych byl první, kdo na to narazí.

Dokážu ty adresy přidat ručně / odfiltrovat duplicity, ale zajímalo by mě, proč to přestalo fungovat.

Nastavení sítě je ve vpsadminos.nix, který máš mít v konfiguraci importovaný. Nic navíc není potřeba řešit, obsahuje to službu, co nahodí IP adresy podle vpsAdminu.

vpsadminos.nix importovaný mám, adresy z VPSadminu se mi načítají. Nastavenou mám /64 adresu

    inet6 2a03:3b40:101:6f::1/64 scope global 
       valid_lft forever preferred_lft forever

Na jednotlivé vhosty v nginxu přiděluju IP adresy z daného rozsahu (např. 2a03:3b40:101:6f::b00:dacc). Pokud je explicitně nepřidám na rozhraní, skončí nginx na

bind() to [2a03:3b40:101:6f::b00:dacc]:80 failed (99: Cannot assign requested address)

Po ip addr add 2a03:3b40:101:6f::b00:dacc dev venet0 naběhne.

Měl bych to dělat jinak?

Aha, zítra se na to zkusím podívat, kombinovat jsem to nezkoušel. Jakou máš verzi NixOS?

nixos-unstable (24.05.20240410.1042fd8 (Uakari) na #24008

Používám to tak už delší dobu, cíl byl generovat IPv6 adresy webů v konfiguraci, abych je nemusel naklikávat v adminu. Pokud to jde jinak líp, klidně to předělám.

Problém je v tom, že máš některé ty adresy přidané přes vpsAdmin a zároveň se je snažíš přidat v networking.interfaces.venet0.ipv6.addresses, konkrétně zrovna ta 2a03:3b40:100::1:218. To je pak race condition mezi network-addresses-venet0.service a networking-setup.service z vpsadminos.nix, kdo to dřív nastaví a kdo dostane chybu. Vyber si jeden způsob, buď vpsAdmin a nebo Nix konfigurace.

Pokud budeš chtít ty adresy z vpsAdminu odebrat, tak v detailu VPS formulář “Interface addresses”. Nech si je v “Routed addresses”.

Uff, snad jsem to napsal jasně. Můžeš kombinovat adresy přidané přes vpsAdmin a Nix konfiguraci, ale ne ty samé :slight_smile:

Tomu rozumím. K chybě dojde, pokud nějakou adresu zkouším přiřadit dvakrát, případně pokud službu spustím dvakrát.

Dělá to služba network-addresses-venet0.service. Ve zdrojáku vidím, že se snaží ošetřit situaci, kdy už některá rozhraní existují, ale že to ošetření nefunguje. Ve skriptu, který volá je toto:

echo -n "adding address 2a03:3b40:101:6f::0b00:dacc/128... "
if out=$(ip addr add "2a03:3b40:101:6f::0b00:dacc/128" dev "venet0" 2>&1); then
  echo "done"
elif ! echo "$out" | grep "File exists" >/dev/null 2>&1; then
  echo "'ip addr add "2a03:3b40:101:6f::0b00:dacc/128" dev "venet0"' failed: $out"
  exit 1
fi

Když File exists nahradím za Address already assigned, přiřadí to jen adresy, které ještě nejsou, což si myslím je záměr.

Řekl bych, že dřív ip addr add vypsalo RTNETLINK answers: File exists, a ošetření fungovalo. Hledám, jestli se chybová hláška opravdu změnila, nebo jestli to ošetřuje něco jiného, než si myslím.

Jo, je to pravděpodobně jak říkáš. Ono na to totiž normálně nenarazíš, když měníš systém a v konfiguraci přidáváš/odebíráš adresy, tak network-addresses-venet0.service nejdřív ty adresy odebere a pak je znovu přidá:

Apr 25 10:42:32 nixos systemd[1]: Stopping Address configuration of venet0...
Apr 25 10:42:32 nixos network-addresses-venet0-pre-stop[11333]: deleting address 2a03:3b40:fe:6c::2/64... done
Apr 25 10:42:32 nixos network-addresses-venet0-pre-stop[11333]: deleting address 2a03:3b40:fe:6c::3/64... done
Apr 25 10:42:32 nixos network-addresses-venet0-pre-stop[11333]: deleting address 2a03:3b40:fe:6c::4/64... done
Apr 25 10:42:32 nixos systemd[1]: network-addresses-venet0.service: Deactivated successfully.
Apr 25 10:42:32 nixos systemd[1]: Stopped Address configuration of venet0.
Apr 25 10:42:32 nixos systemd[1]: Starting Address configuration of venet0...
Apr 25 10:42:32 nixos network-addresses-venet0-start[11339]: adding address 2a03:3b40:fe:6c::6/64... done
Apr 25 10:42:32 nixos network-addresses-venet0-start[11339]: adding address 2a03:3b40:fe:6c::2/64... done
Apr 25 10:42:32 nixos network-addresses-venet0-start[11339]: adding address 2a03:3b40:fe:6c::3/64... done
Apr 25 10:42:32 nixos network-addresses-venet0-start[11339]: adding address 2a03:3b40:fe:6c::4/64... done
Apr 25 10:42:32 nixos network-addresses-venet0-start[11339]: adding address 2a03:3b40:fe:6c::5/64... done
Apr 25 10:42:32 nixos systemd[1]: Finished Address configuration of venet0.

Narazíš na to jen když se tam ty adresy dostanou i odjinud, tj. z vpsAdminu ve tvém případě.

Zkoušel jsem schválně NixOS 20.09 a už tam to píše " *Address already assigned", starší už k dispozici nemám.

Tohle vysvětlení zní dobře, neuvědomil jsem si, že to i adresy odebírá.

Dík.

Posílal jsem patch do nixosu, před chvílí se dostal do masteru.

2 Likes