UFW 简明指南
UFW = Uncomplicated Firewall,Ubuntu 自带的 iptables 前端封装。命令直白,规则可读,是 Ubuntu 上配防火墙的默认选择。底层还是 iptables/nftables,UFW 只是把语法变人话。
Level 1 · 安装与启用
Ubuntu 通常自带 UFW,没有就装一下:
sudo apt update && sudo apt install ufw
⚠️ 启用前先放行 SSH,否则远程会断连:
sudo ufw allow 22/tcp # 或 sudo ufw allow ssh
sudo ufw enable
查看状态:
sudo ufw status # 简略
sudo ufw status verbose # 含默认策略和日志级别
sudo ufw status numbered # 含规则编号(删规则时要用)
Level 2 · 默认策略
防火墙的"默认行为"决定没有匹配规则时怎么处理。Ubuntu 默认就是这套,符合 90% 场景:
sudo ufw default deny incoming # 入站默认拒绝
sudo ufw default allow outgoing # 出站默认放行
sudo ufw default deny routed # 转发默认拒绝
逻辑:外面进不来,里面出得去。然后用 allow 规则按需开洞。
Level 3 · 基础规则
放行端口
sudo ufw allow 8000 # TCP + UDP 都开
sudo ufw allow 8000/tcp # 只开 TCP
sudo ufw allow 8000/udp # 只开 UDP
sudo ufw allow 8000:8100/tcp # 端口段
用服务名(读 /etc/services)
sudo ufw allow ssh # 等于 22/tcp
sudo ufw allow http # 80/tcp
sudo ufw allow https # 443/tcp
拒绝 / 限速
sudo ufw deny 23 # 拒绝 telnet
sudo ufw limit ssh # SSH 限速:30 秒内 6 次连接就 ban,防爆破
Level 4 · 高级规则
限定来源 IP
# 只允许特定 IP 访问 22
sudo ufw allow from 192.168.1.100 to any port 22
# 只允许整个子网
sudo ufw allow from 192.168.1.0/24 to any port 5432
# 限定来源 + 协议
sudo ufw allow from 10.0.0.0/8 to any port 3306 proto tcp
限定网卡
sudo ufw allow in on eth0 to any port 80
应用配置(预设)
UFW 自带一组应用预设:
sudo ufw app list # 看可用应用
sudo ufw app info "OpenSSH" # 看某个应用包含的端口
sudo ufw allow "Nginx Full" # 一次开 80 + 443
Level 5 · 查看与删除规则
查看(带编号才好删)
sudo ufw status numbered
输出示例:
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 8000/tcp ALLOW IN Anywhere
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6)
删除
两种方式:
# 按编号删(推荐,明确)
sudo ufw delete 2
# 按规则删(要和原来 allow 命令一字不差)
sudo ufw delete allow 8000/tcp
重置(清空所有规则)
sudo ufw reset
Level 6 · 日志与排错
开启日志
sudo ufw logging on # 默认级别 low
sudo ufw logging medium # 包括所有 ALLOW + DENY
sudo ufw logging off
日志位置:/var/log/ufw.log(也会进 /var/log/syslog)。
排错套路
# 1. 防火墙规则确认放行
sudo ufw status verbose
# 2. 服务真的在监听
sudo ss -tlnp | grep :<端口>
# 3. 程序绑的是 0.0.0.0 还是 127.0.0.1
# 127.0.0.1 = 只本机能连,UFW 开了也没用,要改程序 bind
# 4. 云服务器还要看安全组(控制台层面)
Level 7 · 常见场景速查
# Web 服务器
sudo ufw allow 80,443/tcp
# 数据库(只允许内网)
sudo ufw allow from 10.0.0.0/8 to any port 5432
sudo ufw allow from 10.0.0.0/8 to any port 3306
# Docker 端口(注意 Docker 会绕过 UFW,见下方)
sudo ufw allow 8080/tcp
# 临时关闭(不删规则)
sudo ufw disable
# 永久卸载
sudo ufw disable && sudo apt remove ufw
Level 8 · 三个常踩的坑
1. Docker 绕过 UFW
Docker 启动容器时会直接改 iptables 的 DOCKER 链,绕过 UFW——你以为没开放的端口实际对外开着。解决方案:
- 用
docker run -p 127.0.0.1:8080:8080只绑本机 - 或装
ufw-docker让 Docker 走 UFW
2. 启用前忘了 allow SSH
VPS 上启用 UFW 前没 allow 22,秒断连,只能控制台 VNC 救。永远先放行 SSH 再 enable。
3. 云服务器的"双层防火墙"
阿里云 / 腾讯云 / AWS 的安全组在 UFW 之前就拦了,UFW 开了也没用——必须去控制台同步配安全组。本机 curl localhost 能通但外网连不上,先想到这条。
与 iptables 的关系
UFW 不是新防火墙,只是 iptables 的"易用前端"。所有 UFW 规则最终都翻译成 iptables 规则,可以直接看:
sudo iptables -L -n -v | less
UFW 适合 90% 单机场景。需要复杂转发、NAT、自定义链时再下沉到 iptables/nftables。
一张速查表
| 任务 | 命令 |
|---|---|
| 启用 | sudo ufw enable |
| 禁用 | sudo ufw disable |
| 状态 | sudo ufw status verbose |
| 放行端口 | sudo ufw allow 8000/tcp |
| 限定来源 | sudo ufw allow from <IP> to any port <端口> |
| 限速防爆破 | sudo ufw limit ssh |
| 查规则编号 | sudo ufw status numbered |
| 删规则 | sudo ufw delete <编号> |
| 重置 | sudo ufw reset |
| 日志 | sudo ufw logging on |