[指南] Linux 防火墙入门:UFW 和 FirewallD 基础配置与常用规则教程

[指南] Linux 防火墙入门:UFW 和 FirewallD 基础配置与常用规则教程

欢迎来到 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` 会返回一个错误信息给发送方。

删除规则

如果你添加了错误的规则,或者不再需要某条规则,可以将其删除。

  1. 先查看当前规则及其编号: [提示:请将以下代码片段复制并粘贴到 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)
  2. 根据编号删除规则: [提示:请将以下代码片段复制并粘贴到 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 预定义了很多服务名称。

  1. 列出所有预定义的服务:sudo firewall-cmd --get-services
  2. 允许某个服务(永久生效): [提示:请将以下代码片段复制并粘贴到 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 换成你的区域名)
  3. 使永久规则生效: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo firewall-cmd --reload
  4. 查看当前区域允许的服务列表(永久配置): [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo firewall-cmd --permanent --zone=public --list-services

允许端口 (Ports)

如果某个服务没有预定义,或者你需要开放非标准端口,可以直接按端口号操作。

  1. 允许某个端口(永久生效): [提示:请将以下代码片段复制并粘贴到 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
  2. 使永久规则生效: [提示:请将以下代码片段复制并粘贴到 WordPress 的“代码”区块中] sudo firewall-cmd --reload
  3. 查看当前区域允许的端口列表(永久配置): [提示:请将以下代码片段复制并粘贴到 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)的基本操作——检查状态、设置默认策略、允许/拒绝必要的端口和服务——是你保护服务器免受未授权访问的关键技能。记住“最小权限”原则,只开放你确实需要的“大门”,让你的服务器“门卫”尽忠职守吧!

实操指南

[指南] 新购 Linux 服务器后必做的 10+ 项安全设置(保姆级指南)

2025-4-27 11:08:24

实操指南

[科普] 浅谈服务器日志审计:发现安全威胁的蛛丝马迹

2025-4-28 11:12:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