Skip to content

OPNsense 26.4.1 Business Edition: Bridge interface blocks L2-forward for IP (while ARP is working) #10468

Description

@Sumpfdotter

Important notices

Before you add a new report, we ask you kindly to acknowledge the following:

Describe the bug

I am migrating an existing bridge-based VLAN setup from an older OPNsense installation.

The setup follows the documentation for a layer-2-bridge as described here: https://docs.opnsense.org/manual/how-tos/lan_bridge.html

Given a bridge consisting of two VLAN interfaces:

  • vlan0.12.30 (parent: lagg0(igc1,igc2))
  • vlan1.0.30 (parent: ax0)

The bridge itself has an IPv4 address for routing.

The devices behind both vlans can communicate with all other subnets and vice versa (Layer 3, routing involved). But the devices behind vlan0.12.30 cannot communicate with the devices in the same subnet behind vlan1.0.30 and vice vesa (Layer 2, bridging use case).

The surprising part is that the bridge behaves like a transparent Layer-2 bridge for ARP, but requires an explicit Layer-3 pass rule for forwarding IP traffic between bridge members. This is unexpected because no routing is involved.

To Reproduce

Bridge filtering sysctls are set:

net.link.bridge.pfil_bridge=1
net.link.bridge.pfil_member=0
net.link.bridge.pfil_local_phys=0

Steps to reproduce the behavior:

  1. Setup a bridge as described
  2. Connect one client device to vlan0.12.30
  3. Connect another client device to vlan1.0.30
  4. arping from device 1 to device 2 --> passed
  5. ping from device 1 to device 2 --> blocked (default deny / state violation)

Expected behavior

Following the given documentation, I expected a layer-2-bridging, not only for ARP but also for IP. IIRC this was the behavior in the older OPNSense setup, what I unfortunately cannot test anymore.

Describe alternatives you considered

Workaround

Adding the following firewall rule on the BRIDGE interface immediately restores forwarding:

  • Action: Pass
  • Interface: bridge30
  • Source: bridge30 net
  • Destination: bridge30 net
  • Resulting pf rule: pass in log quick on bridge30 inet from (bridge30:network) to (bridge30:network) keep state

Relevant log files

Packet captures show:

  • lagg0: ICMP Echo Request visible
  • vlan0.12.30: ICMP Echo Request visible
  • bridge30: ICMP Echo Request visible
  • vlan1.0.30: NO ICMP packet
  • ax0: NO ICMP packet

Additional context

Has bridge filtering semantics changed recently?

If this is intentional, I think the documentation (e.g. https://docs.opnsense.org/manual/how-tos/lan_bridge.html) should explicitly mention that bridge-local traffic must be permitted by firewall rules on the bridge interface when pfil_bridge=1.

If it is not intentional, this may be a regression.

Environment

Software version used and hardware type if relevant, e.g.:

OPNsense 26.4.1 Business Edition
FreeBSD 14.3-RELEASE-p15
DEC740

Metadata

Metadata

Assignees

No one assigned

    Labels

    supportCommunity support or awaiting triage

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions