iptables的MAC地址匹配仅限INPUT和FORWARD链,通过-m mac --mac-source指定源MAC,仅对入站及转发流量有效,不适用于OUTPUT、PREROUTING及跨NAT/虚拟桥接场景。

iptables 可以匹配 MAC 地址,但仅限于特定链和特定网络路径——它不是通用的二层准入工具,而是需要严格匹配“流量是否经过本机 INPUT 或 FORWARD 链早期阶段”这一前提。真正可靠的局域网设备准入,应分层设计:用 ebtables 做第一道物理层过滤,iptables 做第二道协议层控制。
MAC 匹配只在 INPUT 和 FORWARD 链有效
iptables 的 -m mac 模块只能识别数据帧的源 MAC 地址(--mac-source),且仅对以下两类流量生效:
- 发往本机的入站包(走 INPUT 链),例如 SSH 登录、HTTP 管理界面访问
- 经本机转发的包(走 FORWARD 链),常见于软路由、OpenWrt、启用了 ip_forward 的 Linux 网关
它对 OUTPUT 链无效(本机发出的包已无原始 MAC 上下文);对 PREROUTING 链支持不稳定;对跨路由器、NAT、虚拟化桥接(如 Docker、KVM 默认桥)的流量基本失效——因为中间设备已重写 MAC,到达时只剩上一跳地址。
正确写法与关键细节
规则语法必须规范,否则静默失败:
- MAC 地址必须小写、冒号分隔:00:11:22:33:44:55,不能是
00-11-22-33-44-55或大写 - 只支持 --mac-source,没有
--mac-dest参数 - 规则顺序很重要:拒绝规则(DROP)必须放在允许规则(ACCEPT)之后插入,否则会提前截断所有匹配流量
- 务必加兜底规则,例如只允某个 MAC 访问 SSH:
iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -p tcp --dport 22 -j ACCEPTiptables -A INPUT -m mac ! --mac-source 00:11:22:33:44:55 -j DROP
OpenWrt 等嵌入式系统中的实用配置
在 OpenWrt 这类软路由场景中,MAC 控制常用于限制终端上网权限:
- 禁止某设备访问外网(但允许其访问路由器本身):
iptables -I FORWARD -m mac --mac-source 00:11:22:33:44:55 -j DROP - 只允许该设备访问局域网(禁公网):
iptables -I FORWARD -m mac --mac-source 00:11:22:33:44:55 -j DROPiptables -I FORWARD -d 192.168.0.0/16 -m mac --mac-source 00:11:22:33:44:55 -j ACCEPTiptables -I FORWARD -d 172.16.0.0/12 -m mac --mac-source 00:11:22:33:44:55 -j ACCEPTiptables -I FORWARD -d 10.0.0.0/8 -m mac --mac-source 00:11:22:33:44:55 -j ACCEPT - 持久化需写入
/etc/config/firewall,用option mac 'xx:xx:xx:xx:xx:xx'字段声明,并注意option dest 'wan'表示作用于 FORWARD 链
为什么推荐优先用 ebtables?
当你的目标是纯二层准入(比如访客网络隔离、打印机服务器直连管控、虚拟机桥接环境),ebtables 是更自然的选择:
- 工作在网桥层,天然可见原始以太网帧,不受 IP 层干扰
- 支持 INPUT、OUTPUT、FORWARD 三链,可精准控制“帧能否到达本机网卡”
- 典型白名单操作:
ebtables -A INPUT -s 00:11:22:33:44:55 -j ACCEPTebtables -A INPUT -j DROP - 需确保内核加载
ebtable_filter模块,且网卡处于网桥模式(非传统路由接口)

















