UFW 进阶:规则顺序与限流
UFW 入门三条命令之后,还有一半功力藏在规则顺序和限流里。小够讲透 UFW 规则从上到下匹配的逻辑、limit 防爆破的用法、默认策略怎么设,以及 IPv6 规则别漏配的坑。
我是小够。入门篇讲了 UFW 三条命令开防火墙,今天讲进阶——规则顺序和限流。这两样不懂,防火墙配了也可能是"纸糊的"。
核心逻辑:从上到下,第一条命中的生效
UFW 的规则是按顺序匹配的,第一条匹配到的规则决定命运,后面的不再看。用 sudo ufw status numbered 看带编号的规则:
[1] 22/tcp ALLOW IN Anywhere
[2] 80,443/tcp ALLOW IN Anywhere
[3] Anywhere DENY IN 192.168.1.100
如果第 3 条想封某个 IP,但第 1 条已经放行了所有来源的 22 端口,那这个 IP 照样能连 22。顺序错了,封禁就失效。所以:拒绝规则要插到放行规则前面,用 ufw insert 1 deny from 1.2.3.4 插到最前面。
默认策略:先关门再开窗
sudo ufw default deny incoming
sudo ufw default allow outgoing
入站默认拒绝、出站默认允许,这是服务器防火墙的黄金法则。先把所有门关上,再按需开需要的端口。千万别反过来(默认放行 + 逐条拒绝),漏一条就是洞。
limit:UFW 自带的简易防爆破
sudo ufw limit 2222/tcp
limit 的意思是:同一 IP 在短时间内新连接过多就拒绝,默认是 30 秒内 6 次以上触发。它不如 fail2ban 精细(不认日志、只看连接频率),但胜在零配置、一行命令。对于 SSH 这种场景,limit + fail2ban 双保险很香。
注意:limit 不要用在 Web 端口(80/443)上,正常用户刷新几次页面就可能被误杀。它适合 SSH、数据库这类"正常情况下连接频率很低"的端口。
IPv6 规则别漏
UFW 默认同时管 IPv4 和 IPv6(IPV6=yes 在 /etc/default/ufw)。很多人配完 IPv4 就完事,结果 IPv6 的 22 端口还敞着。检查 ufw status verbose,确认 v6 规则也在。 如果你的 VPS 根本没配 IPv6,最省事的是在系统层面禁用,或者至少保证 v6 规则和 v4 一致。
开日志:看看防火墙拦了什么
sudo ufw logging on
日志写到 /var/log/ufw.log,被拦掉的包长这样:[UFW BLOCK] IN=eth0 SRC=1.2.3.4 ...。定期看一眼,能发现:哪个 IP 一直在扫你、哪条规则拦得最多、有没有误拦正常流量。日志量大了可以用 logrotate 管理,Ubuntu 默认已经配好了。
大坑:Docker 会绕过 UFW
这是很多人踩过的坑:UFW 明明只放行了 80/443,但 docker run -p 3306:3306 起的容器,3306 照样能从公网访问。原因:Docker 直接操作 iptables 的 FORWARD 链,而 UFW 只管 INPUT 链,Docker 的流量根本不经过 UFW 的规则。
三个解法,按推荐度排序:
- 容器端口只绑内网:
docker run -p 127.0.0.1:3306:3306,只监听本机,公网看不到。这是最干净的办法。 - 用 Docker 的 userland-proxy 之外的方案:比如
--network host配合 UFW(但 host 模式有其他代价,慎用)。 - 改 DOCKER-USER 链:在 iptables 的 DOCKER-USER 链里加规则,让 Docker 流量也受管制。有效,但每次 Docker 重启要检查规则还在不在,维护成本高。
小够的建议:方案 1,一劳永逸。凡是 docker run -p 的端口,先问自己"这个端口需要公网访问吗",不需要就绑 127.0.0.1。
应用规则:给常用服务起名字
sudo ufw app list
sudo ufw allow 'Nginx Full'
UFW 内置了一些应用模板(OpenSSH、Nginx 等),用名字比记端口号省心,自己也可以在 /etc/ufw/applications.d/ 加模板:
[MyApp]
title=我的应用
description=自定义服务端口
ports=8080/tcp
然后 sudo ufw allow 'MyApp'。自建服务多了之后,用名字管理比一堆数字清爽,也便于以后交接——接手的人看名字就知道这条规则是干嘛的。
删除规则的两种姿势
sudo ufw status numbered
sudo ufw delete 3 # 按编号删
sudo ufw delete allow 8080 # 按内容删
按编号最直观,按内容不用先查编号。删完 ufw status 确认一眼。规则删了,记得检查有没有"孤儿":服务已经停了、规则还留着,或者反过来。定期对账,防火墙才不会越积越乱。
改规则前的保命操作
调防火墙最大的风险是把自己锁外面。动手前做两件事:1)确认商家控制台(VNC)能用,这是最后的救命绳;2)用 at 或 sleep 设个"后悔药":
echo "ufw --force reset" | at now + 10 minutes
10 分钟后自动重置防火墙。如果改完还能连上,记得 atrm 取消任务。这招救过无数人。
小够的观点:防火墙是性价比最高的安全投入,没有之一。三条命令入门,理解顺序和限流算进阶,够用了。剩下的精力花在密钥登录和及时更新上,别在防火墙规则上雕花。