如何在 Linux 上使用 Firewalld 配置防火墙(完整指南)
保护您的 Linux 服务器免受未授权访问和恶意流量的侵害不是可选的 — 这是任何系统管理员的基本责任。无论您运行的是个人项目、业务应用程序还是生产 Web 服务器,配置正确的防火墙都是您的第一道也是最关键的防线。Firewalld 是 Linux 上最强大和灵活的防火墙管理工具之一,提供动态规则管理、基于区域的流量控制和丰富的规则支持 — 所有这些都无需在应用更改时完全重启服务。
本综合指南将引导您了解所需的一切:安装 Firewalld、理解区域、管理服务和端口、编写丰富规则以及实时监控防火墙。如果您在 AlexHost 的 VPS 或 专用服务器上托管,本指南将帮助您锁定您的环境并维持强大、自适应的安全态势。
什么是 Firewalld 以及为什么应该使用它?
Firewalld 是一个动态防火墙管理守护程序,可在大多数主要 Linux 发行版上使用,包括 CentOS、RHEL、Fedora、Rocky Linux、AlmaLinux,以及越来越多的 Debian 和 Ubuntu。与较早的 iptables 方法不同——后者要求每次规则更改都需要刷新和重新加载整个规则集——Firewalld 在运行时动态应用更改,不会中断活跃连接。
Firewalld 的主要优势
- 基于区域的架构 — 为不同的网络接口或 IP 范围分配不同的信任级别
- 动态规则更新 — 应用更改而无需重启防火墙或断开现有连接
- 服务抽象 — 按服务名称(例如
http、ssh)而不是原始端口号管理流量 - 丰富的规则 — 编写针对特定 IP、协议和操作的复杂条件规则
- D-Bus 集成 — 允许其他应用程序和服务以编程方式与防火墙交互
- IPv4 和 IPv6 支持 — 从单一界面管理两种协议族
先决条件
在继续之前,请确保您拥有:
- 运行 CentOS 7/8/9、RHEL、Fedora、Rocky Linux、AlmaLinux、Debian 或 Ubuntu 的 Linux 服务器
- 对服务器的 Root 或
sudo访问权限 - 对 Linux 终端命令的基本了解
- 活跃的 SSH 会话(保持打开状态 — 您将修改防火墙规则)
> 严重警告:在启用 Firewalld 之前,请始终确保 SSH(默认端口 22)在防火墙规则中被明确允许。将自己锁定在远程服务器之外是一个常见且可以避免的错误。
第1步:安装Firewalld
Firewalld包含在大多数主要Linux发行版的默认存储库中。为您的系统使用适当的包管理器。
在CentOS / RHEL / Rocky Linux / AlmaLinux上
sudo yum install firewalld -y或者,在使用DNF的较新版本上:
sudo dnf install firewalld -y在Fedora上
sudo dnf install firewalld -y
在Debian / Ubuntu上
虽然Firewalld最常与基于RHEL的系统相关联,但它在基于Debian的发行版上也完全受支持:
sudo apt update
sudo apt install firewalld -y> Ubuntu/Debian用户注意:如果ufw当前在您的系统上处于活动状态,在启用Firewalld之前禁用它以避免冲突:
> “`bash
> sudo ufw disable
> “`
第 2 步:启动和启用 Firewalld
安装后,启动 Firewalld 服务并将其配置为在系统启动时自动启动:
sudo systemctl start firewalld
sudo systemctl enable firewalld验证服务是否正确运行:
sudo systemctl status firewalld您应该看到类似以下的输出:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since ...如果状态显示 active (running),则 Firewalld 已启动并准备好进行配置。

第3步:理解Firewalld区域
基于区域的模型是Firewalld架构的基础。区域定义了网络连接或接口的信任级别。每个区域都包含自己的一组规则,这些规则决定了允许或拒绝哪些流量。

