在Linux桥接模式下必须使用iptables的physdev模块实施二层访问控制,该模块依赖br_netfilter内核支持,通过--physdev-in/--physdev-out等选项匹配物理/虚拟接口进出路径,仅适用于FILTER表FORWARD链。

在 Linux 桥接模式下,要对特定物理网卡(如 enp3s0)或虚拟接口(如 tap0)实施二层层面的访问控制,必须使用 iptables 的 physdev 模块——它专为透明桥接环境设计,能在数据包尚未进入 IP 层路由判断前,依据其实际进出的物理/虚拟端口进行匹配。
确认内核和模块支持
physdev 依赖内核启用桥接连接跟踪(CONFIG_BRIDGE_NETFILTER=y)及相应模块。运行以下命令验证:
-
lsmod | grep br_netfilter—— 若无输出,执行modprobe br_netfilter -
cat /proc/sys/net/bridge/bridge-nf-call-iptables应返回1;若为0,运行echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables - 确保
iptables已加载 physdev 扩展:iptables -m physdev -h不报错即表示可用
理解 physdev 的关键匹配选项
该模块不依赖 IP 层信息,而是识别数据包在桥设备上的“物理”进出路径:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
--physdev-in:匹配从指定接口(如tap0)进入桥的包(即源侧为该接口) -
--physdev-out:匹配从指定接口(如enp3s0)离开桥的包(即目的侧为该接口) -
--physdev-is-in:等价于--physdev-in,但更强调“当前处于桥输入路径” -
--physdev-is-out:等价于--physdev-out,强调“当前处于桥输出路径” -
--physdev-is-bridged:匹配所有经桥转发(非本机收发)的数据包,常用于放行整条桥转发链
典型桥接防火墙规则写法
假设桥接设备为 br0,连接物理网卡 enp3s0 和虚拟机接口 tap0:
- 允许桥接转发基础通行(必需前置):
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT - 禁止虚拟机(
tap0)主动访问除指定外网 IP 外的所有地址:iptables -A FORWARD -m physdev --physdev-in tap0 ! -d 203.0.113.5 -j DROP - 允许物理网卡侧发起连接访问虚拟机,并只允许已建立连接的响应返回:
iptables -A FORWARD -m physdev --physdev-in enp3s0 --physdev-out tap0 -m state --state ESTABLISHED,RELATED -j ACCEPTiptables -A FORWARD -m physdev --physdev-in tap0 --physdev-out enp3s0 -m state --state NEW -j DROP - 记录异常 ICMP 流量(带限速):
iptables -A FORWARD -m physdev --physdev-is-in -p icmp -m limit --limit 5/minute -j LOG --log-prefix "BRIDGE-ICMP: "
注意事项与调试建议
physdev 规则仅在 FILTER 表的 FORWARD 链生效,不能用于 INPUT 或 OUTPUT;规则顺序至关重要,需将 --physdev-is-bridged 放在最前以避免被其他规则拦截;调试时可用 iptables -L FORWARD -v -n 查看匹配计数,确认规则是否命中;若使用 firewalld,需注意它可能覆盖或干扰 raw iptables 规则,建议禁用 firewalld 或通过 firewall-cmd --direct 注入 physdev 规则。

















