所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 安全

如何在 Linux 上使用 Firewalld 配置防火墙(完整指南)

保护您的 Linux 服务器免受未授权访问和恶意流量的侵害不是可选的 — 这是任何系统管理员的基本责任。无论您运行的是个人项目、业务应用程序还是生产 Web 服务器,配置正确的防火墙都是您的第一道也是最关键的防线。Firewalld 是 Linux 上最强大和灵活的防火墙管理工具之一,提供动态规则管理、基于区域的流量控制和丰富的规则支持 — 所有这些都无需在应用更改时完全重启服务。

本综合指南将引导您了解所需的一切:安装 Firewalld、理解区域、管理服务和端口、编写丰富规则以及实时监控防火墙。如果您在 AlexHost 的 VPS专用服务器上托管,本指南将帮助您锁定您的环境并维持强大、自适应的安全态势。

什么是 Firewalld 以及为什么应该使用它?

Firewalld 是一个动态防火墙管理守护程序,可在大多数主要 Linux 发行版上使用,包括 CentOSRHELFedoraRocky LinuxAlmaLinux,以及越来越多的 DebianUbuntu。与较早的 iptables 方法不同——后者要求每次规则更改都需要刷新和重新加载整个规则集——Firewalld 在运行时动态应用更改,不会中断活跃连接。

Firewalld 的主要优势

  • 基于区域的架构 — 为不同的网络接口或 IP 范围分配不同的信任级别
  • 动态规则更新 — 应用更改而无需重启防火墙或断开现有连接
  • 服务抽象 — 按服务名称(例如 httpssh)而不是原始端口号管理流量
  • 丰富的规则 — 编写针对特定 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在重新加载和重启后保留生产配置

最佳实践工作流

  1. 首先在运行时测试规则(不使用 --permanent)以验证其按预期工作
  2. 确认后永久添加规则
  3. 重新加载 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 --reload

AlexHost 服务器的实用安全配置

如果您在 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 --reload

Firewalld 常见问题排查

问题 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/messages

Firewalld 快速参考速查表

任务命令
检查状态sudo systemctl status firewalld
启动 Firewalldsudo systemctl start firewalld
停止 Firewalldsudo 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
重新加载 Firewalldsudo firewall-cmd --reload
紧急模式(阻止所有)sudo firewall-cmd --panic-on
禁用紧急模式sudo firewall-cmd --panic-off

结论

Firewalld 是一个功能异常强大且灵活的防火墙管理工具,为 Linux 系统管理员提供对网络流量的精确、动态控制。通过掌握区域、服务、端口规则和富规则,您可以构建分层的、自适应的安全架构,保护您的服务器免受未授权访问、暴力破解攻击和网络级威胁。

需要牢记的关键原则:

  1. 在启用防火墙之前始终允许 SSH,以避免将自己锁定在外
  2. 对所有生产规则使用 --permanent 标志,并始终后跟 --reload
  3. 限制敏感服务(SSH、数据库、管理面板)仅允许特定受信任的 IP 地址访问,使用富规则
  4. 定期审查您的防火墙规则 — 随着基础设施的变化,您的安全态势应该不断演进
  5. 首先在运行时测试规则,验证后再将其设为永久

无论您是管理单个 VPS 还是一整套 Dedicated Servers,AlexHost 都提供您实施企业级安全配置所需的基础设施、性能和完全 root 访问权限。将您的 Firewalld 设置与 SSL Certificates 配对以实现加密通信,并探索 VPS Control Panels 以简化服务器管理 — 所有这些都可在 AlexHost 的可信、高性能平台上获得。