Ubuntu 防火墙 ufw(iptables)添加规则不生效如何解决?

最近有个小站被人写了爬虫一直在爬,封掉了 IP 还在继续,明明 ufw 显示规则已经生效了,但是就是没法把 IP 封禁掉。这已经严重影响网站访问了,所以就在网上搜索一下到底为什么,然后发现是 ufw 的一个 bug,在此记录一下。iptables 同理。

一、Ubuntu 防火墙 ufw 问题记录

系统 Ubuntu 20.04,ufw 禁止 IP 地址 A.B.C.D 的访问:

ufw deny from A.B.C.D to any

结果监控里面 A.B.C.D 的 IP 还是在大量连接。

然后 ufw status 看了下状态,规则生效了啊,甚至重新 reload也没用,怎么回事呢?

上网一搜发现有类似的问题。比如:

  • https://www.wingwy.com/archives/2020_02_68090.html
  • https://www.cnblogs.com/zhaojingyu/p/11458744.html

UFW (iptables) 规则的匹配基于规则出现的顺序,一旦匹配某个规则,检查便会停止。因此,如果某个规则允许访问 TCP 端口 22 (如使用 udo ufw allow 22),后面另一个规则指示拦截某个 IP 地址(如使用 ufw deny proto tcp from A.B.C.D to any port 22)。最终,允许访问 TCP 端口 22 的规则会被使用,而后一个拦截黑客 IP 地址 A.B.C.D 却没有被使用。

这都是由于规则的顺序造成的。为避免这类问题,你需要编辑 /etc/ufw/before.rules文件,在“# End required lines”之后”Block an IP Address”添加规则。

二、Ubuntu 防火墙 ufw 问题解决

所以 vim /etc/ufw/before.rules

查找如下所示的行:

# End required lines

添加规则来拦截黑客或垃圾信息传播者:

# Block spammers
-A ufw-before-input -s A.B.C.D -j DROP

保存并关闭文件。最后,让防火墙重新加载配置信息:

ufw reload

这样折腾一圈,果然生效了。不过不理解这 ufw 的设计逻辑,也许有其他需求会这样,但对于大多数简单的拦截 IP 等应用环境,这个逻辑更像一个 bug。

搬瓦工推荐方案

温馨提醒 如果您有选择困难症,直接选中间的 CN2 GIA-E方案,季付 $49.99,多达 12 个机房任意切换
方案 内存 CPU 硬盘 流量/月 带宽 机房 价格 购买
CN2
(最便宜)
1GB 1核 20GB 1TB 1Gbps DC3 CN2
DC8 ZNET
$49.99/年 直达
CN2 2GB 1核 40GB 2TB 1Gbps $52.99/半年
$99.99/年
直达
CN2 GIA-E
(最推荐)
1GB 2核 20GB 1TB 2.5Gbps DC6 CN2 GIA-E
DC9 CN2 GIA
日本软银 JPOS_1
荷兰 EUNL_9
$49.99/季度
$169.99/年
直达
CN2 GIA-E 2GB 3核 40GB 2TB 2.5Gbps $89.99/季度
$299.99/年
直达
HK 2GB 2核 40GB 0.5TB 1Gbps 中国香港 CN2 GIA $89.99/月
$899.99/年
直达
HK 4GB 4核 80GB 1TB 1Gbps $155.99/月
$1559.99/年
直达
TOKYO 2GB 2核 40GB 0.5TB 1.2Gbps 日本东京 CN2 GIA $89.99/月
$899.99/年
直达
TOKYO 4GB 4核 80GB 1TB 1.2Gbps $155.99/月
$1559.99/年
直达
搬瓦工优惠码:

Dynadot

Hostwinds


【AD】美国洛杉矶CN2 VPS/香港CN2 VPS/日本CN2 VPS推荐,延迟低、稳定性高、免费备份_搬瓦工vps

【AD】Justhost:全场VPS 8折优惠,200Mbps-1Gbps带宽不限流量,可选中国香港/新加坡/美国/俄罗斯CN2线路等24个机房,月付8元起