在 CentOS 7.4 系统中,防火墙作为保障服务器安全的第一道防线,其重要性不言而喻,与早期版本默认使用的 iptables 不同,CentOS 7.4 引入了 firewalld(Dynamic Firewall Manager of Linux)作为其默认的防火墙管理工具。firewalld 提供了更加动态和易于管理的防火墙规则配置方式,支持网络“区域”的概念,使得管理员可以根据不同的网络环境(如公共、家庭、工作等)快速应用相应的安全策略。

firewalld 的核心概念
要熟练使用 firewalld,首先需要理解其两个核心概念:区域和服务。
区域
区域是 firewalld 的灵魂所在,每一个区域都代表了一套预设的安全规则集,用于定义网络连接或接口的信任级别,系统管理员可以为不同的网络接口(如 eth0, eth1)分配不同的区域,连接内部网络的接口可以设置为 trusted 区域,而连接公网的接口则设置为 public 区域。firewalld 默认提供了多个区域,以下是其中一些常见的区域:
| 区域名称 | 描述 |
|---|---|
trusted |
接受所有的网络连接,最不安全。 |
home |
用于家庭网络,默认信任其他计算机,仅允许选定的服务通过。 |
internal |
用于内部网络,与 home 类似,但适用于更广泛的内部环境。 |
work |
用于工作区域,同样信任网络内的大多数计算机。 |
public |
默认区域,不信任网络中的任何计算机,仅允许SSH和DHCPv6-Client等少数服务。 |
dmz |
用于位于非军事区的计算机,仅允许指定的服务通过,可被外部网络访问。 |
block |
阻止所有传入的网络连接,但允许已建立的连接及相关返回流量。 |
drop |
丢弃所有传入的网络连接,不返回任何错误信息,最为严格。 |
服务
服务是 firewalld 对端口和协议的抽象封装。firewalld 内置了大量常用服务的预定义规则,如 http(TCP 80端口)、https(TCP 443端口)、ssh(TCP 22端口)等,通过操作服务名称而非直接操作端口号,可以使防火墙规则的管理变得更加直观和不易出错。
常用 firewall-cmd 命令实践
firewalld 的所有操作都通过 firewall-cmd 命令行工具完成,以下是一些在日常运维中高频使用的命令。
基本状态管理

需要确保 firewalld 服务正在运行。
# 查看防火墙状态 systemctl status firewalld # 启动防火墙服务 systemctl start firewalld # 停止防火墙服务 systemctl stop firewalld # 设置防火墙开机自启 systemctl enable firewalld # 禁止防火墙开机自启 systemctl disable firewalld
区域管理
查看和配置当前系统使用的区域。
# 查看当前默认区域 firewall-cmd --get-default-zone # 查看当前活动区域及绑定的接口 firewall-cmd --get-active-zones # 查看指定区域(如public)的详细规则 firewall-cmd --zone=public --list-all # 临时将默认区域设置为 work firewall-cmd --set-default-zone=work
端口与服务管理
这是防火墙配置的核心部分,涉及开放或关闭特定的访问权限。
firewalld 的配置分为两种模式:运行时模式(Runtime)和永久模式(Permanent),运行时模式的配置在系统重启或防火墙服务重载后会失效,而永久模式的配置则会持久化保存,推荐在进行永久配置后,执行 --reload 命令使其立即生效。
# 永久地开放 HTTP 服务 (TCP 80端口) firewall-cmd --permanent --zone=public --add-service=http # 永久地移除 HTTP 服务 firewall-cmd --permanent --zone=public --remove-service=http # 永久地开放 TCP 端口 8080 firewall-cmd --permanent --zone=public --add-port=8080/tcp # 永久地移除 TCP 端口 8080 firewall-cmd --permanent --zone=public --remove-port=8080/tcp # 重新加载防火墙配置,使永久配置生效 firewall-cmd --reload
富规则

对于更复杂的场景,例如只允许特定IP地址访问某个端口,firewalld 提供了“富规则”功能。
# 允许来自 192.168.1.100 的 IP 访问 TCP 3306 端口 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept' # 重载配置 firewall-cmd --reload
相关问答FAQs
我使用 firewall-cmd --add-port=8080/tcp 命令开放了端口,为什么重启服务器后规则就失效了?
解答: 这是因为您使用的是运行时模式添加规则,默认情况下,不带 --permanent 参数的 firewall-cmd 命令都只在当前运行时生效,系统重启或防火墙服务重启后这些临时规则会丢失,要使规则永久生效,必须在命令中添加 --permanent 参数,firewall-cmd --permanent --add-port=8080/tcp,添加永久规则后,需要执行 firewall-cmd --reload 来重新加载防火墙配置,让新规则立即生效,而无需重启系统。
如何检查一个特定的端口(例如3306)是否已经在防火墙中开放?
解答: 您可以使用 firewall-cmd 的查询功能来检查端口是否开放,有两种常用方法:
- 查询所有已开放的端口列表:执行
firewall-cmd --list-ports,这会列出所有区域中已永久开放的端口,您可以在此列表中查找是否存在3306/tcp。 - 直接查询特定端口:执行
firewall-cmd --query-port=3306/tcp,如果该端口已开放,命令会返回yes;如果未开放,则返回no,这个方法更加直接和精确,查询时也需要指定协议(tcp或udp)。