15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
01.11.2024

如何在 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区域中打开端口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在重新加载和重启后保留生产配置

最佳实践工作流

  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
列出活跃区域
15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用