Ubuntu UFW 防火墙完全指南
UFW(Uncomplicated Firewall)是Ubuntu内置的简易防火墙管理工具,旨在简化iptables配置。教程首先介绍其核心优势:命令直观、支持IPv6、提供应用配置及速率限制等。在基础配置部分,遵循“默认拒绝入站、允许出站”的安全原则,并强调配置SSH规则后再启用防火墙,避免被锁在服务器外。规则可按端口、服务名、IP地址或网络接口灵活添加,支持删除与编号管理。高级功能包括启用速率限制防范暴力破解、自定义应用配置、添加规则注释以及调节日志级别用于排查攻击。最后给出Web服务器、生产环境等典型场景配置示例,并总结了最佳实践:保持规则简洁、定期审计、结合多层防护。整体教程涵盖了从安装、配置到排错的全流程,帮助用户安全高效地管理Ubuntu网络访问。
博主博客
一、UFW 简介
UFW,全称 Uncomplicated Firewall(简单防火墙),是 Ubuntu 系统默认的防火墙管理工具。它提供了一个用户友好的命令行界面,用于管理 Linux 内核中的 iptables/netfilter 防火墙规则[reference:0]。顾名思义,UFW 的设计初衷就是让防火墙配置变得简单直接,在降低使用门槛的同时,仍然保留了强大的灵活性和功能完整性。对于从零开始学习服务器安全的用户来说,UFW 是一个非常理想的起点,它的命令行为模式稳定可预测,无需深入理解 iptables 复杂的链、表和底层流转机制就能完成基础的网络防护配置[reference:1]。
UFW 本质上是一个位于 Linux 原生包过滤引擎之上的管理层,内核仍然负责实际的流量评估和决策,而 UFW 则将用户的配置意图翻译成底层规则,并负责规则的持久化管理和启动加载。UFW 适用于绝大多数日常场景,但如果需要实现极其复杂的高性能防火墙策略,也可以绕过 UFW 直接使用 nftables[reference:2]。
核心优势:
- 命令简洁直观,易于学习和记忆
- 预装于 Ubuntu 系统(默认未启用),开箱即用
- 支持 IPv4 和 IPv6 双栈
- 提供应用配置文件机制,简化服务端口管理
- 具备速率限制功能,可防范暴力破解攻击
- 可通过 GUFW 提供图形化界面
二、安装与初始配置
2.1 安装 UFW
UFW 通常预装在 Ubuntu 系统中,但如果因某些原因被卸载,可以通过以下命令重新安装:
sudo apt update
sudo apt install ufw
安装完成后,UFW 默认处于未启用(inactive)状态,这允许你在正式激活防火墙之前,先完成所有规则的配置,避免在远程服务器上因配置失误而被锁定在外[reference:3]。
2.2 设置默认策略(核心安全原则)
防火墙配置中有一条黄金法则:“默认拒绝、按需放行”。即默认拒绝所有入站连接,默认允许所有出站连接。出站连接默认开放,是因为服务器主动发起的对外通信(如更新软件、连接数据库)不应受不必要的限制;而入站连接则默认关闭,只对明确需要的端口和服务开放,这能最大限度地缩小攻击面[reference:4]。
# 默认拒绝所有入站连接(incoming)
sudo ufw default deny incoming
# 默认允许所有出站连接(outgoing)
sudo ufw default allow outgoing
⚠️ 重要提醒:在执行以上命令之前,务必先配置好 SSH 允许规则,否则一旦默认策略生效而 SSH 端口尚未放行,你将无法再远程连接到服务器[reference:5]。
2.3 启用 IPv6 支持(可选)
如果你的服务器启用了 IPv6,建议在配置文件中开启 UFW 对 IPv6 的支持:
# 编辑配置文件
sudo nano /etc/default/ufw
# 找到并设置 IPV6=yes
IPV6=yes
2.4 启用防火墙
完成默认策略配置后,使用以下命令正式启用防火墙:
sudo ufw enable
系统会提示启用 UFW 可能中断现有 SSH 连接,输入 y 确认即可[reference:6]。
启用后,可随时使用以下命令查看防火墙状态:
# 基础状态
sudo ufw status
# 详细状态(包含日志级别、默认策略等)
sudo ufw status verbose
# 带编号状态(便于删除特定规则)
sudo ufw status numbered
输出示例:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
2.5 其他基本控制命令
# 禁用防火墙(停止所有规则,服务停止运行)
sudo ufw disable
# 重置防火墙(删除所有自定义规则,恢复到默认未启用状态)
sudo ufw reset
# 重新加载防火墙(规则修改后无需重启,reload 即可)
sudo ufw reload
三、基础规则配置
UFW 提供了多种灵活的方式来配置防火墙规则,你可以按端口号、服务名称、IP 地址、子网或网络接口进行精细化控制。
3.1 按端口号允许/拒绝
# 允许 TCP 端口 80(HTTP)
sudo ufw allow 80/tcp
# 允许 UDP 端口 53(DNS)
sudo ufw allow 53/udp
# 拒绝 TCP 端口 23(Telnet)
sudo ufw deny 23/tcp
3.2 按服务名称允许/拒绝
UFW 内置了大量常见服务的配置文件,位于 /etc/ufw/applications.d/ 目录。你可以直接使用服务名称来添加规则,无需记忆端口号:
# 查看所有可用的应用配置文件
sudo ufw app list
# 查看特定应用的详细信息(包含端口和协议)
sudo ufw app info OpenSSH
# 按服务名称添加规则
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
常用服务名称与端口的对应关系:
ssh→ 22/tcphttp→ 80/tcphttps→ 443/tcpftp→ 20/tcp, 21/tcpsmtp→ 25/tcpmysql→ 3306/tcp
3.3 按 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.103 to any port 3306
3.4 按网络接口控制
在多网卡环境中(如公有云服务器),可以针对特定的网络接口添加规则:
# 仅允许从 eth0 接口进入的 SSH 连接
sudo ufw allow in on eth0 to any port 22
# 阻止从 eth1 接口进入的所有流量(除已建立连接外)
sudo ufw deny in on eth1
sudo ufw allow in on eth1 from any to any port 53
3.5 端口范围配置
# 允许 8000-8010 端口的 TCP 流量
sudo ufw allow 8000:8010/tcp
# 允许 9000-9999 端口的 UDP 流量
sudo ufw allow 9000:9999/udp
3.6 协议组合规则
# 指定协议(TCP/UDP)的多端口规则
sudo ufw allow in on eth0 to any port 80,443,8080 proto tcp
# 限制来源 IP 对特定端口的访问协议
sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp
3.7 规则删除与管理
# 方式一:使用 delete 命令(推荐)
sudo ufw delete allow 80/tcp
# 方式二:使用编号删除(先查看编号)
sudo ufw status numbered
sudo ufw delete 3
# 方式三:完整规则匹配删除
sudo ufw delete allow from 192.168.1.100 to any port 22
# 在指定位置插入规则(优先级更高)
sudo ufw insert 1 allow from 203.0.113.100
四、高级配置技巧
4.1 速率限制(Rate Limiting)
速率限制功能可以有效防范暴力破解攻击。UFW 的 limit 命令会限制特定端口的连接频率——如果某个 IP 地址在 30 秒内尝试建立 6 次或更多连接,后续的连接将被临时拒绝[reference:7]。这对于 SSH 端口来说尤为实用。
# 对 SSH 端口启用速率限制(最常用的安全措施)
sudo ufw limit ssh
# 对特定端口和协议启用速率限制
sudo ufw limit 22/tcp
# 对指定接口的流量进行速率限制
sudo ufw limit in on eth0 to any port 80 proto tcp
速率限制会在日志中产生对应的记录,你可以通过日志观察到哪些 IP 地址因频繁请求而被限制。
4.2 创建自定义应用配置文件
当你需要管理运行在非标准端口上的应用程序时,可以创建自定义的应用配置文件。这种做法可以保持 UFW 规则的整洁,并支持服务名称管理[reference:8]。
# 创建自定义应用配置文件目录(如不存在)
sudo mkdir -p /etc/ufw/applications.d
# 创建自定义 Web 应用配置
sudo nano /etc/ufw/applications.d/myapp
配置文件示例(.ini 格式):
[MyWebApp]
title=My Custom Web Application
description=Custom web application with multiple ports
ports=80,443,8080,8443/tcp
[MyDatabase]
title=Custom Database Service
description=Database cluster with replication
ports=3306,3307,4444,4567,4568/tcp
创建完成后,更新应用列表并使用:
# 更新应用配置
sudo ufw app update MyWebApp
# 允许自定义应用
sudo ufw allow MyWebApp
4.3 规则注释
在复杂规则集中添加注释,可以大大提高规则的可读性和维护效率:
# 添加规则时附带注释
sudo ufw allow 22/tcp comment "Allow SSH management access"
sudo ufw allow 80/tcp comment "Allow HTTP web traffic"
sudo ufw allow 443/tcp comment "Allow HTTPS web traffic"
# 查看带注释的规则
sudo ufw status verbose
4.4 日志配置与管理
日志是排查网络问题和监控安全威胁的重要工具。
启用和设置日志级别:
# 启用日志(默认级别 low)
sudo ufw logging on
# 设置日志级别
sudo ufw logging low # 基础日志
sudo ufw logging medium # 中等详细度(推荐日常使用)
sudo ufw logging high # 高详细度(仅用于短时排查)
sudo ufw logging full # 完整日志(记录所有匹配规则的包)
日志级别说明[reference:9]:
low:记录被阻止的数据包(默认级别)medium:记录被阻止的数据包以及允许的数据包high:记录被阻止的数据包、允许的数据包以及速率限制事件full:记录所有数据包的完整信息(日志量极大,仅用于调试)
查看日志:
# 查看完整 UFW 日志
sudo cat /var/log/ufw.log
# 实时监控日志(推荐)
sudo tail -f /var/log/ufw.log
# 通过 systemd 日志查看
sudo journalctl -u ufw
sudo journalctl -u ufw -f # 实时监控
# 过滤特定端口
sudo grep "DPT=22" /var/log/ufw.log
# 统计被阻止的 IP 地址及次数(找出高频攻击源)
sudo grep "BLOCK" /var/log/ufw.log | awk '{print $8}' | sort | uniq -c | sort -nr
日志格式解析:
一条典型的 UFW 日志包含以下关键字段[reference:10]:
IN=:数据包进入的网络接口OUT=:数据包出去的网络接口SRC=:源 IP 地址DST=:目标 IP 地址DPT=:目标端口号PROTO=:协议类型(TCP/UDP/ICMP)
通过分析日志,可以快速识别暴力破解攻击(短时间内同一端口出现大量不同 IP 的 BLOCK 记录)和端口扫描行为(同一 IP 短时间内对多个端口发起连接请求)[reference:11]。
4.5 before.rules 与 after.rules 高级自定义
对于 UFW 命令本身不直接支持的高级需求(如端口转发、策略路由等),可以通过编辑 /etc/ufw/before.rules 和 /etc/ufw/after.rules 文件,以标准的 iptables-restore 语法添加自定义规则[reference:12]。
规则评估顺序为:before.rules → user.rules(UFW 命令管理的用户规则) → after.rules[reference:13]。IPv6 的对应文件为 before6.rules 和 after6.rules[reference:14]。
以下是一个端口转发配置示例(将外部 8080 端口流量转发到内网 80 端口),通常需要添加到 before.rules 文件中 *filter 段落的合适位置:
# 编辑 before.rules
sudo nano /etc/ufw/before.rules
# 在 *filter 段落之前,添加 NAT 配置
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
COMMIT
配置完成后,需要重启 UFW 使规则生效:
sudo ufw disable
sudo ufw enable
其他可编辑的配置文件包括:
/etc/default/ufw:全局高级配置(默认策略、IPv6 开关、内核参数调优等)/etc/ufw/ufw.conf:额外的全局配置/etc/ufw/sysctl.conf:内核网络参数调优
五、常用场景配置示例
5.1 Web 服务器基础配置
# 1. 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. 允许 SSH 连接(务必先做这一步)
sudo ufw allow ssh
# 3. 允许 Web 服务
sudo ufw allow http
sudo ufw allow https
# 4. (可选)允许数据库访问(仅限特定子网)
sudo ufw allow from 192.168.1.0/24 to any port 3306
# 5. 启用防火墙
sudo ufw enable
# 6. 验证规则
sudo ufw status verbose
5.2 生产环境加固配置
# 1. 安全默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. SSH 防护(速率限制 + 仅允许特定 IP)
sudo ufw limit from 203.0.113.0/24 to any port 22
# 3. Web 服务开放(可添加注释)
sudo ufw allow 80/tcp comment "HTTP web traffic"
sudo ufw allow 443/tcp comment "HTTPS web traffic"
# 4. 管理端口限制(如 phpMyAdmin 等)
sudo ufw allow from 203.0.113.0/24 to any port 8080
# 5. 启用合适级别的日志
sudo ufw logging medium
# 6. 启用并验证
sudo ufw enable
sudo ufw status numbered
5.3 家用/办公桌面环境配置
# 默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许本地网络共享(常见需求)
sudo ufw allow from 192.168.1.0/24 to any port 139,445 # Samba 文件共享
sudo ufw allow from 192.168.1.0/24 to any port 22 # 局域网 SSH
sudo ufw allow 631/tcp # CUPS 打印服务
sudo ufw allow 5353/udp # mDNS(Avahi/Bonjour)
# 启用防火墙
sudo ufw enable
六、故障排查与常见问题
6.1 基础排查步骤
# 步骤1:检查防火墙状态
sudo ufw status verbose
# 步骤2:确认 UFW 服务是否在运行
sudo systemctl status ufw
# 步骤3:查看日志
sudo tail -f /var/log/ufw.log
# 步骤4:确认服务监听端口
sudo ss -tulpn # 替代 netstat 的现代工具
# 步骤5:从外部进行端口扫描测试(在另一台机器上)
nmap -p <端口号> <服务器IP>
6.2 常见问题及解决方案
问题1:防火墙已启用但规则不生效
可能原因:
- 规则顺序问题:
status numbered查看规则顺序,规则按序号从小到大依次匹配,一旦匹配到允许或拒绝规则,后续规则不再处理。使用insert命令将关键规则插入到合适位置。 - 未重新加载:执行
sudo ufw reload让配置生效。 - 与其他防火墙工具冲突:确保没有同时运行 firewalld 等其他防火墙[reference:15]。
问题2:UFW 显示端口已阻止但仍然可以访问
这是 UFW 有状态防火墙的正常行为。已经建立的 TCP 连接不会因为新添加的拒绝规则而中断,内核会追踪活动会话并继续允许该会话的流量。这并非规则失效,而是状态跟踪机制的正常表现[reference:16]。关闭现有连接后重新测试,新连接应该会被拒绝。
问题3:Docker 服务绕过 UFW 规则
Docker 在宿主机上创建自己的 iptables 链(DOCKER-USER 链),并在 UFW 规则之前处理容器流量。在某些配置下,Docker 的流量可能完全不经过 UFW 管理的链,导致你在宿主机层面配置的拒绝规则对容器服务无效[reference:17]。
解决方法:
- 在 Docker 的
DOCKER-USER链中手动添加限制规则 - 或在
before.rules中添加更早生效的自定义规则
问题4:SSH 连接被意外阻断
这是远程配置防火墙时最危险的问题[reference:18]:
# 临时恢复连接
sudo ufw disable
# 修复后重新启用
sudo ufw allow ssh
sudo ufw enable
预防措施(生产环境强烈推荐):
# 在进行任何可能阻断连接的操作前,先创建一个定时回滚任务
sudo cp -a /etc/ufw /etc/ufw.bak.$(date +%F-%H%M%S)
echo "cp -a /etc/ufw.bak.*/* /etc/ufw/ && ufw reload" | sudo at now + 5 minutes
# 确认 SSH 仍然正常工作后,取消回滚任务
sudo atq # 查看任务编号
sudo atrm <任务编号>
问题5:ufw: command not found
UFW 未安装。使用 sudo apt install ufw 安装,且务必使用 sudo 执行所有 UFW 命令[reference:19]。
6.3 调试命令汇总
# 查看 UFW 在 iptables 中实际添加的原始规则
sudo ufw show raw
# 查看特定链的规则
sudo iptables -L -n -v # IPv4
sudo ip6tables -L -n -v # IPv6
# 测试端口可达性(从本机)
telnet localhost 22
nc -zv localhost 22
# 实时抓包分析(高级调试)
sudo tcpdump -i eth0 port 22
七、最佳实践与安全建议
7.1 黄金法则
-
永远先配置 SSH 规则,再启用防火墙:这是防止被锁在服务器外的生命线。远程操作时,务必在关闭当前会话前先用另一个终端测试新配置是否正常。
-
采用“默认拒绝、按需放行”的策略:将入站策略设为
deny,只开放业务必须的端口,将攻击面降到最低[reference:20]。 -
规则保持简洁并添加注释:每条规则都应清晰标明其用途,便于日后维护和审计。避免规则重复或相互冲突[reference:21]。
7.2 重要安全增强措施
-
对 SSH 端口启用速率限制:使用
sudo ufw limit ssh是防范暴力破解的最有效手段之一[reference:22]。 -
尽可能将管理端口限制在特定 IP 范围内:如果只有有限的运维 IP 地址需要访问管理端口(如 22、8080),应明确只允许这些来源访问。
-
修改默认 SSH 端口:将 SSH 从默认的 22 端口改到其他端口,可以大幅减少自动化扫描工具的探测尝试。
-
定期审计规则集:检查是否有过时或不再需要的规则,及时清理[reference:23]。
-
启用合理级别的日志并定期审查:日志是发现潜在攻击行为的第一手资料,建议至少保留最近几周的日志用于回溯分析。
-
防火墙只是安全体系的一环:还需结合强密码策略、SSH 密钥认证、Fail2ban(用于自动封禁恶意 IP)、系统漏洞修复和定期更新等措施,形成多层防御体系[reference:24]。
7.3 规则修改的安全流程
在对生产服务器进行防火墙规则变更时,建议遵循以下流程[reference:25]:
- 备份当前配置:
sudo cp -a /etc/ufw /etc/ufw.bak - 添加受限允许规则(如限制来源 IP)
- 测试新规则是否按预期生效
- 确认无误后移除宽泛规则
- 保留回滚方案(可回退到备份配置)
- 验证关键服务(SSH、Web 等)在规则变更后仍可正常访问
八、图形化界面:GUFW
对于桌面版 Ubuntu 用户或偏好图形界面的管理员,GUFW(Graphical Uncomplicated Firewall)提供了一个直观的图形化管理前端[reference:26]。
8.1 安装 GUFW
sudo apt update
sudo apt install gufw
8.2 使用方法
- 从应用程序菜单中启动“Firewall Configuration”(或终端运行
gufw) - 主界面分为几个核心区域[reference:27]:
- 状态开关:位于窗口顶部,用于启用或禁用 UFW
- 配置文件选择:可针对不同网络环境(家庭、公共等)切换规则集
- 规则选项卡:添加、编辑、删除允许或拒绝规则
- 日志查看器:实时查看防火墙日志
GUFW 会在启动时要求输入管理员密码,之后即可通过鼠标点击完成绝大多数防火墙配置操作。需要注意的是,GUFW 依赖桌面环境,不适用于无图形界面的 Ubuntu Server 环境,服务器场景仍需使用命令行版本[reference:28]。
九、总结
UFW 是一款功能强大且易于使用的防火墙管理工具,它通过简洁的命令行界面,将复杂的 iptables 规则管理变得清晰直观。从单台服务器到大规模云环境部署,UFW 都能提供足够灵活和安全的网络防护能力。通过遵循本文的配置方法和最佳实践,你可以有效地保护 Ubuntu 系统免受常见的网络威胁。
建议将本文作为参考手册,在实际操作中根据业务需求灵活应用各项规则配置。生产环境的任何变更都应先在测试环境中验证,并确保始终保留应急回滚方案。
Ubuntu UFW 防火墙完全指南
https://blog.uso6.com/archives/ubuntu-ufw-fang-huo-qiang-wan-quan-zhi-nan
评论