跳至正文
老丹的足迹 —— 代码写给机器,游记写给自己,感悟写给时间
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面
老丹的足迹 老丹的足迹
老丹的足迹 老丹的足迹
  • 首页
  • 示例页面
  • 首页
  • 示例页面

UFW 详解:Linux 防火墙的简洁之道

前言

在 Linux 系统中,防火墙是保障系统安全的重要屏障。然而,传统的 iptables 防火墙配置语法复杂、规则繁多,对新手甚至一些资深管理员来说都不够友好。为了解决这个问题,Ubuntu 项目开发了 UFW(Uncomplicated Firewall,即“不复杂的防火墙”),顾名思义,它的诞生就是为了让防火墙配置变得简单而直观。

如今,UFW 已成为 Debian/Ubuntu 系列发行版的默认防火墙管理工具,并且被广泛应用于个人电脑、云服务器和 VPS 环境中。本文将全面、系统地介绍 UFW 的方方面面。

一、UFW 是什么

1.1 定义与定位

UFW 是一个位于 iptables 之上的前端管理工具。它不是重新实现防火墙功能,而是对 Linux 内核中 netfilter/iptables 框架的简化封装。

简单来说:

  • 底层:Linux 内核的 netfilter 模块真正执行包过滤工作
  • 中间层:iptables 作为用户空间工具与内核交互
  • 上层:UFW 提供人性化的命令接口,将用户指令转换为 iptables 规则

这种分层设计让用户既能享受 UFW 的便捷,又能在必要时直接操作 iptables 实现更复杂的功能。

1.2 设计哲学

UFW 的核心设计理念可以概括为以下几点:

  1. 简单优先:命令语法接近自然语言。允许 SSH 连接就是 allow ssh,拒绝某个端口就是 deny 25。
  2. 默认安全:出厂策略为“拒绝所有传入,允许所有传出”,既保证了外部无法主动访问,又确保了系统更新和日常网络通信正常。
  3. 轻量无感:UFW 本身只是一个 Python 脚本,不运行常驻守护进程,不消耗系统资源。所有规则最终由内核执行,性能无损。
  4. 应用感知:支持通过应用程序名称(如“Nginx Full”、“OpenSSH”)配置防火墙,用户无需记忆端口号。

二、核心概念详解

2.1 规则(Rules)

规则是 UFW 的核心。一条完整的规则通常包含以下要素:

要素说明示例
方向传入(incoming)或传出(outgoing)incoming 控制谁可以访问本机
动作允许(allow)或拒绝(deny)allow 表示放行
协议TCP、UDP 或两者tcp、udp 或不指定(表示两者)
端口服务监听的端口号22(SSH)、80(HTTP)
来源/目标IP 地址或网段192.168.1.0/24

2.2 方向(Direction)

  • incoming(传入):外部主机发往本机的连接请求。这是防火墙配置的核心,绝大多数安全策略都围绕它展开。例如:允许外部访问 Web 服务(80/443端口),但不允许访问数据库端口(3306)。
  • outgoing(传出):本机主动向外发起的连接。默认全部允许,通常无需修改。但在特殊场景下(如防止恶意软件外联、限制特定程序联网),可以通过配置传出规则实现精细控制。

2.3 动作(Action)

  • allow:允许数据包通过。常用于开放服务端口,如 HTTP、HTTPS、SSH。
  • deny:丢弃数据包,不回应任何信息。对方会感觉到连接超时,通常用于屏蔽恶意流量。
  • reject:拒绝数据包,并明确回复“端口不可达”的 ICMP 错误信息。对方能立刻知道连接被拒绝,适用于需要明确反馈的场景(如某些内部服务)。

deny 和 reject 的区别:

  • deny 会静默丢弃数据包,扫描端口时表现为“过滤/关闭”,不暴露系统存在。
  • reject 会立即告知对方“端口关闭”,扫描速度更快,但暴露了防火墙的存在。

2.4 应用程序配置文件(Application Profiles)

