PVE Firewall Dropping NDP NS?

lukeh990

New Member
Oct 8, 2024
3
0
1
Hello,
I am running a PVE cluster with 3 nodes. Each node has a statically configured IPv6 address. When I set it up, I was able to ping across the cluster to another node from the WebUI host console no problem. But today when I was doing maintenance, I noticed that I couldn't ping anything on the same subnet besides the router. Running tcpdumps, I found that the pinging host would generate a NS and send it to a multicast address. I would see that appear on the receiving hosts tcpdump then no response would be made. Now while doing those captures, I saw that from time to time NS requests would arrive with unicast destinations and would be processed and a response would go back out from the host.

Now, when turning off the DC firewall, everything would start working again. So obviously a firewall issue. Though during my debugging I had a rule that any ipv6-icmp on the in chain would be allowed. Though that doesn't seem to be honored. NDP on the host FW is enabled. Setting logging wherever I could, I couldn't see any reason why it would be blocking.

Another weird thing is that I have another PVE instance with all the same package versions and can't replicate the issue easily.

Any help in figuring this out would be appreciated.

cluster.fw
Code:
[OPTIONS]

enable: 1
policy_forward: ACCEPT

[IPSET hv-net]

<xx>.<x>.<x>.<x>/24
<xx>.<x>.<x>.<x>/24
<xx>.<x>.<x>.<x>/25
<xx>.<x>.<x>.<xxx>/25
<xx>.<x>.<x>.<x>/24
<xxxx>:<xxxx>:0:1::/64
<xxxx>:<xxxx>::/64

[IPSET rfc1918]

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
<xxxx>:<xxxx>::/40
<xxxx>:<xxxx>:<xxxx>:<xxxx>::/64
<xxxx>:<xxxx>:<xxxx>::/48

[RULES]

IN ACCEPT -p ipv6-icmp -log nolog
IN ACCEPT -p icmp -log nolog
IN ACCEPT -i vmbr0.25 -source +dc/hv-net -dest +dc/hv-net -p udp -dport 4789 -log nolog
IN BGP(ACCEPT) -i vmbr0.25 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN ACCEPT -i vmbr0.25 -source +dc/hv-net -dest +dc/hv-net -p udp -dport 3784 -log nolog # BFD
IN ACCEPT -i vmbr0.11 -source +dc/hv-net -dest +dc/hv-net -p tcp -dport 60000:60050 -log nolog
IN SSH(ACCEPT) -i vmbr0.11 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN Ceph(ACCEPT) -i vmbr0.12 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN Ceph(ACCEPT) -i vmbr0.11 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN SSH(ACCEPT) -i vmbr0.10 -log nolog
IN ACCEPT -i vmbr0.10 -source +dc/rfc1918 -dest +dc/hv-net -p tcp -dport 8006 -log nolog
IN ACCEPT -i mgmtbr0 -source +dc/rfc1918 -dest +dc/hv-net -p tcp -dport 8006 -log nolog

[group dns-srv]

IN DNS(ACCEPT) -source +dc/rfc1918 -log nolog

[group mysql-srv]

IN MySQL(ACCEPT) -source +dc/rfc1918 -log nolog

[group pg-srv]

IN PostgreSQL(ACCEPT) -source +dc/rfc1918 -log nolog

[group ping]

IN ACCEPT -p ipv6-icmp -log nolog
IN ACCEPT -p icmp -log nolog

[group ssh-srv]

IN SSH(ACCEPT) -source +dc/rfc1918 -log nolog

[group web-srv]

IN HTTPS(ACCEPT) -source +dc/rfc1918 -log nolog
IN HTTP(ACCEPT) -source +dc/rfc1918 -log nolog

host.fw
Code:
[OPTIONS]

log_level_in: nolog
ndp: 1
nftables: 1

