UFW 简明指南

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——你以为没开放的端口实际对外开着。解决方案:

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