这是 UFW 的一个特色功能。许多常见软件(OpenSSH、Nginx、Apache、Samba 等)在安装时会自动在 /etc/ufw/applications.d/ 目录下生成配置文件,定义了该服务需要开放的端口和协议。

例如,安装 Nginx 后,可以通过 ufw app list 看到 Nginx HTTP、Nginx HTTPS、Nginx Full 等配置项。使用 ufw allow 'Nginx Full' 就能一次性开放 80 和 443 端口。

三、安装与基本配置

3.1 安装

在 Debian/Ubuntu 系统中,UFW 通常默认安装。如果没有,可以通过以下命令安装:

# Debian/Ubuntu 系统
sudo apt update
sudo apt install ufw -y

# 其他发行版(如果可用)
# Arch Linux: sudo pacman -S ufw
# Fedora: sudo dnf install ufw (需启用 EPEL)

3.2 初始配置原则

重中之重:远程连接前必须先允许 SSH!

如果你通过 SSH 管理远程服务器,在启用防火墙之前,务必先执行:

sudo ufw allow ssh
# 或显式指定端口:sudo ufw allow 22/tcp

这是因为 UFW 的默认策略是“拒绝所有传入连接”。如果不先放行 SSH 端口,一旦执行 ufw enable,当前的 SSH 连接会被立即切断,你将无法再远程登录(除非通过控制台或其他方式恢复)。

3.3 启用与禁用

# 查看当前状态(inactive 表示关闭,active 表示开启)
sudo ufw status

# 启用防火墙(注意:启用前请确认 SSH 端口已放行)
sudo ufw enable

# 禁用防火墙(用于紧急排错或临时关闭)
sudo ufw disable

# 重置所有规则,恢复到初始状态
sudo ufw reset

3.4 默认策略

UFW 的默认策略可以通过以下命令查看和修改:

# 查看当前默认策略
sudo ufw status verbose

# 修改默认策略(一般不建议改动)
sudo ufw default deny incoming      # 默认拒绝所有传入(默认值)
sudo ufw default allow outgoing     # 默认允许所有传出(默认值)
sudo ufw default deny outgoing      # 默认拒绝所有传出(严格模式)

默认的“拒绝传入、允许传出”策略适用于绝大多数场景。如果修改为“拒绝传出”,则需要额外配置允许 DNS、HTTP、HTTPS 等常见传出端口,否则系统将无法上网。

四、常用命令示例

4.1 基础规则管理

# 允许特定端口(同时允许 TCP 和 UDP)
sudo ufw allow 53

# 允许特定端口及协议
sudo ufw allow 80/tcp              # 只允许 TCP
sudo ufw allow 123/udp             # 只允许 UDP(NTP 服务)

# 允许特定服务名称(推荐,更直观)
sudo ufw allow ssh                 # 等同于 allow 22/tcp
sudo ufw allow http                # 等同于 allow 80/tcp
sudo ufw allow https               # 等同于 allow 443/tcp

# 拒绝特定端口
sudo ufw deny 25                   # 拒绝 SMTP(防止被用作邮件中继)
sudo ufw deny 3306                 # 拒绝 MySQL 端口外部访问

4.2 基于 IP 和网段的规则

# 允许来自特定 IP 的所有连接
sudo ufw allow from 192.168.1.100

# 允许来自整个网段的连接
sudo ufw allow from 192.168.1.0/24

# 允许特定 IP 访问特定端口
sudo ufw allow from 203.0.113.50 to any port 22

# 允许整个网段访问 Web 服务(80 端口)
sudo ufw allow from 10.0.0.0/8 to any port 80

# 拒绝特定 IP 访问所有端口
sudo ufw deny from 1.2.3.4

# 拒绝特定 IP 访问特定端口
sudo ufw deny from 5.6.7.8 to any port 443

4.3 高级规则

# 允许特定网段的 TCP 端口范围(1000-2000)
sudo ufw allow from 192.168.1.0/24 to any port 1000:2000/tcp

# 限制连接频率(防止暴力破解,同一 IP 30 秒内尝试 6 次以上连接则拒绝)
sudo ufw limit ssh

