Linux firewalld 的 zone 与 rich rule 在多网卡服务器中的配置模板

2次阅读

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

Linux firewalld 的 zone 与 rich rule 在多网卡服务器中的配置模板

在多网卡 linux 服务器中,firewalld 的 zone 是网络接口(或源地址)的逻辑分组,决定其默认行为;rich rule 则用于在 zone 级别上添加精细控制(如指定端口、协议、源 IP、目标网卡等)。二者配合使用,才能实现“不同网卡走不同策略”的安全隔离目标。

按网卡绑定 zone:确保每个接口归属明确

firewalld 不允许一个接口同时属于多个 zone,因此必须为每张物理/逻辑网卡分配唯一 zone。常见做法是:

  • 将内网卡(如 ens192)设为 trusted 或自定义 internal zone,放行内部服务(sshhttp数据库等)
  • 将公网卡(如 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
text=ZqhQzanResources