Florent Peterschmitt

systemd-networkd v219 et au delà

Un petit billet pour dire que si tout d’un coup, après passage en version 219 ou supérieure de systemd vous vous retrouvez avec vos interfaces virtuelles et bridges ne pouvant plus faire de NAT, et que vous gérez ces mêmes interfaces avec networkd, alors il vous faudra faire un peu plus de configuration.

Prenons par exemple un fichier lxcbr0.network :

[Match]
Name=lxcbr0

[Network]
Address=10.2.2.254/24
IPForward=yes
IPMasquerade=yes

[Route]
Gateway=10.2.2.254/24

Le bout de ChangeLog qui nous intéresse :

* networkd gained support for configuring bridge forwarding
     database entries (fdb) from .network files.

* networkd .network files gained support for configuring
     per-link IPv4/IPv6 packet forwarding as well as IPv4
     masquerading. This is by default turned on for veth links to
     containers, as registered by systemd-nspawn. This means that
     nspawn containers run with --network-veth will now get
     automatic routed access to the host's networks without any
     further configuration or setup, as long as networkd runs on
     the host. 

Et le bout de man correspondant :

[NETWORK] SECTION OPTIONS

... bla bla bla bla bla bla ...

IPForward=
    Configures IP forwarding for the network interface. If enabled incoming packets on the
    network interface will be forwarded to other interfaces according to the routing table.
    Takes either a boolean argument, or the values "ipv4" or "ipv6", which only enables IP
    forwarding for the specified address family.

IPMasquerade=
    Configures IP masquerading for the network interface. If enabled packets forwarded from the
    network interface will be appear as coming from the local host. Takes a boolean argument.
    Implies IPForward=yes.

Si je ne me trompe pas, dans le cas de l’utilisation d’interface de type veth, avec LXC par exemple (;-P), les paquets entrants seront transférés à l’interface vethBLAH appartenant au conteneur.

Et la seconde option nous sert pour faire notre SNAT.

Tout cela avec sysctl net.ipv4.ip_forward=1 et iptables -t nat -A POSTROUTING -j MASQUERADE, un coup de systemctl restart systemd-networkd et pouf.

Notez qu’avec Ubuntu 15.04, c’est systemd 219 qui est embarqué.

Ça m’aura quand même coûté une heure de temps cette connerie, et je vois pas bien ce que cette option vient foutre ici. Je suis pas contre une explication de la nécessité de gérer ce paramètre depuis networkd au lieu de laisser faire iptables/nftables.

Comments