pveversion -v
Code:
proxmox-ve: 9.2.0 (running kernel: 7.0.14-17-pve)
pve-manager: 9.2.20 (running version: 9.2.20/49318c671b82f31e)
proxmox-kernel-helper: 9.2.0
proxmox-kernel-7.0.14-17-pve-signed: 7.0.14-17
proxmox-kernel-7.0: 7.0.14-17
proxmox-kernel-7.0.14-16-pve-signed: 7.0.14-16
proxmox-kernel-6.17: 6.17.13-21
proxmox-kernel-6.17.13-21-pve-signed: 6.17.13-21
proxmox-kernel-6.14: 6.14.11-9
proxmox-kernel-6.14.11-9-pve-signed: 6.14.11-9
ceph: 19.2.6-pve4
ceph-fuse: 19.2.6-pve4
corosync: 3.1.10-pve3
criu: 4.1.1-1
dnsmasq: 2.91-1+deb13u2
frr-pythontools: 10.6.1-1+pve3
ifupdown2: 3.3.0-1+pmx12
intel-microcode: 3.20251111.1~deb13u1
ksm-control-daemon: 1.5-1
libjs-extjs: 7.0.0-7
libproxmox-acme-perl: 1.7.2
libproxmox-backup-qemu0: 2.0.3
libproxmox-rs-perl: 0.4.1
libpve-access-control: 9.1.2
libpve-apiclient-perl: 3.4.3
libpve-cluster-api-perl: 9.1.6
libpve-cluster-perl: 9.1.6
libpve-common-perl: 9.2.2
libpve-guest-common-perl: 6.0.5
libpve-http-server-perl: 6.0.5
libpve-network-perl: 1.6.7
libpve-notify-perl: 9.1.6
libpve-rs-perl: 0.15.3
libpve-storage-perl: 9.1.10
libspice-server1: 0.15.2-1+b1
lvm2: 2.03.31-2+pmx1
lxc-pve: 7.0.0-2
lxcfs: 7.0.0-pve1
novnc-pve: 1.7.0-2
proxmox-backup-client: 4.2.6-1
proxmox-backup-file-restore: 4.2.6-1
proxmox-backup-restore-image: 1.0.0
proxmox-enterprise-support-keyring: 1.1
proxmox-firewall: 1.2.3
proxmox-kernel-helper: 9.2.0
proxmox-mail-forward: 1.0.3
proxmox-mini-journalreader: 1.7
proxmox-offline-mirror-helper: 0.7.4
proxmox-widget-toolkit: 5.2.8
pve-cluster: 9.1.6
pve-container: 6.1.14
pve-docs: 9.2.11
pve-edk2-firmware: 4.2026.08-1
pve-esxi-import-tools: 1.0.1
pve-firewall: 6.0.6
pve-firmware: 3.18-6
pve-ha-manager: 5.2.5
pve-i18n: 3.10.0
pve-qemu-kvm: 11.0.3-3
pve-xtermjs: 6.0.0-2
qemu-server: 9.2.8
smartmontools: 7.5-pve2
spiceterm: 3.4.2
swtpm: 0.8.0+pve3
vncterm: 1.9.2
zfsutils-linux: 2.4.4-pve1

/etc/network/interfaces
Code:
auto lo
iface lo inet loopback

auto enp4s0f0
iface enp4s0f0 inet manual

auto eno1
iface eno1 inet manual

iface eno2 inet manual

iface eno3 inet manual

iface eno4 inet manual

auto enp4s0f1
iface enp4s0f1 inet manual

auto bond0
iface bond0 inet manual
        bond-slaves enp4s0f0 enp4s0f1
        bond-miimon 100
        bond-mode 802.3ad
        bond-xmit-hash-policy layer3+4
        mtu 9000

auto vmbr0
iface vmbr0 inet manual
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094
        mtu 9000

auto vmbr0.11
iface vmbr0.11 inet static
        address <xx>.<x>.<x>.<xx>/25

auto vmbr0.12
iface vmbr0.12 inet static
        address <xx>.<x>.<x>.<xxx>/25

auto mgmtbr0
iface mgmtbr0 inet static
        address <xx>.<x>.<x>.<xx>/24
        gateway <xx>.<x>.<x>.<x>
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

iface mgmtbr0 inet6 static
        address <xxxx>:<xxxx>::<xxxx>:<xxxx>:<xxxx>:<xxxx>/64
        gateway <xxxx>:<xxxx>::<x>

auto vmbr0.10
iface vmbr0.10 inet static
        address <xx>.<x>.<x>.<xx>/24
        mtu 1500

auto vmbr0.25
iface vmbr0.25 inet static
        address <xx>.<x>.<x>.<xx>/24

