linux桥接工作在l2层,按mac转发帧,默认不依赖iptables/nftables;需通过sysctl控制bridge-nf-call参数以决定是否启用netfilter处理,并用ebtables或nftables bridge表实现l2策略。

Linux 桥接本身不依赖 iptables 或 nftables 做“转发规则”——它工作在数据链路层(L2),按 MAC 地址转发帧,默认不检查 IP 层信息,也不受传统网络层防火墙规则直接影响。但实际中常需配合三层控制(如访问限制、NAT、流量重定向),因此“配置桥接转发规则”通常指两类场景:
- 启用/控制桥接内核转发行为(如是否允许跨端口转发、STP、洪泛等)
- 在桥接路径上叠加网络层策略(如用 ebtables 过滤以太帧、用 nftables 处理桥接流量)
下面分两类讲清楚怎么做:
启用并调优 Linux 网桥基础转发行为
网桥的转发由内核 bridge 模块控制,关键参数通过 sysctl 或 ip link 设置:
确保桥接模块已加载:
sudo modprobe bridge创建桥接设备后(如
br0),启用其 L2 转发能力(默认开启,但需确认):sudo ip link set br0 up-
关键 sysctl 参数(写入
/etc/sysctl.conf持久化):-
net.bridge.bridge-nf-call-iptables = 0(默认为 1)→ 若设为 0,表示跳过 iptables 对桥接帧的处理,提升性能,也避免误拦截;设为 1 才会让iptables触发(仅对 IPv4 流量有效) -
net.bridge.bridge-nf-call-ip6tables = 0(同理,控制 IPv6) -
net.bridge.bridge-nf-call-arptables = 0(控制 ARP)⚠️ 注意:这些开关只影响“是否把桥接帧送入 netfilter 链”,不影响桥接本身是否转发。
-
控制 STP(生成树协议)和学习行为:
sudo ip link set dev br0 downsudo ip link set dev br0 address 02:00:00:xx:xx:xx(可选:设唯一 MAC)sudo ip link set dev br0 type bridge stp_state 0(禁用 STP)sudo ip link set dev br0 type bridge forward_delay 0(跳过转发延迟)sudo ip link set dev br0 type bridge ageing_time 300(FDB 条目老化时间,秒)
在桥接路径上添加过滤或策略规则
使用 ebtables(推荐用于 L2 层控制)
ebtables 类似 iptables,但操作以太网帧(源/目的 MAC、协议类型、VLAN 等):
安装(如未预装):
sudo apt install ebtables(Debian/Ubuntu)或sudo yum install ebtables(RHEL/CentOS)示例:禁止某 MAC 地址通过 br0
sudo ebtables -A FORWARD -s 00:11:22:33:44:55 -j DROP示例:只允许特定 VLAN ID 的帧进入桥接
sudo ebtables -A FORWARD -p 802_1Q --vlan-id 100 -j ACCEPTsudo ebtables -A FORWARD -p 802_1Q -j DROP查看规则:
sudo ebtables -L清空规则:
sudo ebtables -F
使用 nftables(现代统一方案,支持 bridge family)
nftables 支持 bridge 表,可原生处理桥接帧,无需 ebtables:
创建 bridge 表:
sudo nft add table bridge filter添加链(hook 在 bridge ingress/egress):
sudo nft add chain bridge filter forward { type filter hook forward priority 0 \; }示例:丢弃来自某 MAC 的帧
sudo nft add rule bridge filter forward ether saddr 00:11:22:33:44:55 drop示例:只允许 DHCP 请求通过(UDP 目标端口 67)
sudo nft add rule bridge filter forward ip protocol udp udp dport 67 acceptsudo nft add rule bridge filter forward drop
✅ 提示:nftables bridge 链生效前提是
net.bridge.bridge-nf-call-iptables = 0(否则帧可能被提前送入 ip*tables,绕过 bridge 表)
不复杂但容易忽略:桥接转发本身是内核自动完成的,所谓“规则”其实是叠加在桥接路径上的策略层;真正要限制通信,优先考虑 ebtables 或 nftables bridge 表,而不是改 iptables 的 nat/filter 链。











