虽然所有的网页都套了 Cloudflare,仍然无法避免一直被扫。看着 nginx log 里的一大堆 40X Errors,又看了看 fail2ban-client status sshd 中那一大堆因为尝试爆破 SSH 密码而被 ban 的的 IP,决定抽空把这些恶意爬虫处理一下。
获取真实访问者的 IP
因为网页在 Cloudflare 免费计划的保护下,未经配置的 nginx 默认获取到的 IP 显然是 Cloudflare 的 IP。当然,作为成熟的商业公司, Cloudflare 已经提供了有关如何恢复原始访问者 IP 的详细指南。
简单按照自己的 Web Server 配置一下即可。
使用 fail2ban 的内置 filter
fail2ban 本身内置了很多 filter 可以应用于读取 Web 服务器输出的 log,并按照规则进行处理。例如处理 basic auth 的 nginx-http-auth,nginx-badbots,nginx-noscript 等等。一般都位于 /etc/fail2ban/filter.d/
的目录下。
如果想要对其中的内容进行修改,只需要新建一个 ${name}.local
的文件即可将 ${name}.conf
的文件按需覆盖。当然也可以自己新建新的过滤器。
使用 fail2ban-regex 可以对 filter 中的配置进行测试。例如:fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/webexploits.conf -D
。
如果觉得匹配得还算满意,就可以进入下一步了。
联动 Cloudflare
在获取到违规的 IP 之后,就需要进行处理,在 fail2ban 的名词中称作 action。对应地,一大堆文件都在 /etc/fail2ban/action.d/
下面等待人们来使用。常用的有 iptables,各种防火墙等等。由于目的是想要不让这些 IP 来访问Cloudflare 保护的网页,仅在本机上配置是不够的,还需要告诉 Cloudflare 不要接受他们的请求。
cloudflare.conf 就是用来做这件事的。只要编辑相关文件(cloudflare.local),填写上自己的 cftoken 和 cfuser (Email)就可以了。
至此,再编辑 /etc/fail2ban/jail.local
将这些 filter 启用,配置好对应的触发阈值和行为,重启 fail2ban 服务,就可以看到那么一大堆的 IP 全部都被 ban 掉了。真舒服。
手动处理个别 IP
有时候,有些漏网之鱼,单独写个规则又麻烦。不如直接 ban 掉。
fail2ban-client set ${filtername} banip ${ip}
误报率
测试下来,通过 nali-cli 看了一下归属地,似乎还是国内某些地区的 IP 坏访问更多一点,比搜索引擎的爬虫还要勤快。