UFW 简明指南

# UFW 简明指南

> UFW = **U**ncomplicated **F**irewall,Ubuntu 自带的 iptables 前端封装。命令直白,规则可读,是 Ubuntu 上配防火墙的默认选择。底层还是 iptables/nftables,UFW 只是把语法变人话。

---

## Level 1 · 安装与启用

Ubuntu 通常自带 UFW,没有就装一下:

```bash
sudo apt update && sudo apt install ufw
```

⚠️ **启用前先放行 SSH**,否则远程会断连:

```bash
sudo ufw allow 22/tcp        # 或 sudo ufw allow ssh
sudo ufw enable
```

查看状态:

```bash
sudo ufw status              # 简略
sudo ufw status verbose      # 含默认策略和日志级别
sudo ufw status numbered     # 含规则编号(删规则时要用)
```

---

## Level 2 · 默认策略

防火墙的"默认行为"决定没有匹配规则时怎么处理。Ubuntu 默认就是这套,符合 90% 场景:

```bash
sudo ufw default deny incoming    # 入站默认拒绝
sudo ufw default allow outgoing   # 出站默认放行
sudo ufw default deny routed      # 转发默认拒绝
```

逻辑:**外面进不来,里面出得去**。然后用 `allow` 规则按需开洞。

---

## Level 3 · 基础规则

### 放行端口

```bash
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)

```bash
sudo ufw allow ssh               # 等于 22/tcp
sudo ufw allow http              # 80/tcp
sudo ufw allow https             # 443/tcp
```

### 拒绝 / 限速

```bash
sudo ufw deny 23                 # 拒绝 telnet
sudo ufw limit ssh               # SSH 限速:30 秒内 6 次连接就 ban,防爆破
```

---

## Level 4 · 高级规则

### 限定来源 IP

```bash
# 只允许特定 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
```

### 限定网卡

```bash
sudo ufw allow in on eth0 to any port 80
```

### 应用配置(预设)

UFW 自带一组应用预设:

```bash
sudo ufw app list                       # 看可用应用
sudo ufw app info "OpenSSH"             # 看某个应用包含的端口
sudo ufw allow "Nginx Full"             # 一次开 80 + 443
```

---

## Level 5 · 查看与删除规则

### 查看(带编号才好删)

```bash
sudo ufw status numbered
```

输出示例:

```
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 8000/tcp                   ALLOW IN    Anywhere
[ 3] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
```

### 删除

两种方式:

```bash
# 按编号删(推荐,明确)
sudo ufw delete 2

# 按规则删(要和原来 allow 命令一字不差)
sudo ufw delete allow 8000/tcp
```

### 重置(清空所有规则)

```bash
sudo ufw reset
```

---

## Level 6 · 日志与排错

### 开启日志

```bash
sudo ufw logging on              # 默认级别 low
sudo ufw logging medium          # 包括所有 ALLOW + DENY
sudo ufw logging off
```

日志位置:`/var/log/ufw.log`(也会进 `/var/log/syslog`)。

### 排错套路

```bash
# 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 · 常见场景速查

```bash
# 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`](https://github.com/chaifeng/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 规则,可以直接看:

```bash
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` |