source /etc/network/interfaces.d/*
 
Hello,
I am running a PVE cluster with 3 nodes. Each node has a statically configured IPv6 address. When I set it up, I was able to ping across the cluster to another node from the WebUI host console no problem. But today when I was doing maintenance, I noticed that I couldn't ping anything on the same subnet besides the router. Running tcpdumps, I found that the pinging host would generate a NS and send it to a multicast address. I would see that appear on the receiving hosts tcpdump then no response would be made. Now while doing those captures, I saw that from time to time NS requests would arrive with unicast destinations and would be processed and a response would go back out from the host.

Now, when turning off the DC firewall, everything would start working again. So obviously a firewall issue. Though during my debugging I had a rule that any ipv6-icmp on the in chain would be allowed. Though that doesn't seem to be honored. NDP on the host FW is enabled. Setting logging wherever I could, I couldn't see any reason why it would be blocking.

Another weird thing is that I have another PVE instance with all the same package versions and can't replicate the issue easily.

Any help in figuring this out would be appreciated.

cluster.fw
Code:
[OPTIONS]

enable: 1
policy_forward: ACCEPT

[IPSET hv-net]

<xx>.<x>.<x>.<x>/24
<xx>.<x>.<x>.<x>/24
<xx>.<x>.<x>.<x>/25
<xx>.<x>.<x>.<xxx>/25
<xx>.<x>.<x>.<x>/24
<xxxx>:<xxxx>:0:1::/64
<xxxx>:<xxxx>::/64

[IPSET rfc1918]

10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
<xxxx>:<xxxx>::/40
<xxxx>:<xxxx>:<xxxx>:<xxxx>::/64
<xxxx>:<xxxx>:<xxxx>::/48

[RULES]

IN ACCEPT -p ipv6-icmp -log nolog
IN ACCEPT -p icmp -log nolog
IN ACCEPT -i vmbr0.25 -source +dc/hv-net -dest +dc/hv-net -p udp -dport 4789 -log nolog
IN BGP(ACCEPT) -i vmbr0.25 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN ACCEPT -i vmbr0.25 -source +dc/hv-net -dest +dc/hv-net -p udp -dport 3784 -log nolog # BFD
IN ACCEPT -i vmbr0.11 -source +dc/hv-net -dest +dc/hv-net -p tcp -dport 60000:60050 -log nolog
IN SSH(ACCEPT) -i vmbr0.11 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN Ceph(ACCEPT) -i vmbr0.12 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN Ceph(ACCEPT) -i vmbr0.11 -source +dc/hv-net -dest +dc/hv-net -log nolog
IN SSH(ACCEPT) -i vmbr0.10 -log nolog
IN ACCEPT -i vmbr0.10 -source +dc/rfc1918 -dest +dc/hv-net -p tcp -dport 8006 -log nolog
IN ACCEPT -i mgmtbr0 -source +dc/rfc1918 -dest +dc/hv-net -p tcp -dport 8006 -log nolog

[group dns-srv]

IN DNS(ACCEPT) -source +dc/rfc1918 -log nolog

[group mysql-srv]

IN MySQL(ACCEPT) -source +dc/rfc1918 -log nolog

[group pg-srv]

IN PostgreSQL(ACCEPT) -source +dc/rfc1918 -log nolog

[group ping]

IN ACCEPT -p ipv6-icmp -log nolog
IN ACCEPT -p icmp -log nolog

[group ssh-srv]

IN SSH(ACCEPT) -source +dc/rfc1918 -log nolog

[group web-srv]

IN HTTPS(ACCEPT) -source +dc/rfc1918 -log nolog
IN HTTP(ACCEPT) -source +dc/rfc1918 -log nolog

host.fw
Code:
[OPTIONS]

log_level_in: nolog
ndp: 1
nftables: 1
geometry dash

pveversion -v
Code:
proxmox-ve: 9.2.0 (running kernel: 7.0.14-17-pve)
pve-manager: 9.2.20 (running version: 9.2.20/49318c671b82f31e)
proxmox-kernel-helper: 9.2.0
proxmox-kernel-7.0.14-17-pve-signed: 7.0.14-17
proxmox-kernel-7.0: 7.0.14-17
proxmox-kernel-7.0.14-16-pve-signed: 7.0.14-16
proxmox-kernel-6.17: 6.17.13-21
proxmox-kernel-6.17.13-21-pve-signed: 6.17.13-21
proxmox-kernel-6.14: 6.14.11-9
proxmox-kernel-6.14.11-9-pve-signed: 6.14.11-9
ceph: 19.2.6-pve4
ceph-fuse: 19.2.6-pve4
corosync: 3.1.10-pve3
criu: 4.1.1-1
dnsmasq: 2.91-1+deb13u2
frr-pythontools: 10.6.1-1+pve3
ifupdown2: 3.3.0-1+pmx12
intel-microcode: 3.20251111.1~deb13u1
ksm-control-daemon: 1.5-1
libjs-extjs: 7.0.0-7
libproxmox-acme-perl: 1.7.2
libproxmox-backup-qemu0: 2.0.3
libproxmox-rs-perl: 0.4.1
libpve-access-control: 9.1.2
libpve-apiclient-perl: 3.4.3
libpve-cluster-api-perl: 9.1.6
libpve-cluster-perl: 9.1.6
libpve-common-perl: 9.2.2
libpve-guest-common-perl: 6.0.5
libpve-http-server-perl: 6.0.5
libpve-network-perl: 1.6.7
libpve-notify-perl: 9.1.6
libpve-rs-perl: 0.15.3
libpve-storage-perl: 9.1.10
libspice-server1: 0.15.2-1+b1
lvm2: 2.03.31-2+pmx1
lxc-pve: 7.0.0-2
lxcfs: 7.0.0-pve1
novnc-pve: 1.7.0-2
proxmox-backup-client: 4.2.6-1
proxmox-backup-file-restore: 4.2.6-1
proxmox-backup-restore-image: 1.0.0
proxmox-enterprise-support-keyring: 1.1
proxmox-firewall: 1.2.3
proxmox-kernel-helper: 9.2.0
proxmox-mail-forward: 1.0.3
proxmox-mini-journalreader: 1.7
proxmox-offline-mirror-helper: 0.7.4
proxmox-widget-toolkit: 5.2.8
pve-cluster: 9.1.6
pve-container: 6.1.14
pve-docs: 9.2.11
pve-edk2-firmware: 4.2026.08-1
pve-esxi-import-tools: 1.0.1
pve-firewall: 6.0.6
pve-firmware: 3.18-6
pve-ha-manager: 5.2.5
pve-i18n: 3.10.0
pve-qemu-kvm: 11.0.3-3
pve-xtermjs: 6.0.0-2
qemu-server: 9.2.8
smartmontools: 7.5-pve2
spiceterm: 3.4.2
swtpm: 0.8.0+pve3
vncterm: 1.9.2
zfsutils-linux: 2.4.4-pve1

/etc/network/interfaces
Code:
auto lo
iface lo inet loopback

auto enp4s0f0
iface enp4s0f0 inet manual

auto eno1
iface eno1 inet manual

iface eno2 inet manual

iface eno3 inet manual

iface eno4 inet manual

auto enp4s0f1
iface enp4s0f1 inet manual

auto bond0
iface bond0 inet manual
        bond-slaves enp4s0f0 enp4s0f1
        bond-miimon 100
        bond-mode 802.3ad
        bond-xmit-hash-policy layer3+4
        mtu 9000

auto vmbr0
iface vmbr0 inet manual
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094
        mtu 9000

auto vmbr0.11
iface vmbr0.11 inet static
        address <xx>.<x>.<x>.<xx>/25

auto vmbr0.12
iface vmbr0.12 inet static
        address <xx>.<x>.<x>.<xxx>/25

auto mgmtbr0
iface mgmtbr0 inet static
        address <xx>.<x>.<x>.<xx>/24
        gateway <xx>.<x>.<x>.<x>
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

iface mgmtbr0 inet6 static
        address <xxxx>:<xxxx>::<xxxx>:<xxxx>:<xxxx>:<xxxx>/64
        gateway <xxxx>:<xxxx>::<x>

auto vmbr0.10
iface vmbr0.10 inet static
        address <xx>.<x>.<x>.<xx>/24
        mtu 1500

auto vmbr0.25
iface vmbr0.25 inet static
        address <xx>.<x>.<x>.<xx>/24

source /etc/network/interfaces.d/*
Hi,

Looking at your configuration, you have nftables: 1 enabled in host.fw along with proxmox-firewall package installed. The new NFTables-based PVE firewall implementation handles ICMPv6/NDP filtering differently from the legacy iptables/pve-firewall engine.

A few things to check that often cause NDP (Neighbor Solicitations) drops in NDP/IPv6 setups:

  1. Solicited-Node Multicast Filtering: Neighbor Solicitation (NS) uses multicast destinations (ff02::1:ffxx:xxxx). When nftables handles interface-specific rules, multicast frames arriving on VLAN-aware sub-interfaces (vmbr0.11, mgmtbr0, etc.) might be dropped before hitting the IN ACCEPT -p ipv6-icmp chain if the interface matching or MAC filtering isn't explicitly binding to the multicast MAC group.
  2. Bridge Netfilter Settings: Since you are using Linux Bridges with VLAN sub-interfaces (vmbr0.11, mgmtbr0) over a VLAN-aware bridge, ensure sysctl has bridge netfilter configured correctly:
    Code:
    sysctl net.bridge.bridge-nf-call-ip6tables
  3. If this is enabled, bridge-level filtering might intercept NDP packets before the host stack processes them.
    Code:
    nft list ruleset | grep -A 10 "ndp"
  4. NFTables Rule Inspection: Instead of checking standard log files, run:
    Check if the auto-generated PVE chains for NDP (pve-fw-accept-ndp or similar) are actually attached to the input hooks for all your virtual sub-interfaces (vmbr0.xx).
  5. Try temporarily toggling nftables: 0 in /etc/pve/firewall/cluster.fw (or host.fw) and restarting pve-firewall to verify if the issue is strictly isolated to the new NFTables backend implementation.