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