# 记录被拒绝的包(用于调试和入侵检测)
sudo ufw logging on
sudo ufw logging high             # 设置日志级别(off/low/medium/high)

4.4 规则查看与删除

# 查看简单规则列表
sudo ufw status

# 查看带编号的详细规则(推荐用于删除操作)
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

# 按编号删除规则(最简捷)
sudo ufw delete 2                # 删除第 2 条规则(80/tcp)

# 按完整命令删除(较麻烦,但精准)
sudo ufw delete allow 80/tcp
sudo ufw delete deny from 1.2.3.4

4.5 应用程序配置管理

# 查看所有可用的应用配置
sudo ufw app list

# 输出示例:
# Available applications:
#   OpenSSH
#   Nginx Full
#   Nginx HTTP
#   Nginx HTTPS
#   Samba

# 查看某个应用的详细信息(了解它开放哪些端口)
sudo ufw app info 'Nginx Full'

# 输出示例:
# Profile: Nginx Full
# Title: Web Server (Nginx, HTTP + HTTPS)
# Description: small, powerful, scalable web/proxy server.
# Ports:
#   80,443/tcp

# 按应用名称允许
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'

# 更新应用程序配置数据库(安装新软件后可能需要执行)
sudo ufw app update

五、高级配置与场景案例

5.1 修改 UFW 配置文件

除了命令行,UFW 的许多全局配置可以通过编辑 /etc/default/ufw 文件完成:

# 编辑主配置文件
sudo nano /etc/default/ufw

# 重要参数说明:
# IPV6=yes                     # 是否启用 IPv6 支持
# DEFAULT_INPUT_POLICY="DROP"  # 默认传入策略
# DEFAULT_OUTPUT_POLICY="ACCEPT" # 默认传出策略
# DEFAULT_FORWARD_POLICY="DROP"  # 默认转发策略

此外,自定义规则可以写入 /etc/ufw/before.rules 和 /etc/ufw/after.rules 文件中。这些规则会分别在 UFW 内置规则前后执行,用于实现复杂场景。

5.2 端口转发配置

如果需要将外部对某个端口的访问转发到另一台内网服务器,需要手动编辑 before.rules 文件:

# 1. 开启 IP 转发
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sudo sysctl -p

# 2. 编辑 /etc/ufw/before.rules,在 filter 部分之前添加 NAT 规则:
# *nat
# :PREROUTING ACCEPT [0:0]
# -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
# COMMIT

# 3. 重启 UFW
sudo ufw disable
sudo ufw enable

5.3 日志与调试

UFW 的日志记录在 /var/log/ufw.log 中,对于排查被拒绝的连接非常有用:

# 启用日志
sudo ufw logging on

# 实时监控日志
sudo tail -f /var/log/ufw.log

# 查看特定时间段被拒绝的连接
sudo grep "DPT=22" /var/log/ufw.log | tail -20   # 查看 SSH 端口的拒绝记录

六、UFW vs 其他防火墙工具

6.1 UFW vs iptables

特性UFWiptables
易用性★★★★★ 命令简洁直观★☆☆☆☆ 语法复杂,学习曲线陡峭
功能性★★★☆☆ 覆盖 80% 常见需求★★★★★ 功能极其强大,无所不能
灵活性★★★☆☆ 规则表达能力有限★★★★★ 可实现任何网络过滤逻辑
适用场景个人电脑、普通服务器、VPS复杂网络环境、高级路由/NAT、透明代理

选择建议:

  • 日常使用 → UFW 足够
  • 需要端口转发、策略路由、字符串匹配等 → 直接用 iptables

6.2 UFW vs firewalld

firewalld 是 RHEL/CentOS/Fedora 系列的默认防火墙工具,与 UFW 各有千秋:

特性UFWfirewalld
后端iptablesiptables/nftables
运行模式命令行工具(无常驻进程)常驻守护进程
动态更新需重启服务或 reload支持动态更新,无需中断连接
区域概念无有(zone 概念,按网络环境分组)
目标用户桌面用户、初级管理员企业级服务器、专业管理员

