firewalld是主流linux发行版默认防火墙,通过zone+service抽象层和rich rules实现可响应、可收敛、可验证的动态策略体系,支持d-bus联动与运行时自动同步。

要让系统防火墙支撑高动态业务网络流量的安全防护,关键不是堆规则,而是构建可响应、可收敛、可验证的策略体系。firewalld 是当前主流发行版(RHEL 8+/CentOS Stream/Fedora/Ubuntu 22.04+)的默认选择,它天然适配动态场景;iptables 或 nftables 更适合底层精细控制,但需自行管理状态与原子性。
用好 zone + service 抽象层,避免硬写端口
高动态业务常伴随服务自动扩缩、端口随机分配(如 NodePort、临时 Admin API)、多租户隔离等需求。直接在 INPUT 链里加 --dport 30001-32767 这类宽泛规则极不安全。
- 把业务网卡绑定到
internal或自定义区域(如app-tier),而非默认public - 为每个微服务定义独立 service 文件(例如
/etc/firewalld/services/payment-api.xml),明确声明协议、端口、模块依赖(如nf_conntrack_sctp) - 用
--add-service=payment-api --zone=app-tier控制访问,后续端口变更只需更新 service 定义,不碰运行时规则
启用富规则(Rich Rules)做上下文感知控制
单纯允许/拒绝已不够。真实业务流量有来源可信度、连接频次、会话生命周期等维度。
- 限制单 IP 每分钟最多 30 个新连接:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.0.0/16" port port="8080" protocol="tcp" limit value="30/m" accept' - 仅允许来自负载均衡器 VIP 的健康检查请求:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.50.10" port port="8080" protocol="tcp" accept' - 对内部调用链路开启 connmark 标记,配合 SELinux 策略做进程级流控(需启用
nf_conntrack_netlink)
对接运行时状态,实现策略自动同步
静态配置无法应对服务发现、滚动发布、蓝绿切换等动作。firewalld 提供 d-bus 接口和 firewall-offline-cmd 工具,支持与运维平台联动。
- 在 Kubernetes DaemonSet 中部署轻量 agent,监听
EndpointSlice变更,调用firewall-cmd --add-source动态加入后端 Pod CIDR - 使用 Ansible +
firewalld模块,在 CI/CD 流水线中将服务部署与防火墙策略更新合并为原子任务 - 对无状态服务,设置
--timeout=300添加临时规则,超时自动清理,避免残留
必须开启的配套机制
仅靠防火墙本身不能构成完整防护。以下三项需同步启用:
-
连接跟踪强化:确保
net.netfilter.nf_conntrack_max足够大(建议 ≥ 500000),并启用nf_conntrack_tcp_be_liberal=1应对短连接洪峰 -
SELinux 深度协同:启用
booleans如httpd_can_network_connect和container_manage_cgroup,让策略在进程级生效 -
日志与审计闭环:配置
firewalld.conf中LogDenied=all,并将日志接入集中 SIEM(如 Wazuh/Elastic Security),设置规则匹配REJECT高频 IP 自动封禁











