1. firewalld
firewalld 是 CentOS 7/RHEL 7 及以上版本默认的动态防火墙管理工具,替代了传统的 iptables service。它的核心优势是动态更新防火墙规则 ,无需重启服务即可生效,同时引入了区域(zone) 、服务(service) 等抽象概念,简化了防火墙配置。
a. 核心概念
firewalld 基于 iptables/nftables 内核机制实现,通过高层抽象封装了复杂的链规则配置,核心概念如下:
i. 区域(Zone)
区域是 firewalld 的核心,是预设的安全策略集合,不同区域对应不同的信任级别。firewalld 会根据网卡的网络环境,为其分配对应的区域,区域内的规则决定了该网卡的流量管控策略。
| 区域名称 | 安全级别 | 默认策略(入站流量) | 典型场景 |
|---|---|---|---|
trusted |
最低(全信任) | 允许所有流量 | 本地内网、信任的服务器集群 |
home |
低(拒绝) | 允许常见服务(ssh、mdns、samba、ipp-client、dhcpv6-client等) | 家庭网络 |
internal |
低 | 同 home |
企业内部网络 |
work |
中 | 允许ssh、ipp-client、dhcpv6-client | 办公网络 |
public |
中(默认区域) | 仅允许 ssh、dhcpv6-client | 公共网络(如咖啡馆、机房) |
external |
中 | 同 public + 开启伪装(NAT) | 路由器外网接口 |
dmz |
中 | 仅允许指定服务 | 非军事区(外网可访问服务器 WEB/DB) |
block |
高 | 拒绝所有流量(返回 icmp-host-prohibited) | 不信任网络需要严格隔离的主机 |
drop |
最高 | 丢弃所有流量(无任何响应) | 高安全需求场景,高风险静默拦截 |
ii. 服务(Service)
服务是 预定义的端口+协议的集合 ,firewalld 内置了常见服务的配置(如 ssh 对应 22/tcp、http 对应 80/tcp),避免用户手动配置端口和协议的映射关系。
服务配置文件位置:
- 系统默认服务:
/usr/lib/firewalld/services/(不建议修改) - 自定义服务:
/etc/firewalld/services/(优先级更高)
iii. 富规则(Rich Rule)
富规则是 firewalld 提供的精细化规则配置语法 ,支持对源地址、目标地址、端口、协议、动作(允许/拒绝/丢弃)进行精准控制,适用于复杂的防火墙策略。
iiii. 运行时配置 vs 永久配置
- 运行时配置:临时生效,防火墙重启或重载后失效,用于测试规则。
- 永久配置 :写入配置文件,需执行
reload或重启服务后生效,用于生产环境。
b. firewalld 基本操作(firewall-cmd 命令)
firewall-cmd 是 firewalld 的命令行管理工具,所有操作都通过该命令完成,核心参数如下:
i. 服务状态管理
bash
# 查看 firewalld 状态(running/not running)
firewall-cmd --state
# 启动/停止/重启 firewalld
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
# 设置开机自启/关闭开机自启
systemctl enable firewalld
systemctl disable firewalld
ii. 区域管理
bash
# 查看所有可用区域
firewall-cmd --get-zones
# 查看默认区域
firewall-cmd --get-default-zone
# 设置默认区域(永久生效)
firewall-cmd --set-default-zone=public --permanent
# 查看当前系统所有网卡对应的区域
firewall-cmd --get-active-zones
# 将网卡 eth0 加入 public 区域(永久生效)
firewall-cmd --zone=public --add-interface=eth0 --permanent
# 查看指定区域的所有规则
firewall-cmd --zone=public --list-all
# 查看所有区域的规则
firewall-cmd --list-all-zones
iii. 端口与服务管理
(1)服务管理
bash
# 查看所有支持的服务
firewall-cmd --get-services
# 允许 http 服务通过 public 区域(临时生效)
firewall-cmd --zone=public --add-service=http
# 允许 http 服务通过 public 区域(永久生效)
firewall-cmd --zone=public --add-service=http --permanent
# 移除 public 区域的 http 服务(永久生效)
firewall-cmd --zone=public --remove-service=http --permanent
(2)端口管理
当需要开放非预设服务的端口时,直接配置端口:
bash
# 允许 8080/tcp 端口通过 public 区域(临时生效)
firewall-cmd --zone=public --add-port=8080/tcp
# 允许 8080-8090/tcp 端口段通过 public 区域(永久生效)
firewall-cmd --zone=public --add-port=8080-8090/tcp --permanent
# 移除 public 区域的 8080/tcp 端口(永久生效)
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
iiii. 规则重载与生效
firewalld 规则修改后,需执行重载命令让永久配置生效,且不会中断现有连接:
bash
# 重载规则(永久配置生效,运行时配置保留)
firewall-cmd --reload
# 将运行时配置保存为永久配置
firewall-cmd --runtime-to-permanent
iiiii. 富规则配置
富规则支持源地址限制、端口转发、日志记录等高级功能,语法格式:
rule [family="ipv4|ipv6"] [source address="x.x.x.x/xx" [invert="True"]]
[port port="port|port-range" protocol="tcp|udp"]
[log [prefix="prefix text"] [level="log-level"] [limit value="rate/duration"]]
[accept|reject|drop]
示例1:允许 192.168.1.100 访问 22/tcp 端口
bash
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="22" protocol="tcp" accept' --permanent
示例2:拒绝 10.0.0.0/24 网段的所有流量
bash
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" reject' --permanent
示例3:允许 80/tcp 端口并记录日志
bash
firewall-cmd --zone=public --add-rich-rule='rule port port="80" protocol="tcp" log prefix="HTTP-LOG" level="info" accept' --permanent
iiiiii. 端口转发与 NAT(伪装)
(1)开启伪装(NAT)
伪装功能用于 LAN 内主机通过防火墙访问外网 ,需在 external 等区域开启:
bash
# 开启 public 区域的伪装功能(永久生效)
firewall-cmd --zone=public --add-masquerade --permanent
# 关闭伪装功能
firewall-cmd --zone=public --remove-masquerade --permanent
(2)端口转发
将防火墙的 80 端口转发到内网 192.168.1.200 的 8080 端口:
bash
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.200:toport=8080 --permanent
c. 配置文件详解
firewalld 的配置文件分为 系统配置 和 用户自定义配置,用户自定义配置优先级高于系统配置。
- 系统配置目录 :
/usr/lib/firewalld/- 包含默认的区域、服务配置,不建议修改,升级系统时可能被覆盖。
- 用户自定义配置目录 :
/etc/firewalld/- 区域配置:
/etc/firewalld/zones/(每个区域对应一个.xml文件) - 服务配置:
/etc/firewalld/services/(每个服务对应一个.xml文件) - 富规则会直接写入对应区域的
.xml文件中。
- 区域配置:
d. firewalld 与 iptables 的区别
| 特性 | firewalld | iptables |
|---|---|---|
| 规则生效方式 | 动态更新,无需重启服务 | 静态更新,需重启 iptables 服务 |
| 核心抽象 | 区域、服务、富规则 | 链(PREROUTING/INPUT/FORWARD等)、规则 |
| 配置复杂度 | 低,适合新手和快速配置 | 高,需理解链的流转逻辑 |
| 适用场景 | 服务器日常防火墙管理 | 复杂网络环境的精细化规则定制 |
| 底层依赖 | 基于 iptables/nftables 内核模块 | 直接操作内核 netfilter 子系统 |
e. 常见问题与注意事项
-
规则不生效?
- 检查是否区分运行时/永久配置 ,修改永久配置后需执行
firewall-cmd --reload。 - 检查网卡是否分配到正确的区域。
- 检查是否有其他防火墙工具(如
ufw)冲突,需关闭其他工具。
- 检查是否区分运行时/永久配置 ,修改永久配置后需执行
-
如何批量导入/导出规则?
- 导出规则:
firewall-cmd --list-all-zones > firewalld-rules.txt - 导入规则:将规则写入
/etc/firewalld/zones/对应的.xml文件,然后reload。
- 导出规则:
-
firewalld 启动失败?
- 检查是否与
iptables service冲突,执行systemctl stop iptables后重试。 - 检查配置文件是否有语法错误,可通过
firewall-cmd --check-config验证
- 检查是否与