一、firewalld 防火墙核心原理
1.1 firewalld 的核心作用
firewalld 本身不具备数据包过滤能力,其核心是为 Linux 内核的netfilter包过滤机制提供匹配规则(策略),通过定义规则告诉netfilter对指定源 IP、目的 IP、协议特征的数据包执行允许、拒绝、转发等操作。同时,firewalld 提供了动态的防火墙管理能力,支持 IPv4、IPv6 和以太网桥,还能让服务 / 应用程序直接添加防火墙规则接口。
1.2 firewalld 与 iptables 的关系
二者均是通过内核netfilter实现数据包过滤,核心区别在于规则管理方式和配置存储:
1.3 firewalld 的核心特性:区域(Zones)
firewalld 的核心设计是区域化管理,将网络流量按源 IP、入网接口划分为不同区域,每个区域配置独立的安全策略(允许 / 拒绝的服务、端口、协议等),系统按匹配优先级为数据包匹配对应区域的规则,优先级从高到低为:
firewalld 预定义了 9 个区域,每个区域有默认的安全策略,核心区域的策略特点如下:
- trusted:信任区域,允许所有数据包进入,适用于内网可信环境;
- internal/home/work:内网类区域,拒绝主动流入的流量,仅允许与流出流量相关的请求,以及 ssh、mdns 等常用内网服务;
- public:公共区域,默认区域,拒绝主动流入流量,仅允许 ssh、dhcpv6-client 等基础服务,适用于公网环境;
- external:外部区域,适用于服务器公网接口,开启地址伪装,仅允许 ssh 服务;
- dmz:非军事区,适用于对外提供服务的服务器(如 web、数据库),仅允许 ssh 服务;
- block/drop:阻塞 / 丢弃区域,拒绝所有主动流入流量,drop 区域会直接丢弃数据包,不返回任何响应,安全性最高。
1.4 firewalld 的两种配置模式
firewalld 所有配置均支持运行时模式和永久模式,二者的区别直接影响规则的生效范围和持久性:
两种模式可相互转换,通过firewall-cmd –runtime-to-permanent可将当前运行时规则写入配置文件,转为永久规则。
二、firewalld 基础配置:图形化 + 命令行
firewalld 提供firewall-config图形化工具和firewall-cmd命令行工具,图形化工具操作直观,适合新手;命令行工具适合服务器无桌面环境的生产场景,也是运维必备技能,以下分别讲解核心配置操作。
2.1 基础准备:安装与启动 firewalld
无论使用哪种配置方式,首先需完成 firewalld 的安装和启动,以 OpenEuler/CentOS/RHEL 系统为例,执行以下命令:
# 安装firewalld
dnf install -y firewalld
# 启动firewalld并设置开机自启
systemctl start firewalld
systemctl enable firewalld
# 验证firewalld状态(显示active(running)即为正常)
systemctl status firewalld
# 关闭iptables(避免冲突,若已安装)
systemctl stop iptables && systemctl disable iptables
2.2 图形化配置:firewall-config
图形化工具firewall-config操作直观,适合有桌面环境的服务器,需先安装工具和桌面环境(若未安装):
bash
# 安装桌面环境(OpenEuler/CentOS)
dnf install -y gnome-shell gdm gnome-session gnome-terminal
# 设置默认图形化启动
systemctl set-default graphical.target
# 安装firewall-config图形化工具
dnf install -y firewall-config
# 重启系统进入桌面(可选,也可通过远程桌面连接)
reboot
2.2.1 打开 firewall-config
进入系统桌面后,点击左上角「活动」→「显示应用」,找到「防火墙配置」并打开,主界面分为主菜单、配置选项、功能选项卡(区域、服务、IPsets 等),底部状态栏显示连接状态、默认区域、锁定状态等核心信息。
2.2.2 核心配置操作
- 服务:勾选允许的服务(如 http、https、ssh),勾选后自动开放对应端口;
- 端口:添加自定义端口 / 端口范围(如 8080/tcp、8000-9000/udp),适用于非预定义服务;
- 协议:添加允许的网络协议(如 tcp、udp、icmp);
- 伪装:开启后实现地址伪装(NAT),适用于网关服务器,仅支持 IPv4;
- 端口转发:将本地端口映射到其他端口 / 远程主机端口(如将 80 端口转发到 8080),需先开启伪装;
- ICMP 过滤器:勾选需要拒绝的 ICMP 类型(如 echo-request,拒绝 ping 请求);
2.3 命令行配置:firewall-cmd(重点)
firewall-cmd是 firewalld 的核心管理工具,支持所有配置操作,以下讲解高频核心命令,按「基础查询、区域管理、服务管理、端口管理、规则重载」分类,方便记忆和使用。
2.3.1 基础查询命令:查看预定义信息
bash
# 查看所有预定义区域
firewall-cmd –get-zones
# 查看所有预定义服务(包含http、https、ssh等70+常用服务)
firewall-cmd –get-services
# 查看所有可阻塞的ICMP类型(如echo-request:ping请求)
firewall-cmd –get-icmptypes
# 查看当前默认区域
firewall-cmd –get-default-zone
# 查看当前激活的区域(已绑定接口/源IP的区域)
firewall-cmd –get-active-zones
# 查看指定接口绑定的区域(如ens33)
firewall-cmd –get-zone-of-interface=ens33
# 查看默认区域的所有规则(含服务、端口、接口等)
firewall-cmd –list-all
# 查看指定区域的所有规则(如dmz)
firewall-cmd –zone=dmz –list-all
# 查看所有区域的规则
firewall-cmd –list-all-zones
2.3.2 区域管理命令:绑定接口 / 修改默认区域
bash
# 设置默认区域(永久生效,需重载)
firewall-cmd –set-default-zone=dmz –permanent
# 为指定区域绑定网络接口(如将ens33绑定到internal区域)
firewall-cmd –zone=internal –add-interface=ens33 –permanent
# 修改接口绑定的区域(如将ens33从internal改为external)
firewall-cmd –zone=external –change-interface=ens33 –permanent
# 从指定区域移除接口(如将ens33从external移除)
firewall-cmd –zone=external –remove-interface=ens33 –permanent
2.3.3 服务管理命令:允许 / 拒绝服务
bash
# 查看默认区域允许的服务
firewall-cmd –list-services
# 为默认区域添加允许的服务(如http,运行时生效)
firewall-cmd –add-service=http
# 为指定区域添加允许的服务(如dmz区域添加https,永久生效)
firewall-cmd –zone=dmz –add-service=https –permanent
# 为指定区域移除服务(如dmz区域移除ssh,永久生效)
firewall-cmd –zone=dmz –remove-service=ssh –permanent
2.3.4 端口管理命令:开放 / 关闭自定义端口
适用于非预定义服务(如自定义应用的 8080 端口),需指定端口号 + 协议(tcp/udp):
bash
# 查看默认区域开放的端口
firewall-cmd –list-ports
# 为默认区域开放自定义端口(如8080/tcp,运行时生效)
firewall-cmd –add-port=8080/tcp
# 为指定区域开放端口范围(如dmz区域开放8000-9000/udp,永久生效)
firewall-cmd –zone=dmz –add-port=8000-9000/udp –permanent
# 为指定区域关闭端口(如dmz区域关闭8080/tcp,永久生效)
firewall-cmd –zone=dmz –remove-port=8080/tcp –permanent
2.3.5 规则重载与模式转换
bash
# 重载防火墙规则,使永久配置生效(不中断现有连接)
firewall-cmd –reload
# 将当前运行时规则转为永久规则(无需手动重载)
firewall-cmd –runtime-to-permanent
# 开启应急模式(丢弃所有数据包,紧急防护)
firewall-cmd –panic-on
# 关闭应急模式
firewall-cmd –panic-off
三、firewalld 实战案例:网关 + Web 服务器安全配置
本次实战模拟企业常见的网络架构:一台网关服务器(双网卡,连接公网和内网)+一台 Web 服务器(部署在内网 DMZ 区,对外提供 HTTPS 服务),通过 firewalld 配置实现以下安全需求,补充完整的基础准备步骤。
3.1 实验需求
3.2 实验环境准备
3.2.1 服务器基础信息
| 网关服务器 | ens33 | 100.1.1.10/24 | 公网接口,连接公网测试机 |
| ens37 | 192.168.1.1/24 | 内网接口,连接内网测试机 | |
| ens38 | 192.168.2.1/24 | DMZ 接口,连接 Web 服务器 | |
| Web 服务器 | ens33 | 192.168.2.10/24 | DMZ 区接口,提供 HTTPS 服务 |
| 公网测试机 | – | 100.1.1.20/24 | 测试公网访问权限 |
| 内网测试机 | – | 192.168.1.10/24 | 测试内网访问权限 |
3.2.2 基础环境配置(两台服务器均执行)
bash
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux,修改配置文件
vi /etc/selinux/config
# 将SELINUX=enforcing改为SELINUX=disabled,保存退出
# 重启系统生效(可选,若不重启则临时关闭生效)
reboot
bash
systemctl stop iptables && systemctl disable iptables
systemctl restart firewalld && systemctl enable firewalld
bash
# 编辑SSH配置文件
vi /etc/ssh/sshd_config
# 注释掉原Port 22,添加新端口:Port 12345
# 保存退出后,重启SSH服务
systemctl restart sshd
# 注意:先不要关闭当前SSH连接,新开窗口测试12345端口能否登录,避免断连
3.3 网关服务器(gateway-server)firewalld 配置
步骤 1:配置主机名,方便识别
bash
hostnamectl set-hostname gateway-server
bash # 使主机名立即生效
步骤 2:开启内核路由转发(实现公网 / 内网 / DMZ 区通信)
bash
# 编辑内核配置文件
vi /etc/sysctl.conf
# 添加/修改:net.ipv4.ip_forward=1
# 使配置立即生效
sysctl -p
步骤 3:firewalld 核心规则配置(永久生效,所有命令加 –permanent)
bash
# 1. 设置默认区域为external(公网口默认区域,安全性高)
firewall-cmd –set-default-zone=external –permanent
# 2. 为external区域绑定公网口ens33
firewall-cmd –zone=external –add-interface=ens33 –permanent
# 3. 为trusted区域绑定内网口ens37(信任内网,允许所有流量)
firewall-cmd –zone=trusted –add-interface=ens37 –permanent
# 4. 为dmz区域绑定DMZ口ens38(对外服务区域,精细化管控)
firewall-cmd –zone=dmz –add-interface=ens38 –permanent
# 5. external区域开放SSH自定义端口12345/tcp(公网可SSH登录网关)
firewall-cmd –zone=external –add-port=12345/tcp –permanent
# 6. external区域移除默认的ssh服务(关闭22端口,提高安全性)
firewall-cmd –zone=external –remove-service=ssh –permanent
# 7. external区域拒绝ping请求(防止公网ping探测)
firewall-cmd –zone=external –add-icmp-block=echo-request –permanent
# 8. 开启external区域的地址伪装(NAT,实现内网主机访问公网)
firewall-cmd –zone=external –add-masquerade –permanent
步骤 4:重载防火墙,使所有永久规则生效
bash
firewall-cmd –reload
# 验证配置:查看激活的区域和规则,确认接口绑定和端口开放正确
firewall-cmd –get-active-zones
firewall-cmd –zone=external –list-all
3.4 Web 服务器(web)firewalld 配置 + HTTPS 服务部署
Web 服务器部署在 DMZ 区,是对外提供服务的核心,需严格管控端口和服务,仅开放必要的 HTTPS 和 SSH 12345 端口,拒绝 HTTP 和 ping 请求。
步骤 1:配置主机名,安装 HTTPS 服务(httpd+mod_ssl)
bash
# 配置主机名
hostnamectl set-hostname web
bash
# 安装httpd和mod_ssl(实现HTTPS服务,自动生成SSL证书)
dnf install -y httpd mod_ssl
# 启动httpd并设置开机自启
systemctl start httpd && systemctl enable httpd
# 创建测试首页,验证HTTPS服务
echo "Test Web Server HTTPS" > /var/www/html/index.html
步骤 2:firewalld 核心规则配置(永久生效,加 –permanent)
bash
# 1. 设置默认区域为dmz(DMZ区专用,仅开放必要服务)
firewall-cmd –set-default-zone=dmz –permanent
# 2. 为dmz区域绑定本地网卡ens33
firewall-cmd –zone=dmz –add-interface=ens33 –permanent
# 3. dmz区域开放HTTPS服务(对外提供核心服务)
firewall-cmd –zone=dmz –add-service=https –permanent
# 4. dmz区域开放SSH自定义端口12345/tcp(远程管理)
firewall-cmd –zone=dmz –add-port=12345/tcp –permanent
# 5. dmz区域移除http服务(拒绝未加密的HTTP流量,强制HTTPS)
firewall-cmd –zone=dmz –remove-service=http –permanent
# 6. dmz区域移除默认的ssh服务(关闭22端口)
firewall-cmd –zone=dmz –remove-service=ssh –permanent
# 7. dmz区域拒绝ping请求(防止探测)
firewall-cmd –zone=dmz –add-icmp-block=echo-request –permanent
步骤 3:重载防火墙,验证配置
bash
firewall-cmd –reload
# 验证规则:确认dmz区域仅开放https和12345/tcp,拒绝echo-request
firewall-cmd –list-all
3.5 实验效果验证
分别在公网测试机和内网测试机执行验证操作,确认规则符合预期:
3.5.1 公网测试机(100.1.1.20/24)验证
bash
# 1. 测试ping网关和Web服务器(应均失败,拒绝ping)
ping 100.1.1.10
ping 192.168.2.10
# 2. 测试SSH登录网关(12345端口,应成功)
ssh -p 12345 root@100.1.1.10
# 3. 测试访问Web服务器HTTPS服务(应成功,显示测试首页)
curl https://192.168.2.10
# 4. 测试访问Web服务器HTTP服务(应失败,拒绝HTTP)
curl http://192.168.2.10
3.5.2 内网测试机(192.168.1.10/24)验证
bash
# 1. 测试SSH登录Web服务器(12345端口,应成功)
ssh -p 12345 root@192.168.2.10
# 2. 测试访问Web服务器HTTPS服务(应成功)
curl https://192.168.2.10
# 3. 测试ping网关和Web服务器(网关external区拒绝ping,Web服务器dmz区拒绝ping,均失败)
ping 192.168.1.1
ping 192.168.2.10



