Firewalld通过区域(zone)实现策略化网络隔离,预置trusted、home、internal、work、public、external、dmz、block、drop九类区域,按信任度降序排列;支持按接口或源地址绑定区域,并需显式配置跨区转发与富规则以实现精细控制。

Firewalld 在 CentOS 中通过“区域(zone)”实现网络流量的策略化管理,不同区域对应不同的默认行为和信任级别,合理划分区域是实现网络隔离的关键一步。
常见区域及其默认用途
Firewalld 预置多个区域,按信任程度从高到低排列:
- trusted:完全信任,所有连接均被接受,适合内网管理接口或跳板机本地环回
- home:用于家庭网络,允许 DHCP、DNS、SSH、Samba 等常用服务,禁止外部主动发起的非白名单连接
- internal:类似 home,但更常用于企业内部可信网络,可自定义开放更多内部服务端口
- work:办公网络场景,比 public 更宽松,通常启用 SSH、DHCP 客户端等
- public:默认区域,适用于公共网络(如云服务器外网),仅开放明确声明的服务,拒绝未授权连接
- external:用作 NAT 网关外部接口,启用伪装(masquerade),限制入站连接
- dmz:非军事区,面向外部提供有限服务(如 Web、SMTP),严格限制其他端口
- block:拒绝所有入站连接(ICMP 除外),仅允许已建立或相关连接
- drop:最严格区域,直接丢弃所有入站数据包,不返回任何响应(包括 ICMP)
按接口/源地址绑定区域实现隔离
Firewalld 支持为不同网络接口或 IP 段分配独立区域,这是网络隔离的核心实践方式:
- 将内网接口(如 ens192)设为 internal 区域,开放数据库端口(3306)、Redis(6379)等内部服务
- 将公网接口(如 ens18)设为 public 区域,只开放 80/443/22,并禁用 ping(
firewall-cmd --zone=public --remove-icmp-block=echo-request) - 对特定运维 IP 段(如 192.168.10.0/24)添加富规则,临时提升访问权限:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' - 使用 source-based zone 实现更细粒度控制:将某业务子网(如 10.20.30.0/24)直接绑定到 dmz 区域,绕过接口限制:
firewall-cmd --permanent --zone=dmz --add-source=10.20.30.0/24
跨区域通信与转发控制
当需要允许不同区域间通信时,不能仅靠开放端口,必须显式配置转发策略:
- 若 internal 区域需访问 public 区域上的 Web 服务,需在 public 区域启用 masquerade 并允许相关服务:
firewall-cmd --permanent --zone=public --add-masqueradefirewall-cmd --permanent --zone=public --add-service=http - 禁止 internal → dmz 的反向访问(如 DB 不暴露给 DMZ 主机),可在 dmz 区域设置 rich rule 拦截:
firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" source zone="internal" reject' - 启用 IP 转发后,firewalld 默认不自动放行跨接口转发,需手动开启:
firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.10.1.5
验证与调试要点
配置后务必验证实际效果,避免策略失效或过度封锁:
- 查看接口所属区域:
firewall-cmd --get-active-zones - 检查某区域当前开放的服务/端口:
firewall-cmd --zone=public --list-all - 确认富规则是否生效:
firewall-cmd --list-rich-rules(注意该命令不显示 zone,需配合 --zone 参数) - 测试连通性时,优先用
telnet或nc -zv验证端口,而非仅 ping;drop 区域下 ping 会静默失败 - 日志排查:启用日志记录(
firewall-cmd --set-log-denied=all),结合journalctl -u firewalld查看拦截详情










