Zenith Horizon

Linux 防火墙 UFW 完全指南

2026/04/04
loading

UFW(Uncomplicated Firewall)是 Ubuntu 及大多数 Debian 系 Linux 发行版的默认防火墙配置工具,它提供了一个简化的命令行界面来管理复杂的 iptables 规则,让防火墙配置变得更加直观和安全。


一、安装与基础配置

1.1 检查是否已安装

多数 Ubuntu/Debian 系统默认已预装 UFW,可通过以下命令验证:

ufw --version
sudo ufw status

1.2 安装 UFW

如未安装,执行以下命令安装:

sudo apt update && sudo apt install ufw

1.3 ⚠️ 启用前最关键的一步:放行 SSH

在启用防火墙之前,务必先放行 SSH 端口,否则可能导致被锁在服务器之外无法访问。 通过云服务商的控制台或许还有机会恢复,但本地或 VPS 若无备用访问方式,一旦规则有误,服务器便可能永久失联。

# 推荐方式:使用服务名
sudo ufw allow ssh

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

1.4 设置默认策略

安全基线策略:默认拒绝所有入站连接,允许所有出站连接。

sudo ufw default deny incoming
sudo ufw default allow outgoing

此策略确保服务器仅响应明确允许的请求,能大幅减少攻击面。

1.5 启用防火墙

sudo ufw enable

1.6 查看状态

# 基础状态
sudo ufw status

# 详细信息(含规则编号、日志级别)
sudo ufw status verbose

# 带编号显示规则(便于删除)
sudo ufw status numbered

二、常用规则配置

2.1 按端口放行

# 放行 HTTP(80/TCP)
sudo ufw allow 80/tcp

# 放行 HTTPS(443/TCP)
sudo ufw allow 443/tcp

# 放行 UDP 端口
sudo ufw allow 8080/udp

# 同时放行 TCP 和 UDP(如 DNS 端口 53)
sudo ufw allow 53

2.2 按服务名放行

UFW 内置了常见服务的端口映射,可使用服务名简化配置:

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

查看所有预定义服务:

sudo ufw app list

2.3 基于源地址限制

# 允许特定 IP 的全部访问
sudo ufw allow from 192.168.1.100

# 允许特定子网
sudo ufw allow from 192.168.1.0/24

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

# 允许特定 IP 使用 TCP 协议访问指定端口
sudo ufw allow from 192.168.1.100 to any port 3306 proto tcp

2.4 端口范围

sudo ufw allow 3000:4000/tcp

2.5 拒绝规则

# 拒绝特定端口
sudo ufw deny 8080/tcp

# 拒绝特定 IP
sudo ufw deny from 203.0.113.10

# 拒绝特定子网访问特定端口
sudo ufw deny from 203.0.113.0/24 to any port 21

2.6 删除规则

# 按规则描述删除
sudo ufw delete allow 8080/tcp

# 先查看编号,再按编号删除(更安全)
sudo ufw status numbered
sudo ufw delete <编号>

2.7 临时关闭与重置

# 临时关闭(规则保留)
sudo ufw disable

# 重置所有规则并禁用防火墙(⚠️ 谨慎操作)
sudo ufw reset

2.8 备注规则

添加备注便于后期维护:

sudo ufw allow 97 comment 'open 97 port'

三、实战场景配置

3.1 Web 服务器(Nginx/Apache)

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

3.2 数据库服务器

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow from 192.168.1.100 to any port 3306   # MySQL,限制特定 IP
sudo ufw allow from 192.168.1.100 to any port 5432   # PostgreSQL

3.3 严控出站

如业务对安全性要求极高,可将默认出站也设为拒绝,然后按需放行:

sudo ufw default deny outgoing
sudo ufw allow out ssh
sudo ufw allow out http
sudo ufw allow out https
sudo ufw allow out 53

四、进阶功能与加固

4.1 SSH 防暴力破解(速率限制)

对 SSH 启用连接频率限制,在短时间内(默认 30 秒)超过 6 次连接尝试则临时封锁该 IP:

sudo ufw limit ssh
# 或指定端口
sudo ufw limit 22/tcp

4.2 日志配置

# 开启日志
sudo ufw logging on

# 设置日志级别(low / medium / high / full)
sudo ufw logging medium

日志级别说明:

  • ​low​:仅记录被拒绝的连接,日常使用推荐

  • ​medium​:同时记录放行流量,适合排查规则问题

  • ​high/full​:记录所有流量详情,日志量大,仅用于深度调试

日志文件位置:/var/log/ufw.log​

查看实时拦截记录:

sudo tail -f /var/log/ufw.log | grep "DENY"

4.3 IPv6 支持

编辑配置文件确保 IPv6 支持已开启:

sudo nano /etc/default/ufw

确保 IPV6=yes​(通常默认已开启),保存后重启 UFW 使配置生效:

sudo ufw disable && sudo ufw enable

