ufw(Uncomplicated Firewall)是 iptables/nftables 的人话封装。
新服务器装好后第一件事就该把它配上 —— 比起裸奔,门槛降到 5 分钟,
但能挡住 99% 的扫描流量噪音。
安装 + 默认策略
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
deny incoming 是关键 —— 默认拒绝所有进来的连接,靠白名单放行。
放行你需要的
sudo ufw allow ssh # 22/tcp
sudo ufw allow http # 80/tcp
sudo ufw allow https # 443/tcp
# 或者指定端口
sudo ufw allow 8080/tcp comment 'app dev server'
# 限制来源 IP
sudo ufw allow from 192.168.1.0/24 to any port 5432 comment 'pg from LAN'
# 限制速率(防 SSH 暴力破解)
sudo ufw limit ssh comment 'rate-limit SSH'
ufw limit 等价于 "同 IP 30 秒内 6 次连接就 deny",比 fail2ban 轻量但
粒度粗。生产服务器两个一起用最稳。
启用 + 校验
# !!! 启用前确认 22 已经 allow !!!
sudo ufw enable
sudo ufw status verbose
# Status: active
# Default: deny (incoming), allow (outgoing), deny (routed)
# To Action From
# -- ------ ----
# 22/tcp LIMIT IN Anywhere
# 80/tcp ALLOW IN Anywhere
# ...
如果你是 SSH 连进去配的,开 ufw 之前 务必先 allow ssh,否则当场断开。
实际生产建议
# 改 SSH 端口(不是安全提升但能省 99% 噪音日志)
sudo sed -i 's/^#\?Port .*/Port 2200/' /etc/ssh/sshd_config
sudo systemctl reload ssh
sudo ufw delete allow ssh
sudo ufw allow 2200/tcp comment 'ssh on non-standard port'
sudo ufw limit 2200/tcp
# Docker 装上后会绕过 ufw(默认改 iptables 但 ufw 看不到)
# 解决:用 DOCKER-USER 链 + ufw-docker(搜这个项目)
日志
sudo ufw logging medium # off / low / medium / high / full
sudo tail -f /var/log/ufw.log
medium 已经够分析;full 会刷爆磁盘。
应用 profiles
ufw 自带常见应用的端口配置:
sudo ufw app list
# Available applications:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
sudo ufw allow 'Nginx Full'
自定义 profile 放在 /etc/ufw/applications.d/:
[my-app]
title=My App
description=Backend API server
ports=8000,8443/tcp
sudo ufw app update my-app
sudo ufw allow my-app
备份 / 恢复
sudo cp /etc/ufw /etc/ufw.bak -r
# /etc/ufw/user.rules 和 user6.rules 是规则文件
踩过的坑
- 远程改防火墙最危险。规范流程:
- 准备 rollback 脚本:
(sleep 300 && ufw --force reset) &,5 分钟内
新规则有问题没人手动取消,自动 reset - 在 screen / tmux 里操作
- 改完后开第二个 SSH 测试,确认连得上再 kill rollback
- Docker 镜像启动后默认会 publish 端口到
0.0.0.0,完全绕过 ufw。
生产里所有 Docker port mapping 都写127.0.0.1:8080:8080这种显式 bind。 - KVM / LXC 桥接网络可能让 ufw 看不到流量,需要在
/etc/ufw/sysctl.conf
里开net.bridge.bridge-nf-call-iptables=1。
登录后参与评论。