firewalld区域机制是实现集群网络平面逻辑隔离的核心,需按公网、内网、管理面分别绑定public、internal、trusted等区域,并通过富规则精细控制源地址与端口访问,配置后必须永久设置并重载生效。

在复杂分布式集群环境中,单纯开放端口或启用几个服务远远不够。关键在于利用 firewalld 的区域(zone)机制,把不同网络平面按安全等级逻辑隔离,再配合富规则和接口绑定实现精细化控制。
按网络平面划分并绑定区域
集群通常包含至少三类网络:公网接入面、内部服务通信面、节点间管理面。不能全塞进 public 区域。
- 查当前所有区域:firewall-cmd --get-zones
- 查看默认区域:firewall-cmd --get-default-zone
- 将公网网卡(如 eth0)绑定到 public 区域:firewall-cmd --permanent --zone=public --add-interface=eth0
- 将内网网卡(如 eth1)绑定到 internal 区域:firewall-cmd --permanent --zone=internal --add-interface=eth1
- 设置 internal 为默认区域(适用于多数节点):firewall-cmd --set-default-zone=internal
为各区域定制最小化服务策略
每个区域只放行该平面真正需要的协议,禁用默认继承的不必要服务。
- public 区域(对外暴露):仅保留 ssh、https,禁用 dhcpv6-client 等内网服务:firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
- internal 区域(集群内部):启用 etcd、kube-apiserver、prometheus-metrics 等自定义服务,或直接开放端口段:firewall-cmd --permanent --zone=internal --add-port=2379-2380/tcp
- trusted 区域(仅限监控/运维跳板机):可绑定特定源 IP 段,而非接口:firewall-cmd --permanent --zone=trusted --add-source=10.10.50.0/24
用富规则实现细粒度访问控制
当需限制“谁可以访问什么”,而不仅是“哪个端口开放”,富规则是刚需。
- 只允许 Kubernetes master 节点访问 worker 节点的 10250(kubelet API):firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="10.10.10.10" port port="10250" protocol="tcp" accept'
- 拒绝来自某异常子网的所有连接:firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.200.0/24" reject'
- 对 etcd 集群做源地址+端口双重匹配,防止横向扫描:firewall-cmd --permanent --zone=internal --add-rich-rule='rule family="ipv4" source address="10.10.0.0/16" port port="2379" protocol="tcp" accept'
持久化与验证要点
配置完必须 reload 才生效,且要确认运行时与磁盘配置一致。
- 重载全部规则:firewall-cmd --reload
- 检查当前运行时配置:firewall-cmd --list-all-zones
- 确认某接口归属区域:firewall-cmd --get-zone-of-interface=eth1
- 验证某端口是否真被放行(从对端测试):nc -zv 10.10.1.5 2379
- 日志排查建议开启:firewall-cmd --set-log-denied=all(记录所有被拒流量,日志在 /var/log/firewalld)

