启用后,UFW 规则会同时作用于 IPv4 和 IPv6。

4.4 规则备份与恢复

在生产环境变更规则前,务必做好备份并预设回滚方案:

# 备份完整配置
sudo cp -a /etc/ufw /etc/ufw.bak.$(date +%F-%H%M%S)

# 导出规则到文件(备用)
sudo ufw status verbose > ufw_rules_backup.txt

4.5 UFW + Fail2ban 联动防御

Fail2ban 能自动监测暴力破解行为并调用 UFW 封禁恶意 IP,形成自动化防御体系:

sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban

安装后配置 /etc/fail2ban/jail.local​,Fail2ban 检测到多次失败登录后会自动调用 UFW 封禁相关 IP。


五、Docker 环境下的 UFW 兼容问题

Docker 与 UFW 之间存在一个常见的安全隐患: Docker 会直接操作 iptables,在 UFW 规则之前插入自己的规则,可能导致通过 UFW 禁用的端口仍可通过 Docker 容器端口暴露于公网。

5.1 验证是否存在该问题

若运行了一个端口映射的容器,但该端口并未在 UFW 中放行,却仍能从外部访问,说明遇到了此冲突。

5.2 推荐解决方案

方法一:修改 after.rules(常用方案)

编辑 /etc/ufw/after.rules​,在文件末尾添加以下内容:

# 在 after.rules 末尾添加
# 让 UFW 接管 Docker 容器端口的访问控制
*filter
:ufw-user-input - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-input
COMMIT

保存后重启 UFW 和 Docker:

sudo ufw reload
sudo systemctl restart docker

方法二:配置 Docker 禁用 iptables(不推荐,会影响容器网络)

# 编辑 /etc/docker/daemon.json
{
  "iptables": false
}

方法三:使用 ufw-docker 或 udwall 工具


六、故障排查

6.1 UFW 显示已禁用(inactive)

sudo ufw enable

6.2 端口被规则阻止但仍可访问

可能是现有 TCP 会话(已建立的连接)仍被内核维持。使用以下命令确认并终止会话:

# 查看当前连接
ss -atp | grep <端口号>

# 终止指定端口的会话
ss -K dst dport = <端口号>

6.3 日志无内容

# 确认日志已开启
sudo ufw logging on

# 检查 rsyslog 捕获配置(如日志被重定向)
sudo ls -l /var/log/ufw.log

# 极端情况:删除并重建日志文件
sudo rm /var/log/ufw.log && sudo systemctl restart rsyslog

6.4 查询哪些规则实际生效

# 查看 UFW 生成的实际 iptables 规则
sudo ufw show raw

# 查看所有允许的规则
sudo iptables -S | grep ACCEPT

6.5 规则顺序问题

UFW 按规则顺序匹配,编号小的优先。若规则未按预期生效:

# 查看带编号的规则顺序
sudo ufw status numbered

# 按编号删除再按正确顺序重新添加
sudo ufw delete <编号>
sudo ufw allow ...   # 按目标顺序添加

七、最佳实践总结

实践项

建议

默认策略

拒绝入站、允许出站

SSH 保护

启用 limit​ 速率限制

启用顺序

先 allow ssh​,后 enable​

规则备份

修改前备份 /etc/ufw/​

日志级别

日常 low​,排查时 medium​

定期审计

每季度检查一次规则,清理无用规则

IPv6

确保 IPV6=yes​,同时保护双栈

Docker 兼容

修改 after.rules​ 或使用专用工具

故障回滚

使用 at​ 预设定时回滚任务

自动防御

结合 Fail2ban 联动封禁


八、常用命令速查表

功能

命令

安装

​sudo apt install ufw​

启用

​sudo ufw enable​

禁用

​sudo ufw disable​

重置

​sudo ufw reset​

状态查看

​sudo ufw status verbose​

放行端口

​sudo ufw allow 80/tcp​

放行服务

​sudo ufw allow ssh​

限制 SSH

​sudo ufw limit ssh​

允许 IP

​sudo ufw allow from 192.168.1.100​

拒绝 IP

​sudo ufw deny from 203.0.113.10​

删除规则

​sudo ufw delete allow 80/tcp​

开启日志

​sudo ufw logging on​

查看日志

​sudo tail -f /var/log/ufw.log​

备份配置

​sudo cp -a /etc/ufw /etc/ufw.bak​

查看预定义应用

​sudo ufw app list​

重新加载

​sudo ufw reload​

UFW 是 iptables 的前端封装,日常管理使用上述命令即可。如需更底层的网络控制(如 NAT、端口转发),可直接使用 iptables,但需注意 UFW 与手动 iptables 规则之间可能产生冲突。建议尽可能在 UFW 框架内完成配置,保持防火墙管理的简洁与可维护性。

Author: Max

Permalink: /archives/linux-ufw

Published: 2026-04-04 12:26:02

Updated: 2026-04-04 12:24:58

License: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG