[systemd-devel] How to set up virtual network interface cards (NIC) with systemd-networkd "The Right Way (tm)"?
M. Buecher
maddes+systemd at maddes.net
Wed May 1 19:48:11 UTC 2019
Dear all,
I read multiple articles on the internet about virtual interfaces via
systemd-networkd, but most article just list the config files and do not
explain why they did something this or that way.
Most are using MACVLAN netdevs but I couldn't get them working
correctly, although the ip addresses were available on the interfaces.
In the docs, FAQ and mailing list I couldn't find anything related to
it.
I'm ok with most network topics, but unfortunately I'm not a network
admin/expert, so please bear with me.
* Goal
A new mini pc shall become the gateway between all internal IP networks,
DHCP server for the main internal IP network and the internal DNS server
plus provide some additional DNS server instances for special cases.
For the DNS server scenario multiple additional virtual network
interfaces are needed on the real network interface card (NIC) with
systemd-networkd.
IP addresses on the real and virtual interfaces shall be reachable from
other machines and from all real/virtual interfaces on the mini pc
itself.
Linux System is Debian GNU/Linux 9.9 (stretch) with kernel
4.9.0-3/4.9.30-2+deb9u5 and systemd 232 +PAM +AUDIT +SELINUX +IMA
+APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ
+LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
The old "networking.service" (/etc/network/interface*) is disabled and
"systemd-networkd.service" enabled.
In the first step the solution shall be implemented in a pure IPv4
scenario with no firewall on the mini pc itself, later in a dual stack
scenario plus ip[6]tables firewall.
The real NIC is named "ens192" and the virtual interfaces are named
"dnsextra01" and "dnsextra02".
IPv4 LAN #1 is 192.168.1.0/24 with default gateway 192.168.1.254 (via
router device) to internet plus gateway 192.168.1.50 (mini pc) to IPv4
LAN #2.
IPv4 LAN #2 is 192.168.2.0/24 with gateway plus dns 192.168.2.1 (mini
pc).
* Detailed feature list
a) "ens192" has the main IPv4 LAN #1 with 192.168.1.50/24 and secondary
IPv4 LAN #2 with 192.168.2.1/24.
For IPv4 LAN #2 it is also the gateway to IPv4 LAN #1 and the internet.
It provides the main DNS server instance for both IPv4 LANs.
b) "dnsextra01" (.98) has the main IPv4 LAN #1 with 192.168.1.98/24 and
secondary IPv4 LAN #2 with 192.168.2.98/24.
It provides a special case DNS server instance for some machines in both
IPv4 LANs.
c) "dnsextra02" (.99) has only the main IPv4 LAN #1 with 192.168.1.99/24
It provides a special case DNS server instance for one machine in IPv4
LAN #1.
d) All machines in both IPv4 LANs should be able to ping all IP
addresses of all real/virtual interfaces.
ping -O -c 10
<192.168.1.50|192.168.1.98|192.168.1.99|192.168.2.1|192.168.2.98>
e) All real/virtual interfaces should be able to ping all IP addresses
of all other real/virtual interfaces.
ping -I ens192 -O -c 10 <192.168.1.98|192.168.1.99|192.168.2.98>
ping -I dnsextra01 -O -c 10 <192.168.1.50|192.168.1.99|192.168.2.1>
ping -I dnsextra01 -O -c 10
<192.168.1.50|192.168.1.98|192.168.2.1|192.168.2.98>
* My try
The following setup allows to ping some IPv4 addresses from other
machines, but only sometimes and then it also takes several seconds
until a ping finally succeeds.
Pinging the other interfaces on the mini pc itself does NOT work at all.
If the netdevs via MACVLAN are disabled, then the mini pc reacts nearly
instantly on network requests (e.g. ssh, ping) and forwarding from IPv4
LAN #1 to LAN #2 works fine.
a) /etc/sysctl.d/90_ipv4_filter.conf
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.rp_filter=1
b) /etc/systemd/network/ens192.network
[Match]
Name=ens192
[Network]
IPForward=yes
LinkLocalAddressing=ipv6
IPv6AcceptRA=yes
IPv6PrivacyExtensions=yes
## Virtual NICs on ens192
MACVLAN=dnsextra01
MACVLAN=dnsextra02
Address=192.168.1.50/24
Address=192.168.2.1/24
Gateway=192.168.1.254
c) /etc/systemd/network/dnsextra01.netdev
[NetDev]
Name=dnsextra01
Kind=macvlan
[MACVLAN]
Mode=bridge
d) /etc/systemd/network/dnsextra01.network
[Match]
Name=dnsextra01
[Network]
IPForward=yes
Address=192.168.1.98/24
Address=192.168.2.98/24
e) dnsextra02 same as dnsextra01 just only 192.168.2.99/24
What is wrong in this setup? How should this be done correctly via
systemd-networkd?
Is a newer version of systemd needed for this to work?
Any help is greatly appreciated.
Matthias "Maddes" Bücher
More information about the systemd-devel
mailing list