firewalld通过区域(zone)分层、ipset+富规则动态控制、连接跟踪优化及带前缀日志审计,构建可扩展、可追溯、分层收敛的分布式链路隔离策略模型。

配置系统防火墙支持复杂分布式系统网络链路隔离,核心不是堆砌规则,而是建立可扩展、可追溯、分层收敛的策略模型。重点在于把“链路”抽象为可识别的流量特征(源/目的网段、服务角色、协议行为),再通过防火墙机制精准控制其互通边界。
按业务角色划分区域并绑定接口或源网段
firewalld 的 zone 是实现链路级隔离最自然的起点。不要用默认 public 区域承载所有外部流量,应为每个关键链路角色创建专属 zone:
- 为服务注册中心(如 Consul、Nacos)单独建 registry 区域,只允许来自 app-server 和 ingress-gateway 区域的 8500/8848 端口 TCP 流量
- 为数据库集群建 db-backend 区域,仅放行来自 app-server 区域的 3306/5432/6379 端口,且限制单 IP 每秒连接数(用 rich rule 实现)
- 将 API 网关出口流量绑定到 egress-proxy 区域,启用 masquerade 并限制 outbound 目标子网(如只允许访问 SaaS 域名对应 CIDR)
用 ipset + rich rule 实现跨链路动态策略
静态端口开放无法应对微服务间频繁变更的调用关系。推荐组合使用 ipset 和 rich rule:
- 创建 ipset 集合:
ipset create svc-a hash:net、ipset create svc-b hash:net,分别存入 A 服务和 B 服务的 Pod CIDR 或 Service ClusterIP 段 - 添加富规则:仅允许 svc-a 主动发起对 svc-b 的 8080 端口调用,反向禁止:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="svc-a" destination ipset="svc-b" port port="8080" protocol="tcp" accept'firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="svc-b" destination ipset="svc-a" port port="8080" protocol="tcp" reject' - 后续只需更新 ipset 成员(
ipset add svc-a 10.244.1.0/24),无需重载整个防火墙
启用连接跟踪与状态精细化控制
分布式链路常含长连接(gRPC、WebSocket)、健康检查探针、Sidecar 保活心跳。需避免因 conntrack 表溢出或超时导致链路中断:
- 调大连接跟踪表:在
/etc/sysctl.conf中设net.netfilter.nf_conntrack_max = 131072,执行sysctl -p - 为服务发现心跳单独设置较短超时:
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8500 -m connlimit --connlimit-above 50 -j DROP - 对 gRPC 流量启用 connection-mark 标记,配合 nftables 做会话保持(若用 nftables 替代 firewalld)
日志与可观测性闭环
隔离策略生效后必须能验证、能审计、能回溯。单纯 DROP 不够,要让每条拒绝有据可查:
- 启用带前缀的日志记录:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.244.0.0/16" reject with icmp-host-prohibited log prefix="DENY-INTER-SVC:"' - 将 journal 日志路由至专用文件:
systemd-journald配置中加ForwardToSyslog=yes,再用 rsyslog 抽取含DENY-INTER-SVC的条目到/var/log/firewall-inter-svc.log - 定期用
journalctl -u firewalld --since "1 hour ago" | grep DENY-INTER-SVC检查异常调用模式











