firewalld 不直接支持 mac 过滤,仅通过 rich rule 在 ipv4 同一局域网内有限支持 source mac 条件,需配合 ip 绑定并注意规则顺序与内核模块依赖。

firewalld 本身不直接支持基于 MAC 地址的过滤,因为 MAC 层(数据链路层)在防火墙处理流程中已基本完成解析,而 firewalld 运行在网络层(IP 层),其规则基于 IPv4/IPv6 地址、端口、协议等,无法原生匹配源 MAC。但可通过结合底层 netfilter 机制(如 iptables 的 mac 模块)实现,firewalld 提供了有限兼容方式——仅允许在 rich rule 中使用 source mac 条件,且**仅适用于同一局域网内直连的客户端**(即未经过路由器/NAT,流量未被 MAC 地址重写)。
确认前提与限制
使用 MAC 过滤前必须明确:
- 目标主机与访问设备必须处于同一二层网络(如同一交换机或 VLAN),否则中间设备会替换源 MAC,规则失效;
- firewalld 的 rich rule 支持
source mac,但仅限于ipv4family,且不能与port或service混合用于复杂组合(例如“只允许某 MAC 访问 22 端口”需拆解为独立规则逻辑); - 该功能依赖内核
xt_mac模块,主流 CentOS/RHEL/Fedora 默认启用,可执行lsmod | grep mac验证。
添加基于 MAC 的允许规则
例如:仅允许 MAC 地址为 00:11:22:33:44:55 的设备访问本机所有服务(入站):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" accept'
注意:这条规则必须放在其他拒绝规则之前生效(rich rule 按添加顺序匹配,firewalld 不自动排序)。添加后务必重载:
firewall-cmd --reload
配合 IP 规则做精细控制
单纯允许 MAC 仍可能被同网段其他 IP 冒用。更稳妥的做法是“MAC + IP 绑定”(需确保 IP 固定或 DHCP 绑定):
- 先允许指定 MAC 和对应 IP(如
192.168.1.100):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" source mac="00:11:22:33:44:55" accept'
- 再拒绝该 IP 段内其他 MAC(可选,增强隔离):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" source mac!="00:11:22:33:44:55" reject'
最后执行 firewall-cmd --reload 生效。
查看与清理 MAC 相关规则
列出当前所有 rich rules(含 MAC 条件):
firewall-cmd --list-rich-rules
删除某条 MAC 规则(需完整复制原始 rule 字符串):
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" accept'
或清空全部 rich rules(谨慎操作):
firewall-cmd --permanent --remove-rich-rules
实际生产环境中,MAC 过滤应作为辅助手段,优先依赖 IP 白名单、证书认证或应用层鉴权。它适合小范围可信局域网(如实验室、管理终端接入控制),不适合跨路由或云环境。











