最近有个网站被人写了个爬虫一直在爬,封掉了 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。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1xgxe3rddlacc