如何在 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区域中打开端口8080(TCP):
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 |
| 列出活跃区域 |
