[systemd-devel] Prefix delegation and IPv6 subnetting

Bent Bagger bent.bagger at fern.dk
Thu Jul 7 15:25:26 UTC 2022


I have become fascinated by prefix delegation and ipv6 subnetting - to 
the extent that I have decided to learn more about it. I have set up the 
following test network using VirtualBox: (main router is a real host; 
the virtual hosts (Netn) run on my workstation)

   Internet
        |
        |
    ------------
    |           |
    |Main router|
    |           |
    -------------
       LAN
        |
        |
        | enp0s3
    -----------
    |         |
    | Net0    |
    |         |
    -----------
enp0s9 |   | enp0s8
        |   |
        |   --------------------
        |                      |
        | enp0s3               | enp0s3
    -----------            ----------
    |         |            |        |
    | Net1    |            | Net2   |
    |         |            |        |
    -----------            ----------
                        enp0s8 |
                               |
                               | enp0s3
                           -----------
                           |         |
                           | Net4    |
                           |         |
                           -----------


I have also decided that I want to use networkd for the purpose because 
I like the idea of systemd and networkd.

So far I have encountered two problem areas: 1) getting prefix 
delegation to work and 2) getting IP6 downstream routes set up. I'll 
return to the route setup problem in a later post.

The prefix delegation problem starts with the interactions between net0 
and net2. Net0 is delegated a /56 prefix from the main router (which 
runs radvd and dhcpd6, not networkd, for historical reasons). I want 
net2 to delegate a /60 subnet to net3, but it doesn't happen. The 
immediate symptoms are that net0 doesn't start a dhcp6 server on 
downstream interface enp0s9 and net2 doesn't start a dhcp6 client on 
upstream interface enp0s3.

The hosts net0, net2 and net3 all run ArchLinux (kernel5.18.5-arch1-1, 
systemd 251.2-1). Here are the configuration files:
Host net0:
=====
# Upstream interface enp0s3 on net0
[Match]
Name=enp0s3

[Network]
# SLAAC IPv6 for obtaining the default route.
LinkLocalAddressing=ipv6
DHCP=yes

[IPv6AcceptRA]
DHCPv6Client=yes
=====

=====
# Downstream interface enp0s8 on net2
[Match]
Name=enp0s8

[Network]
DHCPPrefixDelegation=yes
IPv6SendRA=yes
IPv6AcceptRA=no
IPForward=yes
DHCPServer=yes

[DHCPPrefixDelegation]
UplinkInterface=enp0s3
SubnetId=8
Announce=yes

[Address]
Address=192.168.1.1/24

[DHCPServer]
PoolOffset=90
PoolSize=10
EmitDNS=yes
BindToInterface=yes

#[DHCPServerStaticLease]
# Net3 - IF enp0s3
#MACAddress=08:00:27:d7:6b:82
#Address=192.168.1.100
========

Host net2:
=====
#  Upstream interface enp0s3 on net2
[Match]
Name=enp0s3

[Network]
LinkLocalAddressing=ipv6
# SLAAC IPv6 for obtaining the default route
IPv6AcceptRA=yes
DHCP=yes
IPForward=yes

[DHCPv4]
Hostname=net2
UseHostname=no
# Ignore the hostname from the DHCP server
UseDNS=yes
UseNTP=yes
UseRoutes=yes
UseGateway=yes

[IPv6AcceptRA]
UseDNS=yes
DHCPv6Client=yes

[IPv6PrefixDelegation]
Managed=yes

[DHCPv6]
ForceDHCPv6PDOtherInformation=yes
UseHostname=no
UseDNS=yes
UseNTP=yes
=====

And here are the symptoms that to me doesn't look right:

On host net0:
[root at net0 ~]# ss -l6
Netid  State   Recv-Q   Send-Q                        Local 
Address:Port              Peer Address:Port  Process
icmp6  UNCONN  0        0 *%enp0s3:ipv6-icmp                    *:*
icmp6  UNCONN  0        0 *%enp0s8:ipv6-icmp                    *:*
icmp6  UNCONN  0        0 *%enp0s9:ipv6-icmp                    *:*
udp    UNCONN  0        0 [fe80::a00:27ff:fe8b:3d3]%enp0s3:dhcpv6-client 
[::]:*
udp    UNCONN  0        0 [::]:llmnr                     [::]:*
tcp    LISTEN  0        128 [::]:ssh                       [::]:*
tcp    LISTEN  0        511 *:https                        *:*
tcp    LISTEN  0        80 [::]:mysql                     [::]:*
tcp    LISTEN  0        4096 [::]:llmnr                     [::]:*
tcp    LISTEN  0        511 *:http                         *:*
[root at net0 ~]#

I'm missing a dhcpv6-server on enp0s8 (and enp0s9 for that matter)

Similar for host net2:

[root at net2 ~] ss -l6
Netid State  Recv-Q Send-Q Local Address:Port      Peer Address:Port Process
icmp6 UNCONN 0      0           *%enp0s8:ipv6-icmp *:*
icmp6 UNCONN 0      0           *%enp0s3:ipv6-icmp *:*
udp   UNCONN 0      0               [::]:llmnr [::]:*
tcp   LISTEN 0      4096            [::]:llmnr [::]:*
tcp   LISTEN 0      128             [::]:ssh [::]:*
[root at net2 ~]

Here I'm missing a dhcpv6-client on enp0s3.

I do need somebody to discuss these matters with since my thought 
sometimes appear to run in circles. I hope somebody will take the time 
to comment on this. Also I do apologize for the lengthy post but these 
matters are complicated - at least to me.

Kind regards

Bent


More information about the systemd-devel mailing list