区域(Zone)是 firewalld 最核心的概念,简单来说就是预定义的信任级别模板。你可以把区域想象成几套预设好的防火墙规则集合,根据不同的网络环境(家里、公司、咖啡厅)快速切换。
一、区域的核心原则
firewalld 在区域方面遵循严格的原则:
| 原则 | 说明 |
|---|---|
| 流量只流入一个区域 | 每个网络接口只能属于一个区域 |
| 流量只流出一个区域 | 出口流量同样遵循区域规则 |
| 一个区域定义一个信任级别 | 不同区域代表不同信任程度 |
| 默认允许区域内流量 | 同一区域内的通信默认允许 |
| 默认拒绝区域间流量 | 不同区域间的流量默认拒绝 |
二、预定义区域详解
firewalld 默认提供了9个预定义区域,按信任级别从高到低排列:
| 区域 | 信任级别 | 默认规则 | 适用场景 | 预定义允许的服务 |
|---|---|---|---|---|
| trusted | ⭐⭐⭐⭐⭐ 最高 | 允许所有流量 | 内部网络、完全可信环境 | 所有服务 |
| home | ⭐⭐⭐⭐ 高 | 拒绝流入,除非与流出相关 | 家庭网络 | ssh、mdns、ipp-client、amba-client、dhcpv6-client |
| internal | ⭐⭐⭐⭐ 高 | 拒绝流入,除非与流出相关 | 内部网络 | 同 home 区域 |
| work | ⭐⭐⭐ 中高 | 拒绝流入,除非与流出相关 | 工作网络 | ssh、ipp-client、dhcpv6-client |
| public | ⭐⭐ 中低 | 拒绝流入,除非与流出相关 | 公网环境(默认区域) | ssh、dhcpv6-client |
| external | ⭐⭐ 中低 | 拒绝流入,除非与流出相关 | 外部网络(启用了伪装) | ssh |
| dmz | ⭐ 低 | 拒绝流入,除非与流出相关 | 隔离区(DMZ) | ssh |
| block | ⭐ 低 | 拒绝所有流入 | 严格限制环境 | 无 |
| drop | ⚠️ 最低 | 丢弃所有流入(无响应) | 最高安全要求 | 无 |
各区域详细说明
| 区域 | 详细说明 |
|---|---|
| trusted | 接受所有网络连接,完全信任 |
| home | 适用于家庭环境,基本信任网络上其他计算机。拒绝流入流量,除非与流出相关;允许ssh、mdns、ipp-client、amba-client、dhcpv6-client等服务 |
| internal | 等同于 home 区域 |
| work | 适用于工作环境,大多信任网络上其他计算机。允许ssh、ipp-client、dhcpv6-client等服务 |
| public | 默认区域,适用于公共网络,不信任其他计算机。只允许ssh、dhcpv6-client等基本服务 |
| external | 适用于启用了伪装的外部网络,特别是路由器。不信任网络上其他计算机,只允许ssh服务 |
| dmz | 适用于DMZ中的计算机,可对内部网络有限权限访问,只允许ssh服务 |
| block | 拒绝所有流入网络连接,对于IPv4返回icmp-host-prohibited,对于IPv6返回icmp6-adm-prohibited |
| drop | 丢弃所有流入数据包,不返回任何通知 |
三、区域管理常用命令
3.1 查看区域信息
# 查看默认区域(默认为 public)
firewall-cmd --get-default-zone
# 查看所有可用区域
firewall-cmd --get-zones
# 查看当前活动的区域(已绑定网卡的)
firewall-cmd --get-active-zones
# 查看指定区域的详细信息
firewall-cmd --zone=public --list-all
# 查看所有区域的详细信息
firewall-cmd --list-all-zones
3.2 修改默认区域
# 将默认区域改为 work
sudo firewall-cmd --set-default-zone=work
# 验证
firewall-cmd --get-default-zone
3.3 网卡与区域绑定
# 查看某网卡所属区域
firewall-cmd --get-zone-of-interface=eth0
# 将 eth0 网卡绑定到 internal 区域
sudo firewall-cmd --zone=internal --change-interface=eth0
# 永久绑定(重启后仍生效)
sudo firewall-cmd --permanent --zone=internal --change-interface=eth0
sudo firewall-cmd --reload
3.4 基于源地址的区域绑定
# 将特定源IP绑定到 trusted 区域
sudo firewall-cmd --permanent --zone=trusted --add-source=192.168.1.100
# 将源网段绑定到 internal 区域
sudo firewall-cmd --permanent --zone=internal --add-source=192.168.1.0/24
# 查看源绑定
firewall-cmd --zone=trusted --list-sources
四、实际应用场景
场景1:多网卡服务器
# 公网接口(eth0)使用 public 区域
sudo firewall-cmd --zone=public --change-interface=eth0
# 内网接口(eth1)使用 trusted 区域(完全信任)
sudo firewall-cmd --zone=trusted --change-interface=eth1
# 管理接口(eth2)使用 internal 区域
sudo firewall-cmd --zone=internal --change-interface=eth2
场景2:为特定IP开放特权
# 将管理员IP加入 trusted 区域,不受限制
sudo firewall-cmd --permanent --zone=trusted --add-source=10.0.0.100
# 将内部网段加入 internal 区域,允许更多服务
sudo firewall-cmd --permanent --zone=internal --add-source=192.168.1.0/24
场景3:应急切换
# 检测到攻击时,临时将默认区域改为 drop(最高防护)
sudo firewall-cmd --set-default-zone=drop
# 攻击结束后恢复
sudo firewall-cmd --set-default-zone=public
五、最佳实践建议
| 建议 | 说明 |
|---|---|
| 默认区域保持 public | 除非有明确需求,不要随意更改默认区域 |
| 明确指定 –zone | 添加规则时尽量指定区域,避免依赖默认区域 |
| 接口与区域绑定 | 不同网络接口绑定不同区域,实现精细化控制 |
| 源地址绑定优先 | 特定IP或网段可以绑定到更高信任级别的区域 |
| 定期审查 | 用 --list-all-zones 定期检查所有区域配置 |
一句话总结
firewalld 区域(Zone)是按信任级别划分的防火墙策略模板,从完全信任的 trusted 到完全丢弃的 drop,每个区域预定义了不同的默认规则,通过将网卡或源地址绑定到不同区域,实现网络流量的精细化控制。
发表回复