blog

systemd-networkd: Netzwerkconfig für einen KVM-Server

/ 31 März 2014

In einer Standard-Gentoo-Installation braucht ein KVM-Server eine Netzwerk-Bridge, um den VMs einen Weg zur physischen Netzwerk-Schnittstelle zu ermöglichen.

Mit openrc sieht das etwa so aus:

# /etc/conf.d/net

rc_net_br0_need="net.tap0"
brctl_br0="setfd 0 sethello 10 stp off"
bridge_br0="eth0 tap0"
dns_search_br0="example.com"
dns_domain_br0="example.com"
dns_servers_br0="192.168.0.254"
routes_br0="default via 192.168.0.254"
config_br0="192.168.0.1/24"
tunctl_tap0="-u sgw"
config_tap0="null"
tuntap_tap0="tap"
config_eth0="null" 

Dazu dann eben /etc/init.d/net.br0 usw., wie üblich.

<systemd-210

Mit systemd hatte ich bisher diesen Weg gewählt:

# bridge.service

[Unit]
Description=network bridge for KVM
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes

EnvironmentFile=/etc/conf.d/network_systemd

ExecStart=/sbin/brctl addbr ${bridge_name}
ExecStart=/bin/ifconfig ${bridge_name} ${address} netmask ${netmask} up
ExecStart=/bin/ifconfig ${interface} up
ExecStart=/sbin/brctl addif ${bridge_name} ${interface}
ExecStart=/sbin/sysctl net.ipv4.conf.${bridge_name}.forwarding=1
#ExecStart=/sbin/iptables -t nat -A POSTROUTING -o ${interface} -j MASQUERADE
ExecStart=/bin/ip route add default via ${gateway}

ExecStop=/bin/ip route del default via ${gateway}
ExecStop=/sbin/sysctl net.ipv4.conf.${bridge_name}.forwarding=0
ExecStop=/sbin/brctl delif ${bridge_name}
ExecStop=/bin/ifconfig ${bridge_name} down
ExecStop=/bin/ifconfig ${interface} down
ExecStop=/sbin/brctl delbr ${bridge_name} 
#ExecStop=/sbin/iptables -t nat -D POSTROUTING -o ${interface} -j MASQUERADE

[Install]
WantedBy=multi-user.target

Hier braucht es dann noch /etc/conf.d/network_systemd :

# /etc/conf.d/network_systemd
PATH=/sbin:/usr/sbin
interface=enp6s0
address=192.168.0.1
netmask=255.255.255.0
broadcast=192.168.0.255
gateway=192.168.0.254
bridge_name=br0
tap_name=qtap0
user=sgw

>=systemd-210

Seit systemd-210 gibt es nun den systemd-networkd

Die Konfiguration meiner Bridge besteht nun aus drei kleinen Dateien in /etc/systemd/network:

# 10-static.network
[Match]
Name=enp6s0

[Network]
Bridge=br0
# 20-bridge.network
[Match]
Name=br0

[Network]
Address=192.168.0.1/24
Gateway=192.168.0.250
# br0.netdev
[NetDev]
Name=br0
Kind=bridge

Natürlich darf dann das zuvor verwendete bridge.service nicht enabled sein, und systemd-networkd muß aktiviert werden:

systemctl disable bridge.service
systemctl enable systemd-networkd.service
systemctl reboot # der Einfachheit halber

Es empfiehlt sich natürlich, beim Testen des Ganzen Zugriff auf die lokale Konsole zu haben ;-)