This Documenation is created with the help of `Major Hayden `_. Thanks to Major Hayden :). Networkd ========= This chapter shows how to convert Network manger to Networkd and various use cases of Networkd Comparing systemd-networkd and NetworkManager --------------------------------------------- - NetworkManager has been around for quite some time and systemd-networkd is relatively new. - Re-configuring existing network interfaces is challenging for both NetworkManager and systemd-networkd - Accessing raw systemd-networkd configuration files is more straightforward than NetworkManager - systemd-networkd's memory and CPU usage is extremely low (good for containerized environments) - systemd-networkd can handle various sysctl activities automatically, like IP forwarding - Tunnels and Overlays - NetworkManager has more options for advanced tunnels, like vpnc, openconnect, and openvpn - systemd-networkd makes gre, vlan, vxlan, and other overlay technologies much easier to implement - NetworkManager's logging is more verbose by default, which can be good for troubleshooting - systemd-networkd is meant to be configured without a GUI Configuration ------------- Fedora Cloud Base Image. Download it from `here `_. Switching from NetworkManager to systemd-networkd ------------------------------------------------- Start by ensuring that NetworkManager and network scripts don't start on reboot: :: # systemctl disable NetworkManager # systemctl disable network Ensure that systemd-networkd starts on the next boot: :: # systemctl enable systemd-networkd Enable the resolver and make a symlink: :: # systemctl enable systemd-resolved # systemctl start systemd-resolved # rm -f /etc/resolv.conf # ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf Be sure to configure your network interfaces in ``/etc/systemd/network`` and then reboot. systemd-networkd use cases -------------------------- Here are some sample use cases for systemd-networkd and example configurations. **Simple DHCP on a single interface** For an interface ``eth0``, a single ``.network`` file is needed: :: # cat /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] DHCP=yes **Static address on a single interface** For an interface ``eth0``, a single ``.network`` file is needed: :: # cat /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] Address=192.168.0.50/24 Address=2001:db8:dead:beef::/64 # These are optional but worth mentioning DNS=8.8.8.8 DNS=8.8.4.4 NTP=pool.ntp.org You can also split up the addresses into separate blocks: :: # cat /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] DNS=8.8.8.8 DNS=8.8.4.4 NTP=pool.ntp.org [Address] Address=192.168.0.50/24 [Address] Address=2001:db8:dead:beef::/64 Or add static routes: :: # cat /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] DNS=8.8.8.8 DNS=8.8.4.4 NTP=pool.ntp.org [Address] Address=192.168.0.50/24 [Address] Address=2001:db8:dead:beef::/64 [Route] Destination=10.0.10.0/24 Gateway=192.168.50.1 [Route] Destination=10.0.20.0/24 Gateway=192.168.50.1 **Do DHCP on all network devices** You can use wildcards almost anywhere in the ``[Match]`` block. For example, this will cause systemd-networkd to do DHCP on all interfaces: :: [Match] Name=eth* [Network] DHCP=yes **Bridging** Let's consider an example where we have ``eth0`` and we want to add it to a bridge. This could be handy for servers where you want to build containers or virtual machines and attach them to the network bridge. Start by setting up our bridge interface, ``br0``: :: # cat /etc/systemd/network/br0.netdev [NetDev] Name=br0 Kind=bridge Now that we have a bridge device, let's configure the network for the bridge: :: # cat /etc/systemd/network/br0.network [Match] Name=br0 [Network] IPForward=yes DHCP=yes The ``IPForward=yes`` will take care of the sysctl forwarding setting for us ``(net.ipv4.conf.br0.forwarding = 1)`` automatically when the interface comes up. Now, let's take the ethernet adapter and add it to the bridge: :: # cat /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] Bridge=br0 Simply reboot the system and it will come up with ``eth0`` as a port on ``br0``. **Bonding** Configuring a bonded interface is very similar to configuring a bridge. Start by setting up the individual network adapters: :: # /etc/systemd/network/ens9f0.network [Match] Name=ens9f0 [Network] Bond=bond1 :: # /etc/systemd/network/ens9f1.network [Match] Name=ens9f1 [Network] Bond=bond1 Now we can create the network device for the bond: :: # /etc/systemd/network/bond1.netdev [NetDev] Name=bond1 Kind=bond [Bond] Mode=802.3ad TransmitHashPolicy=layer3+4 MIIMonitorSec=1s LACPTransmitRate=fast Once the device is defined, let's add some networking to it: :: # /etc/systemd/network/bond1.network [Match] Name=bond1 [Network] DHCP=yes BindCarrier=ens9f0 ens9f1 The **BindCarrier** is optional but recommended. It gives systemd-networkd the hint that if both bonded interfaces are offline, it should remove the bond configuration until one of the interfaces comes up again. Status & Diagnostics -------------------- All of the output from systemd-networkd will appear in your system journal. Any errors when setting up interfaces or configuring routes will be printed there. The ``networkctl`` command allows you to check your network devices at a glance. Here's an example of a fairly complicated network setup: :: # networkctl IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 enp3s0 ether off unmanaged 3 enp1s0f0 ether degraded configured 4 enp1s0f1 ether degraded configured 5 br1 ether routable configured 6 br0 ether routable configured 7 gre0 ipgre off unmanaged 8 gretap0 ether off unmanaged 9 gre-colocation ipgre routable configured 12 vlan100 ether routable configured 13 tun1 none routable unmanaged 14 tun0 none routable unmanaged 15 vlan200 ether routable configured You'll find two physical network cards (``enp1s0f0`` and ``enp1s0f1``) each attached to a bridge (``br0`` and ``br1``, respectively). The physical network adapters show up as degraded because they don't have network addresses directly assigned -- that assignment is done on the bridge. The ``gre0`` and ``gretap0`` devices are created automatically to handle the gre tunnel ``gre-colocation``. There are also two VLANs configured within systemd and attached to a bridge. The ``tun`` interfaces are OpenVPN interfaces and they are not configured by systemd-networkd (hence the unmanaged setup). **Further Reading** - `ArchLinux systemd-networkd documentation `_ - `Upstream systemd-networkd documentation `_