firewalld的使用
- [一、firewalld 的介绍](#一、firewalld 的介绍)
-
- [1.1 zone 的概念与查看](#1.1 zone 的概念与查看)
- [1.2 开放端口](#1.2 开放端口)
- [1.3 开放服务](#1.3 开放服务)
- [1.4 重载规则](#1.4 重载规则)
- [1.5 查看规则](#1.5 查看规则)
- [二、firewalld 常用命令](#二、firewalld 常用命令)
- 三、高级配置
-
- [3.1 富规则配置](#3.1 富规则配置)
- [3.2 NAT与端口转发](#3.2 NAT与端口转发)
- [3.3 ICMP控制](#3.3 ICMP控制)
- 四、firewalld与iptables的区别
一、firewalld 的介绍
firewalld 防火墙是 CentOS 7 系统默认的防火墙管理工具,取代了之前的 iptables 防火墙。它同样工作在网络层,属于包过滤防火墙。
主要特性
- 支持 IPv4、IPv6 防火墙设置以及以太网桥。
- 支持服务或应用程序直接添加防火墙规则接口。
- 拥有两种配置模式:临时模式(运行时生效,重启后失效)和永久模式(配置持久化,需重载生效)。
与 iptables 的关系
firewalld 和 iptables 都是用来管理防火墙的工具(属于用户态),用于定义防火墙的各种规则功能。它们的内部结构都指向 netfilter 网络过滤子系统(属于内核态)来实现包过滤防火墙功能。
firewalld 提供了支持网络区域(zone)所定义的网络连接以及接口安全等级的动态防火墙管理工具。
firewalld 定义的 9 个区域(zone)
firewalld 通过"区域(zone)"来管理不同信任级别的网络连接。每个区域预置了一套规则,管理员可以将网络接口或源 IP 地址绑定到特定区域。
下表列出了所有预定义的区域及其默认行为:
| 区域 | 说明 |
|---|---|
| trusted(信任区域) | 允许所有的传入流量。 |
| public(公共区域) | 允许与 ssh 或 dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝 。是新添加网络接口的默认区域。 |
| external(外部区域) | 允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。通常用于伪装的外部网络(如路由器)。 |
| home(家庭区域) | 允许与 ssh、mdns、samba-client 或 dhcpv6-client 预定义服务匹配的传入流量,其他均拒绝。 |
| internal(内部区域) | 默认值与 home 区域相同。 |
| work(工作区域) | 允许与 ssh、dhcpv6-client 预定义服务匹配的传入流量,其他均拒绝。 |
| dmz(隔离区域/非军事区) | 允许与 ssh 预定义服务匹配的传入流量,其他均拒绝。用于对外公开的服务。 |
| block(限制区域) | 拒绝所有传入流量。 |
| drop(丢弃区域) | 丢弃所有传入流量(无回复)。 |
区域(zone)核心概念
- 安全程度由规则决定:一个区域的最终安全程度取决于管理员在该区域中设置的规则。
- 安全门比喻:区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。
- 灵活部署:可以根据网络规模,使用一个或多个区域。但是,任何一个活跃区域至少需要关联源地址或接口。
- 默认配置 :默认情况下,
public区域是默认区域,包含所有接口(网卡)。
1.1 zone 的概念与查看
zone(区域) 是 firewalld 的核心概念,它定义了不同信任级别的网络环境(如 public、home、internal 等),每个区域都预置了一套防火墙规则。通过将网络接口或源 IP 绑定到特定区域,可以快速应用相应的安全策略。
查看所有可用区域:
bash
[root@docker ~]# firewall-cmd --get-zones
block dmz docker drop external home internal nm-shared public trusted work
查看当前默认区域:
bash
firewall-cmd --get-default-zone
查看所有活跃区域及其绑定的接口:
bash
[root@docker ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
1.2 开放端口
开放端口允许外部访问服务器上的特定网络服务。
临时开放端口(重启后失效):
bash
# 开放单个端口(如 TCP 80 端口)
firewall-cmd --add-port=80/tcp
# 开放端口范围(如 UDP 10000-20000)
firewall-cmd --add-port=10000-20000/udp
永久开放端口(需重载规则):
bash
# 永久开放端口
firewall-cmd --add-port=80/tcp --permanent
# 重载规则使永久配置生效
firewall-cmd --reload
查看已开放的端口:
bash
# 查看当前区域开放的端口
firewall-cmd --list-ports
# 查看指定区域开放的端口
firewall-cmd --zone=public --list-ports
1.3 开放服务
firewalld 预定义了常见服务(如 http、ssh、mysql),开放服务比直接开放端口更语义化且安全。
查看所有预定义服务:
bash
firewall-cmd --get-services
临时开放服务:
bash
# 开放 HTTP 服务
firewall-cmd --add-service=http
# 同时开放多个服务
firewall-cmd --add-service={http,https,ssh}
永久开放服务:
bash
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
查看已开放的服务:
bash
# 查看当前区域开放的服务
firewall-cmd --list-services
# 查看指定区域开放的服务
firewall-cmd --zone=public --list-services
1.4 重载规则
当修改了永久规则(--permanent)后,必须重载才能使新规则生效,同时不会中断现有连接。
bash
# 重载防火墙规则
firewall-cmd --reload
注意:
--reload会重新加载所有永久规则,并保留当前运行时规则。- 与
systemctl restart firewalld不同,--reload是平滑重载,不会导致现有连接中断。
1.5 查看规则
查看当前生效的防火墙规则是日常管理和排错的关键
查看当前区域所有规则(最常用):
bash
firewall-cmd --list-all
输出示例:
bash
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh http
ports: 443/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
查看指定区域所有规则:
bash
firewall-cmd --zone=internal --list-all
查看富规则(Rich Rules):
bash
firewall-cmd --list-rich-rules
查看所有永久配置:
bash
firewall-cmd --list-all --permanent
最佳实践建议:
- 修改规则前,先用
--list-all查看当前状态。 - 测试规则时,先使用临时命令(不加
--permanent),确认无误后再转为永久规则。 - 每次使用
--permanent参数修改后,必须执行firewall-cmd --reload使规则生效。 - 使用
firewall-cmd --runtime-to-permanent可将当前所有临时规则一次性保存为永久规则。
二、firewalld 常用命令
bash
# 1. 查看 firewalld 服务状态
systemctl status firewalld
# 2. 启动 firewalld 服务
systemctl start firewalld
# 3. 设置 firewalld 开机自启
systemctl enable firewalld
# 4. 查看所有可用区域
firewall-cmd --get-zones
# 输出示例:block dmz drop external home internal public trusted work
# 5. 查看当前默认区域
firewall-cmd --get-default-zone
# 输出示例:public
# 6. 设置默认区域(如设置为 public)
firewall-cmd --set-default-zone=public
# 7. 查看当前活跃区域及其绑定的网络接口
firewall-cmd --get-active-zones
# 8. 查看指定网络接口(如 ens33)绑定的区域
firewall-cmd --get-zone-of-interface=ens33
# 9. 为指定接口绑定到特定区域(如将 ens37 绑定到 dmz 区域)
firewall-cmd --zone=dmz --add-interface=ens37
# 10. 更改指定区域绑定的网络接口(如将 dmz 区域的接口改为 ens33)
firewall-cmd --zone=dmz --change-interface=ens33
# 11. 从指定区域移除绑定的网络接口(如从 dmz 区域移除 ens37)
firewall-cmd --zone=dmz --remove-interface=ens37
# 12. 查看默认区域的所有配置
firewall-cmd --list-all
# 13. 查看指定区域(如 dmz)的所有配置
firewall-cmd --zone=dmz --list-all
# 14. 查看指定区域(如 public)允许访问的服务
firewall-cmd --zone=public --list-services
# 15. 查看系统所有预定义的服务名称
firewall-cmd --get-services
# 16. 查看指定区域(如 public)允许访问的端口
firewall-cmd --zone=public --list-ports
# 17. 为指定区域临时添加允许访问的服务(如 public 区域添加 http 服务)
firewall-cmd --zone=public --add-service=http
# 18. 为指定区域删除允许访问的服务
firewall-cmd --zone=public --remove-service=http
# 19. 一次性添加多个服务(支持花括号扩展)
firewall-cmd --zone=public --add-services={http,https,redis,ssh}
# 20. 为指定区域添加允许访问的端口(可同时添加多个)
firewall-cmd --zone=public --add-port=22/tcp --add-port=80-100/tcp
# 21. 为指定区域删除允许访问的端口
firewall-cmd --zone=public --remove-port=22/tcp --remove-port=80-100/tcp
# 22. 将当前所有临时规则保存为永久规则(推荐工作流)
firewall-cmd --runtime-to-permanent
# 23. 直接添加永久规则(需重载生效)
firewall-cmd --permanent --zone=public --add-service=http
# 24. 重载防火墙规则(使永久配置生效)
firewall-cmd --reload
# 或使用服务重启(会中断现有连接)
systemctl restart firewalld
# 25. 禁止特定源 IP 访问(模拟 iptables 的 DROP)
# 将 192.168.100.134/24 网段添加到 drop 区域,直接丢弃其流量
firewall-cmd --add-source=192.168.100.134/24 --zone=drop
# 26. 拒绝特定源 IP 访问(模拟 iptables 的 REJECT)
# 将 192.168.100.134/24 网段添加到 block 区域,返回拒绝响应
firewall-cmd --add-source=192.168.100.134/24 --zone=block
# 27. 允许特定源 IP 完全访问(信任该源)
firewall-cmd --add-source=192.168.100.134/24 --zone=trusted
# 28. 添加端口转发规则
# 将到达本机 public 区域 80 端口的 TCP 流量转发到本机的 8080 端口
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
# 29. 删除端口转发规则
# 删除将 80 端口转发到 192.168.100.134:80 的规则
firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.100.134
使用示例
bash
# 1. 临时添加 http 服务
[root@hunan-sc ~]# firewall-cmd --add-service=http
success
# 说明:http 服务默认使用 80 端口,https 服务默认使用 443 端口
# 2. 临时添加端口(手动指定)
[root@hunan-sc ~]# firewall-cmd --add-port=443/tcp
success
[root@hunan-sc ~]# firewall-cmd --add-port=80/tcp
success
# 3. 查看当前所有规则(验证临时添加效果)
[root@hunan-sc ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client http ssh
ports: 443/tcp 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# 4. 重载规则(不影响临时规则)
[root@hunan-sc ~]# firewall-cmd --reload
success
# 5. 永久添加 80 端口规则
[root@hunan-sc ~]# firewall-cmd --add-port=80/tcp --permanent
success
# permanent 表示永久生效
# 6. 重载使永久规则生效
[root@hunan-sc ~]# firewall-cmd --reload
success
# 7. 查看规则,确认 80 端口已永久添加
[root@hunan-sc ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
# 8. 删除永久规则
[root@hunan-sc ~]# firewall-cmd --remove-port=80/tcp --permanent
success
[root@hunan-sc ~]# firewall-cmd --reload
success
# 9. 查看最终规则状态
[root@hunan-sc ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client http mysql ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
三、高级配置
3.1 富规则配置
bash
# 允许特定IP访问SSH(永久)
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="192.168.1.100/32"
service name="ssh"
accept'
# 拒绝某网段访问HTTP并记录日志
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/8"
service name="http"
log prefix="BLOCK_HTTP: " level="warning"
reject'
# 限制SSH连接速率(防止暴力破解)
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
service name="ssh"
limit value="3/m"
accept'
查看
bash
firewall-cmd --list-rich-rules
rule family="ipv4" service name="ssh" accept limit value="3/m"
rule family="ipv4" source address="192.168.1.100/32" service name="ssh" accept
rule family="ipv4" source address="10.0.0.0/8" service name="http" log prefix="BLOCK_HTTP: " level="warning" reject
3.2 NAT与端口转发
bash
# 启用IP伪装(NAT,共享上网)
firewall-cmd --permanent --zone=external --add-masquerade
# 端口转发(将80端口转发到8080)
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
# 带IP的端口转发(转发到其他主机)
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.10:toport=8080
3.3 ICMP控制
bash
# 允许ping(echo-request)
firewall-cmd --permanent --add-icmp-block-inversion
firewall-cmd --permanent --remove-icmp-block=echo-request
# 阻止 traceroute(time-exceeded)
firewall-cmd --permanent --add-icmp-block=time-exceeded
四、firewalld与iptables的区别
| 对比维度 | firewalld | iptables |
|---|---|---|
| 设计理念 | 动态管理,区域化抽象,易用优先 | 静态规则,底层直接操作,灵活优先 |
| 配置方式 | 运行时 + 永久双模式,支持增量更新 | 直接替换规则集,修改需重启服务 |
| 性能 | CentOS 8+ 使用 nftables 后端,高效匹配 | 线性匹配,规则越多越慢 |
| 适用场景 | 日常运维、快速部署、多区域网络 | 高度自定义、复杂策略、性能敏感场景 |
| 规则结构 | 基于区域分组,逻辑清晰 | 链 - 表 - 规则结构,层级复杂 |