内置Firewalld区域
| 区域 | 信任级别 | 典型用例 |
|---|---|---|
drop | 最低 | 所有传入连接都被丢弃,无回复 |
block | 非常低 | 传入连接被拒绝,并返回ICMP消息 |
public | 低 | 不受信任的公共网络的默认区域 |
external | 低 | 用于具有NAT伪装的面向外部的接口 |
dmz | 中等 | 可从外部访问但内部隔离的服务器 |
work | 中高 | 具有中等信任度的工作网络 |
home | 高 | 其他主机受信任的家庭网络 |
internal | 高 | 内部网络,类似于家庭网络 |
trusted | 最高 | 接受所有连接 |
检查当前默认区域
sudo firewall-cmd --get-default-zone
列出所有可用区域
sudo firewall-cmd --get-zones
查看当前活跃的区域及其接口
sudo firewall-cmd --get-active-zones示例输出:
public
interfaces: eth0
第 4 步:更改默认区域
示例 1 — 将默认区域设置为 public(推荐用于 VPS/专用服务器)
对于大多数面向互联网的服务器,public 是适当的默认区域。它应用保守的信任级别,仅允许明确允许的流量:
sudo firewall-cmd --set-default-zone=public验证更改:
sudo firewall-cmd --get-default-zone预期输出:
public示例 2 — 将默认区域设置为 home
如果您的服务器在受信任的专用网络上运行(例如家庭实验室或内部开发环境),home 区域允许受信任主机之间进行更宽松的通信:
sudo firewall-cmd --set-default-zone=home验证:
sudo firewall-cmd --get-default-zone预期输出:
home示例 3 — 将默认区域设置为 work
对于公司或工作网络上的服务器,其中适度信任是合适的:
sudo firewall-cmd --set-default-zone=work验证:
sudo firewall-cmd --get-default-zone预期输出:
work第 5 步:使用 Firewalld 管理服务
Firewalld 包含一个预定义服务定义库,将服务名称映射到其对应的端口和协议。这使得按意图而不是按原始端口号管理规则变得容易得多。
列出所有预定义服务
sudo firewall-cmd --get-services在区域中允许服务
要在 public 区域中永久允许 HTTP 流量(端口 80/TCP):
sudo firewall-cmd --zone=public --add-service=http --permanent要允许 HTTPS 流量(端口 443/TCP):
sudo firewall-cmd --zone=public --add-service=https --permanent要允许 SSH(端口 22/TCP)— 在进行其他更改之前,始终确保允许此流量:
sudo firewall-cmd --zone=public --add-service=ssh --permanent通过重新加载 Firewalld 应用更改
--permanent 标志将规则写入持久配置,但不会立即将其应用于运行中的防火墙。进行永久更改后始终重新加载:
sudo firewall-cmd --reload验证区域中的服务
sudo firewall-cmd --zone=public --list-services示例输出:
dhcpv6-client http https ssh从区域中删除服务
要从 public 区域中删除 HTTPS:
sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reload第6步:直接管理端口
在服务没有预定义的Firewalld定义的情况下,您可以直接打开或关闭特定端口。
打开特定端口
在public区域中打开TCP端口8080:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload打开UDP端口(例如,DNS的端口53):
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reload打开一个端口范围(例如,6000–6100 TCP):
sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reload关闭特定端口
关闭端口8080:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload列出区域中的所有打开端口
sudo firewall-cmd --zone=public --list-ports第 7 步:使用富规则进行高级配置
富规则为您提供细粒度的条件流量控制——远超简单的服务或端口规则所能提供的功能。它们支持按源 IP、目标 IP、协议、端口和操作(接受、拒绝、丢弃、记录)进行过滤。
富规则语法
rule [family="<ipv4|ipv6>"]
[source address="<IP/CIDR>"]
[destination address="<IP/CIDR>"]
[service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
[log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
[accept|reject|drop]示例 1 — 仅允许来自特定 IP 地址的 SSH
这是任何远程服务器最重要的安全配置之一。如果您从固定 IP 地址管理服务器,请将 SSH 访问限制为仅该 IP:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reload示例 2 — 阻止来自特定 IP 地址的所有流量
要完全阻止生成恶意流量的 IP 地址:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reload示例 3 — 仅允许来自特定子网的 HTTP 流量
要仅允许来自受信任内部子网(例如 192.168.1.0/24)的 HTTP 流量:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reload示例 4 — 限制 SSH 连接速率以防止暴力破解
记录并限制 SSH 连接尝试以减少暴力破解攻击风险:
sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reload示例 5 — 允许来自特定 IP 的特定端口
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reload列出区域中的所有富规则
sudo firewall-cmd --zone=public --list-rich-rules删除富规则
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reload第8步:监控和审计您的防火墙
定期审查您的防火墙配置对于维护强大的安全态势至关重要。Firewalld提供了多个命令来检查您的规则的当前状态。
查看默认区域的完整配置
sudo firewall-cmd --list-all示例输出:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="203.0.113.50" service name="ssh" accept查看所有区域的配置
sudo firewall-cmd --list-all-zones查看特定区域的配置
sudo firewall-cmd --zone=dmz --list-all检查特定服务是否被允许
sudo firewall-cmd --zone=public --query-service=http检查特定端口是否开放
sudo firewall-cmd --zone=public --query-port=8080/tcp第9步:运行时规则与永久规则 — 理解区别
Firewalld 使用两个不同的配置层:
| 层 | 标志 | 持久性 | 用例 |
|---|---|---|---|
| 运行时 | *(无标志)* | 重新加载/重启时丢失 | 临时测试规则 |
| 永久 | --permanent | 在重新加载和重启后保留 | 生产配置 |
最佳实践工作流
- 首先在运行时测试规则(不使用
--permanent)以验证其按预期工作 - 确认后永久添加规则
- 重新加载 Firewalld 以同步运行时和永久配置
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http
# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
# Step 3: Reload to sync
sudo firewall-cmd --reload或者,应用永久规则并在一个工作流中立即重新加载:
sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reload第 10 步:将网络接口分配到区域
如果您的服务器有多个网络接口(在具有公共和私有 NIC 的专用服务器上很常见),您可以将每个接口分配到具有不同信任级别的不同区域。
将接口分配到区域
sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reload更改接口的区域
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reload从区域中删除接口
sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reload步骤 11:启用 IP 伪装和端口转发
对于充当网关或运行 NAT(网络地址转换)的服务器,Firewalld 原生支持伪装和端口转发。
启用伪装 (NAT)
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reload转发端口(例如,将外部端口 80 转发到内部端口 8080)
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reload将流量转发到不同的主机
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reloadAlexHost 服务器的实用安全配置
如果您在 AlexHost 基础设施上运行 Web 服务器、数据库服务器或应用程序服务器,以下是推荐的基线 Firewalld 配置:
基线 Web 服务器配置
# Allow SSH (restrict to your IP in production)
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# Allow HTTP and HTTPS
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# Reload to apply
sudo firewall-cmd --reload
# Verify
sudo firewall-cmd --list-all> 专业提示:将您的防火墙配置与有效的 SSL 证书配对,以确保所有 Web 流量端到端加密。AlexHost 为所有托管环境提供 SSL 证书。
基线数据库服务器配置 (MySQL/MariaDB)
# Allow MySQL only from a specific application server IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
# Block direct MySQL access from the public internet
sudo firewall-cmd --zone=public --remove-service=mysql --permanent 2>/dev/null
sudo firewall-cmd --reload基线 cPanel/WHM 服务器配置
如果您使用的是 带有 cPanel 的 VPS,您需要打开 cPanel 和 WHM 所需的端口:
# Web traffic
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# cPanel/WHM ports
sudo firewall-cmd --zone=public --add-port=2082/tcp --permanent # cPanel HTTP
sudo firewall-cmd --zone=public --add-port=2083/tcp --permanent # cPanel HTTPS
sudo firewall-cmd --zone=public --add-port=2086/tcp --permanent # WHM HTTP
sudo firewall-cmd --zone=public --add-port=2087/tcp --permanent # WHM HTTPS
sudo firewall-cmd --zone=public --add-port=2095/tcp --permanent # Webmail HTTP
sudo firewall-cmd --zone=public --add-port=2096/tcp --permanent # Webmail HTTPS
# Mail ports
sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent
sudo firewall-cmd --reloadFirewalld 常见问题排查
问题 1:Firewalld 无法启动
检查与其他防火墙工具的冲突:
sudo systemctl status iptables
sudo systemctl stop iptables
sudo systemctl disable iptables
sudo systemctl start firewalld问题 2:重启后规则未保留
确保您使用了 --permanent 标志并重新加载:
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reload--runtime-to-permanent 命令将所有当前运行时规则保存到永久配置。
问题 3:SSH 被锁定
如果您意外阻止了 SSH 访问,您需要通过控制台访问服务器(可通过 AlexHost 的 VPS 控制面板获得),然后运行:
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reload问题 4:检查 Firewalld 日志
sudo journalctl -u firewalld -f或检查系统日志中与防火墙相关的消息:
sudo grep -i firewall /var/log/messagesFirewalld 快速参考速查表
| 任务 | 命令 |
|---|---|
| 检查状态 | sudo systemctl status firewalld |
| 启动 Firewalld | sudo systemctl start firewalld |
| 停止 Firewalld | sudo systemctl stop firewalld |
| 启用开机自启 | sudo systemctl enable firewalld |
| 获取默认区域 | sudo firewall-cmd --get-default-zone |
| 列出所有区域 | sudo firewall-cmd --get-zones |
| 列出活跃区域 | sudo firewall-cmd --get-active-zones |
| 设置默认区域 | sudo firewall-cmd --set-default-zone=public |
| 添加服务 | sudo firewall-cmd --zone=public --add-service=http --permanent |
| 移除服务 | sudo firewall-cmd --zone=public --remove-service=http --permanent |
| 打开端口 | sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent |
| 关闭端口 | sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent |
| 列出服务 | sudo firewall-cmd --zone=public --list-services |
| 列出端口 | sudo firewall-cmd --zone=public --list-ports |
| 列出所有规则 | sudo firewall-cmd --list-all |
| 添加富规则 | sudo firewall-cmd --zone=public --add-rich-rule='...' --permanent |
| 保存运行时规则 | sudo firewall-cmd --runtime-to-permanent |
| 重新加载 Firewalld | sudo firewall-cmd --reload |
| 紧急模式(阻止所有) | sudo firewall-cmd --panic-on |
| 禁用紧急模式 | sudo firewall-cmd --panic-off |
结论
Firewalld 是一个功能异常强大且灵活的防火墙管理工具,为 Linux 系统管理员提供对网络流量的精确、动态控制。通过掌握区域、服务、端口规则和富规则,您可以构建分层的、自适应的安全架构,保护您的服务器免受未授权访问、暴力破解攻击和网络级威胁。
需要牢记的关键原则:
- 在启用防火墙之前始终允许 SSH,以避免将自己锁定在外
- 对所有生产规则使用
--permanent标志,并始终后跟--reload - 限制敏感服务(SSH、数据库、管理面板)仅允许特定受信任的 IP 地址访问,使用富规则
- 定期审查您的防火墙规则 — 随着基础设施的变化,您的安全态势应该不断演进
- 首先在运行时测试规则,验证后再将其设为永久
无论您是管理单个 VPS 还是一整套 Dedicated Servers,AlexHost 都提供您实施企业级安全配置所需的基础设施、性能和完全 root 访问权限。将您的 Firewalld 设置与 SSL Certificates 配对以实现加密通信,并探索 VPS Control Panels 以简化服务器管理 — 所有这些都可在 AlexHost 的可信、高性能平台上获得。
