![[指南] Linux 防火墙入门:UFW 和 FirewallD 基础配置与常用规则教程](https://file.hostol.com/wp-content/uploads/2025/04/UFW-和-FirewallD.png)
欢迎来到 Linux 服务器安全的第一道大门——防火墙!当你拥有了一台可以公网访问的 Linux 服务器时,配置防火墙绝对是你应该最先考虑的安全措施之一。为什么?想象一下你的服务器就像一座城市,而网络端口就是进出这座城市的各种大门(22 号门通往市政厅 – SSH,80 号门是集市 – HTTP,443 号门是加密通道 – HTTPS 等等)。如果没有防火墙这个“城管”或者“门卫”,那岂不是谁都可以随意进出任何一个大门,甚至在里面搞破坏?
防火墙的核心作用就是**过滤网络流量**,根据你预设的规则,决定哪些数据包(可以理解为进出城的“车辆”)可以通行,哪些需要被拒绝或丢弃。正确配置防火墙,可以极大地减少服务器暴露在外的攻击面,阻止未经授权的访问尝试,是保障服务器安全的基础。
“听起来好像很复杂?” 别担心!虽然 Linux 底层处理网络过滤的机制 (Netfilter/iptables/nftables) 功能强大但也确实复杂,我们通常不需要直接去编写那些繁琐的规则链。现在主流的 Linux 发行版都自带了更用户友好的防火墙管理工具(前端),最常见的两个就是:
- UFW (Uncomplicated Firewall): 主要用于 Ubuntu 及其衍生版 (如 Debian)。它的设计哲学就是简单、易用,非常适合新手入门。
- FirewallD: 主要用于 CentOS, RHEL, Fedora 等 Red Hat 系的发行版。它引入了“网络区域 (Zone)”的概念,提供了更灵活的管理方式和动态更新规则的能力。
这篇教程,我们就来分别学习一下这两个“防火墙管家”的基础用法,让你能够快速上手,为你的服务器设置好基本的网络访问控制。
理解防火墙的几个基本概念
在动手之前,先了解几个防火墙的通用概念会很有帮助:
- 规则 (Rules): 防火墙的核心就是一系列规则。每条规则定义了对符合特定条件(如来源 IP、目标端口、协议类型)的网络流量执行什么动作(允许 Allow/Accept, 拒绝 Reject, 丢弃 Drop)。
- 端口 (Ports): 网络通信的逻辑端点,用于区分不同的服务(如 SSH 的 22 端口,HTTP 的 80 端口)。防火墙规则通常需要指定端口号。
- 协议 (Protocols): 指网络通信的协议类型,最常见的是 TCP (面向连接) 和 UDP (无连接)。防火墙规则通常也需要指定协议。
- 服务 (Services): 为了方便配置,防火墙工具通常预定义了一些常见的服务名称(如 `ssh`, `http`, `https`),这些名称与其默认使用的端口号和协议是关联的。使用服务名比直接记端口号更方便。
- 区域 (Zones – FirewallD 特有): FirewallD 将网络连接划分为不同的信任级别区域(如 `public`, `internal`, `dmz`, `trusted` 等)。每个区域可以有自己独立的一套防火墙规则。你可以根据服务器所连接网络接口的信任程度,将其划分到不同的区域。默认区域通常是 `public`,代表不信任的公共网络。
- 默认策略 (Default Policy): 指当没有任何一条明确规则匹配到某个数据包时,防火墙应该如何处理它。通常,对于入站 (Incoming) 流量,最安全的默认策略是**拒绝 (Deny/Reject) 或丢弃 (Drop)** 所有未被明确允许的连接。对于出站 (Outgoing) 流量,通常默认允许所有连接。
理解了这些,我们就可以开始配置了!
UFW (Uncomplicated Firewall) 使用指南 (适用于 Ubuntu/Debian)
UFW 真的是为简化防火墙配置而生,操作非常直观。
检查 UFW 状态
首先看看 UFW 当前是开启还是关闭状态。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ufw status verbose
如果输出是 Status: inactive
,表示防火墙未启用。如果是 Status: active
,则会列出当前的规则。
启用和禁用 UFW
启用 UFW:
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ufw enable
极其重要!!! 在执行 `enable` 命令之前,请**务必确保你已经添加了允许 SSH 连接的规则**(见下文),否则一旦启用,防火墙可能会阻止你当前的 SSH 连接,导致你被锁在服务器外面!系统通常会提示你这一点,输入 `y` 确认。
禁用 UFW:
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ufw disable
设置默认策略
这是配置防火墙的基石。推荐的安全策略是:默认拒绝所有进入的连接,允许所有出去的连接。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ufw default deny incoming
sudo ufw default allow outgoing
这样设置后,只有你明确 `allow` 的端口或服务才能被外界访问。
允许 (Allow) 连接
这是最常用的操作,告诉防火墙放行哪些端口或服务的流量。
- 按端口号允许: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 允许 TCP 协议的 22 端口 (SSH 默认端口) sudo ufw allow 22/tcp # 允许 TCP 协议的 80 端口 (HTTP) sudo ufw allow 80/tcp # 或者直接写端口号,UFW 会默认为 TCP 和 UDP 都允许,但通常明确指定协议更好 # sudo ufw allow 80 # 允许 TCP 协议的 443 端口 (HTTPS) sudo ufw allow 443/tcp # 允许 UDP 协议的 1194 端口 (OpenVPN 默认) sudo ufw allow 1194/udp # 允许一个端口范围 (例如允许 TCP 30000 到 31000) sudo ufw allow 30000:31000/tcp
- 按服务名称允许: UFW 知道很多常用服务的默认端口和协议(定义在
/etc/services
文件里)。 [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]# 允许 SSH (等同于 allow 22/tcp) sudo ufw allow ssh # 允许 HTTP (等同于 allow 80/tcp) sudo ufw allow http # 允许 HTTPS (等同于 allow 443/tcp) sudo ufw allow https
使用服务名更方便记忆。 - 允许特定 IP 或子网访问: 你可以创建更精细的规则。 [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 只允许来自 IP 192.168.1.100 的所有连接 sudo ufw allow from 192.168.1.100 # 只允许来自 192.168.1.0/24 子网的连接访问 SSH 端口 (22) sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
拒绝 (Deny) 或阻止 (Reject) 连接
虽然我们设置了默认拒绝入站,但有时你可能想明确拒绝来自某个特定 IP 的访问。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 拒绝来自 IP 1.2.3.4 的所有连接
sudo ufw deny from 1.2.3.4
# 拒绝访问某个特定端口 (虽然默认已拒绝,但可以明确添加)
sudo ufw deny 111/tcp
注: `deny` 通常是静默丢弃包,`reject` 会返回一个错误信息给发送方。
删除规则
如果你添加了错误的规则,或者不再需要某条规则,可以将其删除。
- 先查看当前规则及其编号: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ufw status numbered
输出会显示类似:Status: active To Action From -- ------ ---- [ 1] 22/tcp ALLOW IN Anywhere [ 2] 80/tcp ALLOW IN Anywhere [ 3] 443/tcp ALLOW IN Anywhere [ 4] 10022/tcp ALLOW IN Anywhere (v6)
- 根据编号删除规则: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 假设要删除第 4 条规则 sudo ufw delete 4
系统会询问你是否确认删除。
连接速率限制 (Rate Limiting)
UFW 提供了一个简单的命令来限制来自同一 IP 的连接尝试频率,有助于防御暴力破解。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 限制 SSH 端口的连接 (默认是 30 秒内最多 6 次尝试)
sudo ufw limit ssh/tcp
启用日志记录
如果你想记录被 UFW 允许或拒绝的连接信息,可以开启日志。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ufw logging on # 或者 low, medium, high 控制日志级别
# 日志通常记录在 /var/log/ufw.log
重置防火墙
如果你把规则搞得一团糟,想恢复到初始状态(禁用状态,无任何规则),可以执行:
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo ufw reset
警告: 这会清除所有规则并禁用防火墙,请谨慎操作!
FirewallD 使用指南 (适用于 CentOS/RHEL/Fedora)
FirewallD 的核心概念是“区域 (Zone)”。你可以把不同的网络接口(比如 eth0, eth1)分配给不同的区域,每个区域应用不同的防火墙策略。默认区域通常是 `public`,代表不受信任的公共网络。
检查 FirewallD 状态
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo systemctl status firewalld
sudo firewall-cmd --state
确保服务是 `active (running)`。
理解区域 (Zone)
- 查看所有可用区域:
sudo firewall-cmd --get-zones
- 查看默认区域:
sudo firewall-cmd --get-default-zone
(通常是 `public`) - 查看当前活动的区域及其绑定的接口:
sudo firewall-cmd --get-active-zones
我们接下来的操作,如果没有特别指定 --zone=<区域名>
,通常都是针对**默认区域**(一般是 `public`)进行的。
Runtime vs. Permanent 配置
FirewallD 有一个重要特性:区分**运行时 (Runtime)** 配置和**永久 (Permanent)** 配置。
- 直接执行的命令(不带
--permanent
)只会修改当前的运行时配置,**重启防火墙或服务器后会失效**。这适合临时测试。 - 带有
--permanent
标志的命令会修改永久配置文件,但**不会立即生效**,需要执行sudo firewall-cmd --reload
或者重启 `firewalld` 服务后才会应用。
通常,我们的操作流程是:先用 --permanent
修改配置,然后执行 sudo firewall-cmd --reload
使其生效。
允许服务 (Services)
FirewallD 预定义了很多服务名称。
- 列出所有预定义的服务:
sudo firewall-cmd --get-services
- 允许某个服务(永久生效): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 允许 SSH 服务 (默认端口 22/tcp) sudo firewall-cmd --permanent --zone=public --add-service=ssh # 允许 HTTP (80/tcp) 和 HTTPS (443/tcp) sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https
(如果你修改了默认区域,记得把--zone=public
换成你的区域名) - 使永久规则生效: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo firewall-cmd --reload
- 查看当前区域允许的服务列表(永久配置): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo firewall-cmd --permanent --zone=public --list-services
允许端口 (Ports)
如果某个服务没有预定义,或者你需要开放非标准端口,可以直接按端口号操作。
- 允许某个端口(永久生效): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 允许 TCP 协议的 10022 端口 (例如修改后的 SSH 端口) sudo firewall-cmd --permanent --zone=public --add-port=10022/tcp # 允许 UDP 协议的 1194 端口 sudo firewall-cmd --permanent --zone=public --add-port=1194/udp # 允许一个端口范围 (TCP 30000 到 31000) sudo firewall-cmd --permanent --zone=public --add-port=30000-31000/tcp
- 使永久规则生效: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo firewall-cmd --reload
- 查看当前区域允许的端口列表(永久配置): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
sudo firewall-cmd --permanent --zone=public --list-ports
允许特定来源 IP (使用 Rich Rules)
FirewallD 使用“富规则 (Rich Rules)”来实现更复杂的访问控制,比如只允许特定 IP 访问特定端口。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 示例:只允许 IP 192.168.1.100 访问 SSH 服务 (假设 SSH 服务已添加)
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100/32" service name="ssh" accept'
# 示例:只允许 192.168.1.0/24 子网访问 TCP 端口 3306 (MySQL)
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
# 使规则生效
sudo firewall-cmd --reload
# 查看当前区域的富规则
sudo firewall-cmd --permanent --zone=public --list-rich-rules
富规则的语法比较灵活,可以实现更精细的控制。
移除服务、端口或规则
要移除之前添加的允许项,使用对应的 --remove-service=
, --remove-port=
, --remove-rich-rule=
参数,同样需要配合 --permanent
和 --reload
。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 移除 http 服务
sudo firewall-cmd --permanent --zone=public --remove-service=http
# 移除 TCP 10022 端口
sudo firewall-cmd --permanent --zone=public --remove-port=10022/tcp
# 移除上面添加的第一条富规则 (需要将规则完整复制过来)
sudo firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100/32" service name="ssh" accept'
# 使更改生效
sudo firewall-cmd --reload
配置默认区域
你可以查看或更改系统默认使用的区域。
[提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中]
# 查看默认区域
sudo firewall-cmd --get-default-zone
# 将默认区域改为 internal (假设 internal 区域配置更宽松,用于内网)
# sudo firewall-cmd --set-default-zone=internal
修改默认区域会影响所有未明确指定区域的网络接口。
UFW vs. FirewallD:简单还是灵活?
那么,这两个工具哪个更好呢?
- UFW: 非常适合新手或者只需要进行简单端口开关控制的场景。它的命令直观易懂,配置简单。
- FirewallD: 功能更强大,特别是“区域”的概念和对运行时/永久配置的分离,使得管理更灵活,尤其适合需要根据不同网络环境应用不同策略的服务器。它的富规则也提供了更精细的控制能力。
实际上,你通常不需要自己选择,因为你的 Linux 发行版会预装并默认启用其中一个(Ubuntu/Debian 默认 UFW,CentOS/RHEL/Fedora 默认 FirewallD)。**建议你就使用系统默认的那个**,并熟悉它的用法即可。同时管理两个防火墙前端通常没有必要,反而可能引起混乱。
重要注意事项
- 先允许 SSH 再启用防火墙! 无论使用 UFW 还是 FirewallD,在你第一次启用防火墙之前,请务必、务必、务必先添加一条允许你的 SSH 连接端口(默认 22 或你修改后的端口)的规则,否则你很可能会在启用防火墙的瞬间失去对服务器的 SSH 连接!
- 谨慎测试规则: 特别是当你添加复杂的拒绝规则或富规则时,最好先在测试环境验证,或者保持一个备用的连接方式(如云控制台 VNC),以防把自己锁在外面。
- 多层防御: 不要仅仅依赖服务器自身的防火墙。云服务器用户应该同时利用好云平台提供的**安全组 (Security Group)** 或网络 ACL,它们在更上层过滤流量,通常效率更高。这是一个纵深防御的概念。
- 保持更新: 防火墙软件本身也需要更新以修复潜在的 Bug 或安全问题。
结论
配置防火墙是保障 Linux 服务器安全的基础一步,绝非可有可无。幸运的是,有了 UFW 和 FirewallD 这样用户友好的工具,我们不再需要直接面对复杂的 iptables/nftables 规则就能完成大部分常见的配置任务。掌握为你所使用的发行版对应的防火墙工具(UFW 或 FirewallD)的基本操作——检查状态、设置默认策略、允许/拒绝必要的端口和服务——是你保护服务器免受未授权访问的关键技能。记住“最小权限”原则,只开放你确实需要的“大门”,让你的服务器“门卫”尽忠职守吧!