firewalld通过zone绑定网卡实现策略隔离,再用rich rule进行跨zone精细控制;需按接口唯一分配zone,配合--permanent和--reload确保持久生效。

在多网卡 Linux 服务器中,firewalld 的 zone 是网络接口(或源地址)的逻辑分组,决定其默认行为;rich rule 则用于在 zone 级别上添加精细控制(如指定端口、协议、源 IP、目标网卡等)。二者配合使用,才能实现“不同网卡走不同策略”的安全隔离目标。
按网卡绑定 zone:确保每个接口归属明确
firewalld 不允许一个接口同时属于多个 zone,因此必须为每张物理/逻辑网卡分配唯一 zone。常见做法是:
- 将内网卡(如 ens192)设为 trusted 或自定义 internal zone,放行内部服务(SSH、HTTP、数据库等)
- 将公网卡(如 ens224)设为 public zone,仅开放必要端口(如 80/443/22),并启用伪装(masquerade)以支持 SNAT
- 使用
firewall-cmd --permanent --zone=internal --change-interface=ens192绑定接口 - 确认绑定结果:
firewall-cmd --get-active-zones应显示各接口归属清晰
用 rich rule 实现跨 zone 精准控制
默认 zone 策略较粗粒度,rich rule 可突破 zone 边界做定向放行或拒绝。典型场景包括:
- 只允许特定内网 IP(如 10.10.5.100)通过 ens192 访问本机 SSH:
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="10.10.5.100" port port="22" protocol="tcp" accept' - 禁止某恶意段(203.0.113.0/24)通过公网卡访问任何服务:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" reject' - 限制某服务(如 Redis)仅响应来自内网卡的请求(即使服务监听 0.0.0.0):
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="10.10.0.0/16" port port="6379" protocol="tcp" accept'
避免常见陷阱:优先级与持久化
rich rule 按添加顺序匹配(先匹配先生效),且优先级高于 zone 默认策略。务必注意:
- 所有命令加
--permanent,否则重启 firewalld 后丢失 - 执行
firewall-cmd --reload才能生效(不中断连接) - 不要混用
--add-service和 rich rule 控制同一端口——rich rule 会覆盖 service 规则 - 若需基于出接口过滤(如强制某流量从 ens224 出),rich rule 无法做到,需结合 ip rule + ip route 或 nftables
验证与调试建议
配置完成后,用以下方式确认实际生效逻辑:
-
firewall-cmd --zone=public --list-all查看 public zone 的 interfaces、services 和 rich rules -
firewall-cmd --direct --get-all-rules检查是否有误加的 direct rules 干扰 - 从不同网段发起测试连接(如 telnet、curl),观察是否符合预期
- 启用日志记录可疑拒绝:
firewall-cmd --permanent --set-log-denied=all,再查/var/log/firewalld