七、最佳实践与注意事项

7.1 安全最佳实践

  1. 启用前先放行 SSH:这是最重要的一条,尤其对于远程服务器。
  2. 最小权限原则:只开放业务必需的端口,其余全部拒绝。
  3. 使用应用配置:优先使用 ufw allow '服务名',而非硬编码端口号,可读性更强。
  4. 定期审计规则:ufw status numbered 定期检查,删除无用规则。
  5. 限制敏感服务:数据库(3306)、Redis(6379)等仅允许内网或特定 IP 访问。
  6. 启用连接限制:对 SSH 等暴露在公网的服务使用 ufw limit,降低暴力破解风险。

7.2 常见错误与解决

问题原因解决方案
启用 UFW 后 SSH 断开忘记提前放行 SSH 端口通过控制台执行 ufw allow ssh
规则添加后不生效规则顺序问题,被前面的规则拦截检查 ufw status numbered,调整顺序
应用无法被外部访问服务监听在 127.0.0.1(仅本地)而非 0.0.0.0修改服务配置文件,改为监听所有接口
规则太多无法维护没有规则编号管理使用 delete 编号 删除
iptables 和 UFW 规则冲突混合使用两种工具统一使用 UFW,除非有特殊需求

7.3 UFW 的局限性

认识到 UFW 的局限,才能知道何时应该“弃用它”而“投奔 iptables”:

  • 无法实现基于状态的复杂匹配(如 -m state --state NEW,RELATED)
  • 对 IPv6 的支持虽好,但精细控制不如 iptables
  • 无法实现报文修改(如 TTL 修改、TOS 标记)
  • 无法实现字符串匹配(如 -m string --string "malicious")
  • 无法实现连接追踪的细粒度调整

当遇到以上需求时,请直接使用 iptables 或 nftables。

结语

UFW 以它的“不复杂”为名,也以“简单可靠”著称。它不是 iptables 的替代品,而是 iptables 的美化者和便捷层。在绝大多数场景中——无论是保护你的个人 Linux 桌面,还是为一个初创公司的 VPS 保驾护航——UFW 都能以最少的配置代价,提供足够的安全保障。

记住几个核心命令 allow、deny、status、delete,你就已经掌握了 UFW 的精髓。当你的需求超越了 UFW 的能力边界时,意味着你已经成长为需要直接驾驭 iptables 的高级用户了——而那时,你会感谢 UFW 曾经带你走过的这段简洁之路。

作者

老丹

关注我
其他文章
上一个

NMEA 0183 协议处理与 C++ 开源库选型指南

下一个

WordPress 中 Redis 对象缓存完全指南

关于博主

    老丹是一名C/C++后台开发工程师,信奉“无抽象不设计,无性能不生产”。

  • 技术栈:Modern C++、Linux环境编程、多线程/并发、网络编程等。
  • 信条:能用constexpr解决的问题绝不拖到运行时,能靠RAII避免的泄漏绝不写析构。
  • 正在填坑:从解封装到渲染的C++全链路实现,正在驯服FFmpeg与H.264/H.265。
  • 输出原则:这里的每一段代码都经过-Wall -Wextra -Werror -O2的洗礼。

搜索

近期文章

  • 正向代理与反向代理:一篇搞懂两者的区别 2026年6月6日
  • WP Super Cache 完全指南:为你的 WordPress 博客加速 2026年6月6日
  • WordPress 中 Redis 对象缓存完全指南 2026年6月6日
  • UFW 详解:Linux 防火墙的简洁之道 2026年6月6日
  • NMEA 0183 协议处理与 C++ 开源库选型指南 2026年6月3日

文章分类

  • C/C++开发 (5)
  • Linux服务配置 (3)
  • 计算机理论 (1)
联系我们:📍 地址:中国·广东省深圳市   |   ✉️ 邮箱:support@tanglinux.com   |   💬 QQ:870866607
版权所有:老丹的足迹粤ICP备2026061170号-1       公安备案图标 粤公网安备44030002013274号