CentOS 8 防火墙:系统安全的坚实防线
在当今高度互联的数字环境中,服务器安全是网站稳定运行的基石,CentOS 8 作为广泛使用的企业级操作系统,其内置的防火墙工具 firewalld 提供了强大而灵活的防护能力,是守护系统门户不可或缺的利器,理解并正确配置它,是每一位服务器管理员必备的核心技能。
认识 CentOS 8 的守护者:Firewalld

Firewalld 绝非简单的端口开关,它引入了动态管理的理念,核心优势在于能够在不中断现有连接的前提下,实时修改防火墙规则,这对于需要持续在线提供服务的网站服务器至关重要。
其设计围绕几个关键概念:
- 区域 (Zones): 逻辑上的信任级别划分。
public区域适用于暴露在互联网的接口,规则最为严格;trusted区域则允许所有流量,适用于高度信任的内部网络,系统根据接口来源自动或手动分配区域。 - 服务 (Services): 预定义规则集,简化常用应用(如 HTTP、HTTPS、SSH、MySQL)的端口和协议管理,直接启用服务比手动开放端口更安全便捷。
- 端口 (Ports): 允许或拒绝特定端口号及其协议(TCP/UDP)的流量。
- 富规则 (Rich Rules): 提供细粒度控制能力,可基于源/目标 IP 地址、端口、协议甚至连接状态(如
established)创建复杂规则,满足高级安全策略需求。
掌握核心操作:命令行利器 firewall-cmd
firewall-cmd 是与 firewalld 交互的主要工具,以下命令需 root 权限执行:
状态与基础信息:
sudo firewall-cmd --state # 检查运行状态 (running/not running) sudo firewall-cmd --get-active-zones # 查看活动区域及其绑定接口 sudo firewall-cmd --list-all # 列出默认区域详细配置 sudo firewall-cmd --zone=public --list-all # 列出指定区域详细配置
服务管理:

sudo firewall-cmd --zone=public --add-service=http # 临时允许 HTTP sudo firewall-cmd --zone=public --add-service=https --permanent # 永久允许 HTTPS sudo firewall-cmd --reload # 重载使永久规则生效(不中断连接) sudo firewall-cmd --zone=public --remove-service=ssh # 临时移除 SSH 服务
端口管理:
sudo firewall-cmd --zone=public --add-port=8080/tcp # 临时开放 TCP 8080 sudo firewall-cmd --zone=public --add-port=10000-20000/udp --permanent # 永久开放 UDP 端口范围
区域操作:
sudo firewall-cmd --get-default-zone # 查看默认区域 sudo firewall-cmd --set-default-zone=internal # 设置默认区域 sudo firewall-cmd --zone=public --change-interface=eth0 # 将接口 eth0 绑定到 public 区域
富规则应用 (示例):
# 允许来自 192.168.1.0/24 访问 TCP 3306 (MySQL) sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="3306" protocol="tcp" accept' --permanent # 拒绝来自特定 IP 10.0.0.5 的所有访问 sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" reject' --permanent
高级特性与最佳实践
- 运行时与永久配置: 使用
--permanent标志的规则写入配置文件,重启后依然有效,未加此标志的规则仅运行时有效,重启firewalld即失效,修改永久规则后,务必执行sudo firewall-cmd --reload使其生效。 - 直接接口 (Direct Interface): 处理 firewalld 自身未封装的高度定制化 iptables/nftables 规则,除非有特殊需求且理解底层原理,否则建议优先使用 firewalld 原生抽象(服务、富规则等)。
- 端口转发: 实现将到达某端口的流量转发至内部另一地址端口的功能。
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.0.10 --permanent
- 安全加固准则:
- 最小权限原则: 仅开放业务真正需要的端口和服务,禁用所有不必要的入口。
- SSH 安全: 限制 SSH 访问源 IP(使用富规则),或考虑更改默认端口(结合 SELinux 配置)。
- 默认区域策略: 对暴露在公网的接口,
public或dmz区域的默认策略应设为default(通常拒绝) 或drop(静默丢弃),仅允许明确放行的流量。 - 区域优先级: 一个接口只能属于一个区域,规则由该区域定义,源地址绑定规则可覆盖接口区域规则。
- 日志记录: 利用富规则的
log功能记录被拒绝的尝试访问,便于审计分析。 - 定期审查规则: 业务变更时,及时清理不再需要的规则。
不可或缺的伙伴:Firewalld 与 SELinux
Firewalld 控制网络层面的访问(谁能连接哪个端口),SELinux 则强制执行系统内部的访问控制(进程即使连上了端口,能访问哪些文件/资源),两者协同工作,在 CentOS 8 上构建起纵深防御体系,配置网络服务时,务必同时考虑两者的策略。

常见场景处理
- Web 服务器: 开放
http,https服务,根据需求决定是否开放管理端口(如 SSH)。 - 数据库服务器: 仅对应用服务器所在的 IP 段开放数据库端口(如
mysql服务),使用富规则限定源 IP。 - FTP 服务器: 需额外处理动态端口,通常需要加载
ftp服务模块并配置被动端口范围。
多年运维经验让我深刻体会到,防火墙配置绝非一劳永逸的工作,CentOS 8 的 firewalld 以其动态能力和丰富的抽象层,大大简化了复杂安全策略的实施,真正的安全源于对最小权限原则的坚持、对开放服务的审慎评估以及持续监控调整的习惯,将 firewalld 视为安全基线的构建者,结合系统更新、强密码策略和入侵检测,方能打造出真正健壮的服务器环境,安全没有终点,只有持续的警惕和优化。
