Package: nftables
Version: 1.1.6-1+b1
Severity: important
Tags: ipv6

Be aware I'm reporting this bug on host "real" the bug occurs on host "ybox" , 
ybox is network isolated.


I have a setup with an ISP supplied router (fritzbox)

I have a Debian box (ybox) running trixie connected to this via enp2s0, and a 
LAN on enp4s0

ybox requests a Prefix Deligation (PD) from fritzbox. This needs to be 
regularly renewed.

The INPUT chain includes :

     ct state established,related counter packets 2 bytes 226 accept # handle 6

and later :

    ip6 saddr fe80::52e6:36ff:fea5:d50f udp sport 547 udp dport 546 counter 
packets 1 bytes 246 accept # handle 8

While handle#8 is in place, everything works, a renew is requested and a reply
received and processed. If handle#8 is removed, the PD eventually times out and
the lease is lost

I have terminal output, with timestamps, as well as wireshark trace showing the 
point were request/reply breaks down

Most addresses in logs are link local. I've attempted to elide any global IPV6 
addresses


$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.4
ID=debian
HOME_URL="https://www.debian.org/";
SUPPORT_URL="https://www.debian.org/support";
BUG_REPORT_URL="https://bugs.debian.org/";


$ /sbin/nft -v
nftables v1.1.3 (Commodore Bullmoose #4)

$ cat /proc/version 
Linux version 6.12.85+deb13-amd64 ([email protected]) 
(x86_64-linux-gnu-gcc-14 (Debian 14.2.0-19) 14.2.0, GNU ld (GNU Binutils for 
Debian) 2.44) #1 SMP PREEMPT_DYNAMIC Debian 6.12.85-1 (2026-04-30)


ii  libnftables1:amd64 1.1.3-1      amd64        Netfilter nftables high level 
userspace API library
ii  libnftnl11:amd64   1.2.9-1      amd64        Netfilter nftables userspace 
API library
ii  nftables           1.1.3-1      amd64        Program to control packet 
filtering rules by Netfilter project


It appears reportbug will not, at this time allow me to attach 
"just-dhcpv6.txt" , I will add later.


---------------------------------------------------------




I am using systemd.networkd to configure IPv6. I request a delegation via 
PrefixDelegationHint=::/48
and am granted a 57 bit PD by the upstream Fritzbox (fe80::52e6:36ff:fea5:d50f).

This PD will expire unless renewed and to that end my host (ybox) sends DHVPv6 
Renew messages upstream
to the fritzbox, it immediately receives a DHCPv6 REPLY which renews the PD.

On ybox, enp2s0 goes UP (to Fritzbox) and enp4s0 goes DOWN to LAN.

I have left this system running for 24+ hours, with wireshark collecting all 
ICMPv6 and DHCPv6 on both enp2s0 and enp4s0, it's running fine.

(show-stuff is a small script)




owner@ybox:~$ sudo show-stuff
Sat  2 May 16:09:11 UTC 2026
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1

Firewall ==================================
table inet filter { # handle 3
        chain INPUT { # handle 1
                type filter hook input priority filter; policy drop;
                iif "lo" counter packets 2788 bytes 290678 accept # handle 4
                iif "enp4s0" counter packets 438 bytes 74788 accept # handle 5
                ct state established,related counter packets 16909 bytes 
13342913 accept # handle 6
                ip6 saddr fe80::52e6:36ff:fea5:d50f meta l4proto ipv6-icmp 
counter packets 1220 bytes 110296 accept # handle 7
                ip6 saddr fe80::52e6:36ff:fea5:d50f udp sport 547 udp dport 546 
counter packets 53 bytes 12414 accept # handle 8
                ip6 saddr fe80::52e6:36ff:fea5:d50f tcp dport 25 counter 
packets 0 bytes 0 accept # handle 9
                ip saddr 192.168.1.254 tcp dport 25 counter packets 0 bytes 0 
accept # handle 10
        }

        chain FORWARD { # handle 2
                type filter hook forward priority filter; policy drop;
                ct state established,related counter packets 85 bytes 65480 
accept # handle 11
                iif "enp4s0" oif "enp2s0" counter packets 92 bytes 7720 accept 
# handle 12
                ip6 saddr fe80::52e6:36ff:fea5:d50f meta l4proto ipv6-icmp 
counter packets 0 bytes 0 accept # handle 13
                ip6 saddr fe80::52e6:36ff:fea5:d50f udp sport 547 udp dport 546 
counter packets 0 bytes 0 accept # handle 14
        }

        chain OUTPUT { # handle 3
                type filter hook output priority filter; policy accept;
        }
}

Routes ====================================
2a02:XXX2:3833::/64 dev enp2s0 proto ra metric 1024 expires 6975sec pref medium
2a02:XXX2:3833:87::/64 dev enp2s0 proto kernel metric 256 expires 6166sec pref 
medium
2a02:XXX2:3833:89::/64 dev enp4s0 proto kernel metric 256 expires 6166sec pref 
medium
unreachable 2a02:XXX2:3833:80::/57 dev lo proto dhcp metric 1024 pref medium
2a02:XXX2:3833::/48 nhid 4088658661 via fe80::52e6:36ff:fea5:d50f dev enp2s0 
proto ra metric 1024 expires 1575sec pref medium
fde4:f713:95b0::/64 dev enp2s0 proto ra metric 1024 expires 6975sec pref medium
fde4:f713:95b0::/64 nhid 4088658661 via fe80::52e6:36ff:fea5:d50f dev enp2s0 
proto ra metric 1024 expires 1575sec pref medium
fe80::/64 dev enp2s0 proto kernel metric 256 pref medium
fe80::/64 dev enp4s0 proto kernel metric 256 pref medium
default nhid 4088658661 via fe80::52e6:36ff:fea5:d50f dev enp2s0 proto ra 
metric 1024 expires 1575sec pref medium

Addresses =================================
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group 
default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP 
group default qlen 1000
    link/ether 00:e0:0b:31:b0:be brd ff:ff:ff:ff:ff:ff
    altname enx00e00b31b0be
    inet 192.168.1.152/24 brd 192.168.1.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet 192.168.1.23/24 metric 1024 brd 192.168.1.255 scope global secondary 
dynamic enp2s0
       valid_lft 774010sec preferred_lft 774010sec
    inet6 fde4:f713:95b0::47/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 6976sec preferred_lft 3376sec
    inet6 2a02:XXX2:3833::47/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 6976sec preferred_lft 3376sec
    inet6 2a02:XXX2:3833:87::45/64 metric 256 scope global dynamic mngtmpaddr 
       valid_lft 6167sec preferred_lft 2567sec
    inet6 fe80::2e0:bff:fe31:b0be/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP 
group default qlen 1000
    link/ether 00:e0:0b:31:b0:bf brd ff:ff:ff:ff:ff:ff
    altname enx00e00b31b0bf
    inet 10.117.0.152/24 brd 10.117.0.255 scope global enp4s0
       valid_lft forever preferred_lft forever
    inet6 2a02:XXX2:3833:89::44/64 metric 256 scope global dynamic mngtmpaddr 
       valid_lft 6167sec preferred_lft 2567sec
    inet6 fe80::152/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::2e0:bff:fe31:b0bf/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
4: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
qlen 1000
    link/ether 7c:e9:d3:97:48:53 brd ff:ff:ff:ff:ff:ff
    altname wlx7ce9d3974853

Network status =================================
* 2: enp2s0
                   Link File: /usr/lib/systemd/network/99-default.link
                Network File: /etc/systemd/network/10-upper.network
                       State: routable (configured)
                Online state: online
                        Type: ether
                        Path: pci-0000:02:00.0
                      Driver: r8169
                      Vendor: Realtek Semiconductor Co., Ltd.
                       Model: RTL8111/8168/8211/8411 PCI Express Gigabit 
Ethernet Controller
           Alternative Names: enx00e00b31b0be
            Hardware Address: 00:e0:0b:31:b0:be (ROOFTOP COMMUNICATIONS CORP.)
                         MTU: 1500 (min: 68, max: 9194)
                       QDisc: fq_codel
IPv6 Address Generation Mode: eui64
    Number of Queues (Tx/Rx): 1/1
            Auto negotiation: yes
                       Speed: 1Gbps
                      Duplex: full
                        Port: tp
                     Address: 192.168.1.23 (DHCPv4 via 192.168.1.254)
                              192.168.1.152
                              2a02:XXX2:3833::47
                              2a02:XXX2:3833:87::45
                              fde4:f713:95b0::47
                              fe80::2e0:bff:fe31:b0be
                     Gateway: 192.168.1.254
                              192.168.1.254
                              fe80::52e6:36ff:fea5:d50f
                         DNS: 192.168.1.254
                              8.8.8.8
                              fde4:f713:95b0:0:52e6:36ff:fea5:d50f
                              2a02:XXX2:3833:0:52e6:36ff:fea5:d50f
                         NTP: 192.168.1.254
                              2a02:XXX2:3833:0:52e6:36ff:fea5:d50f
                              fde4:f713:95b0:0:52e6:36ff:fea5:d50f
           Activation Policy: up
         Required For Online: yes
            DHCPv4 Client ID: IAID:0x5de26c15/DUID
          DHCPv6 Client IAID: 0x5de26c15
          DHCPv6 Client DUID: DUID-EN/Vendor:0000ab1178381c5802d1e61b
                Connected To: fritz.box (AVM FRITZ!Box 7530 164.08.21) on port 
50:e6:36:a5:d5:0f (LAN:2)

May 01 16:09:18 ybox systemd-networkd[415]: enp2s0: Configuring with 
/etc/systemd/network/10-upper.network.
May 01 16:09:18 ybox systemd-networkd[415]: enp2s0: Link UP
May 01 16:09:20 ybox systemd-networkd[415]: enp2s0: Gained carrier
May 01 16:09:20 ybox systemd-networkd[415]: enp2s0: DHCPv4 address 
192.168.1.23/24, gateway 192.168.1.254 acquired from 192.168.1.254
May 01 16:09:22 ybox systemd-networkd[415]: enp2s0: Gained IPv6LL
May 01 16:09:22 ybox systemd-networkd[415]: enp2s0: DHCP: received delegated 
prefix 2a02:XXX2:3833:80::/57
May 01 16:09:22 ybox systemd-networkd[415]: enp2s0: DHCP-PD address 
2a02:XXX2:3833:87::45/64 (valid for 1h 59min 59s, preferred for 59min 59s)
Sat  2 May 16:09:11 UTC 2026





Handle#8 is
                ip6 saddr fe80::52e6:36ff:fea5:d50f udp sport 547 udp dport 546 
counter packets 53 bytes 12414 accept # handle 8

This is to allow ALL DHCPv6 traffic ONLY from fritzbox (I don't want ALL DHCPv6 
traffic from the internet to be allowed)

I belive this rule should not be necessary (and is ugly , due to the fixed IP 
address) since the only DHVPv6 traffic I need are REPLIES
to requests made by ybox (over enp2s0) 



Note that Handle #8 has handled 53 packets. We can see from the wireshark that 
the only DHCPv6 traffic is renew/reply

There are 54 packets of DHCPv6.msgtype == "reply"  ... two (17:24 on 1st May) 
are on enp4s0 (a reply to a solicit)

The other 52 DHCPv6 Replies are all "Identity Association for Prefix 
Delegation" giving 2a02:xxxx:xxxx:80::








***************************
I will now delete handle#8

$ sudo nft delete rule inet filter INPUT   handle 8  ; date -u
[sudo] password for owner: 
Sat  2 May 16:27:47 UTC 2026

$ sudo nft -a list ruleset
table inet filter { # handle 3
        chain INPUT { # handle 1
                type filter hook input priority filter; policy drop;
                iif "lo" counter packets 2805 bytes 292300 accept # handle 4
                iif "enp4s0" counter packets 444 bytes 75411 accept # handle 5
                ct state established,related counter packets 17017 bytes 
13371202 accept # handle 6
                ip6 saddr fe80::52e6:36ff:fea5:d50f meta l4proto ipv6-icmp 
counter packets 1241 bytes 112048 accept # handle 7
                ip6 saddr fe80::52e6:36ff:fea5:d50f tcp dport 25 counter 
packets 0 bytes 0 accept # handle 9
                ip saddr 192.168.1.254 tcp dport 25 counter packets 0 bytes 0 
accept # handle 10
        }

        chain FORWARD { # handle 2
                type filter hook forward priority filter; policy drop;
                ct state established,related counter packets 85 bytes 65480 
accept # handle 11
                iif "enp4s0" oif "enp2s0" counter packets 92 bytes 7720 accept 
# handle 12
                ip6 saddr fe80::52e6:36ff:fea5:d50f meta l4proto ipv6-icmp 
counter packets 0 bytes 0 accept # handle 13
                ip6 saddr fe80::52e6:36ff:fea5:d50f udp sport 547 udp dport 546 
counter packets 0 bytes 0 accept # handle 14
        }

        chain OUTPUT { # handle 3
                type filter hook output priority filter; policy accept;
        }
}



What I expect to now happen is ybox will renew the PD several times, get it's 
usual reply but will be blocked by NFT.
Then after failing to get a valid reply to it's renew request, it will start 
sending different traffic.



So at 16:27 UTC I delete rule handle#8
  Renew/reply continues

@ 17:09 UTC we see the 1st rebind + reply

@ 18:21 UTC we see Solicit + reply
@ 18:21 UTC systemd-networkd reports enp2s0: DHCPv6 lease lost



The file: just-dhcpv6.txt

Contains (annotated) wireshark export with a filter to select only DHCPv6

(search for "***" , to see annotations)

Reply via email to