使用 Nginx + Cloudflare 阻挡赛博垃圾

对 Nginx 和 Cloudflare 防火墙进行配置以阻挡一些对 WordPress 网站不友好的请求

Cloudflare 防火墙

ASN、URI 和 IP

Autonomous System Number

ASN 列表来自 https://github.com/BlueSkyXN/ScannerReport

12816 12786 18450 197540 24961 26496 46606 54600 60068 22773 18978 7922 61317 6079 397391 46562 22616 26347 45916 22394 202594 40676 398101 396362 6167 54290 135981 21686 7303 138997 22418 140224 46475 20001 43959 41378 29802 10013 9824 4766 209 43260 7565 40676 3786 28438 13287 3786 24641 54548 43754 205544 6461 141995 8047 35916 396253 64096 40021 32097 394380 9286 16509 9370 9318 6921 7713 4788 262186 13489 21353 13213 20473 2914 24940 8100 45102 36352 63949 14061 54994 12876 14618 36351 16276

此外,对来自

45090 55990 37963

ASN 的请求启用旧版 CAPTCHA 或者 JS 质询

另外,对于所有 ASN 的屏蔽规则,可以选择添加语句

and not cf.client.bot

来排除掉 Cloudflare 自身的机器人

URI 和 IP

URI 路径列表主要针对 WordPress 网站,非 WordPress 路径的条目来自 CF 防火墙记录

"/xmlrpc" "/savepng.php" "/.env" "/system_api.php" "/version.js" "/stream/live.php" "/Telerik.Web.UI.WebResource.axd" "/.git" "/wlwmanifest.xml" "/export.php" "/ups.php" "/doc.php" "/s_ne.php" "/wp_wrong_datlib" "/bak.php" "/*alfa" "/ALFA" "/shell.php" "/xleet.php" "/wso.php" "/test.php" "/config.php" "/xmlrpc.php" "/GponForm" "/.aws"

IP 需要针对每个网站进行设置,这里不直接给出 IP 黑名单,可以通过 Cloudflare 防火墙记录或者 Nginx 日志获取

此外,可以屏蔽来自 Tor 的请求

User Agent

通过 Cloudflare 防火墙表达式

(http.user_agent contains "xxxxx")

来阻止带有特定 UA 的请求,主要用来防止爬站——垃圾搜索引擎、网站的爬虫以及(商业)监控服务提供商等——以及一些恶意请求带来的不必要的负载

以下是搜集到的 UA

# 垃圾搜索引擎等
grapeshot
MJ12bot
DotBot
AhrefsBot
SemrushBot
Uptimebot
ZoominfoBot
BLEXBot
ExtLinksBot
aiHitBot
Researchscan
DnyzBot
spbot
MegaIndex.ru
Mail.Ru
censys
Expanse
gdnplus
ALittle
proximic
toutiao
PulsePoint
fenq
archive.org
admantx
AppEngine
Electron
petalbot
netnewswire
Criteo
bazqux
netsystemsresearch
Neeva
# 老版 Chrome 浏览器,一些恶意请求会使用该 UA
# 会屏蔽正常的访问请求,解决方法:换新版浏览器
Chrome/6
Chrome/5
Chrome/4

# 爬虫/监控/恶意扫描...程序 UA,包括 Java Python 和 Go
Hello, world
ThinkChaos
Java/
lib
?
python
http-client
okhttp
l9explore
l9tcpid

其他

除上述手段外,还可以:

  • 屏蔽 xmlrpc.php 的 POST 请求
    • 如果 WordPress 启用了 Jetpack,需要将 Jetpack 添加到白名单,Jetpack 的一些功能会向 xmlrpc.php 发送 POST 请求
  • 对 WordPress 特定的 wp-admin、wp-login、wp-cron 路径进行 IP 属地封禁
    • 类似地,WordPress 会向 wp-cron 发送请求来执行 WordPress 定时任务,需要将其加入白名单
  • 设置威胁分数屏蔽
  • 屏蔽所有 HTTP1.0 请求和非 SSL 请求
    • 屏蔽 HTTP1.1 的代价较高,需要更复杂和精确的设置才可以避免封掉正常的搜索引擎收录等行为
  • 屏蔽所有除 GET、POST 和 HEAD 外的请求
    • 如果启用了 Jetpack 的网站在线监测功能,Jetpack 会定时对网站发送 HEAD 请求来判断网站是否在线,所以需要将 Jetpack 的 HEAD 请求加入白名单

Nginx

设置好 Cloudflare 之后,一些请求已经被 Cloudflare 阻挡,不会发送到主机上,Nginx 也就不会做出响应,日志中也就不会出现

如果发现日志中仍有不友好的请求,则还需找到这些请求的特征,添加相应的 Cloudflare 防火墙规则

Nginx 的配置主要解决那些可以绕过 Cloudflare(直接访问 IP 等)的请求,通过 Nginx 屏蔽特定 IP(段)/UA 等手段对一些特定 UA/IP 直接返回状态码

  • UA 仍然可以使用 Cloudflare 配置中的名单
  • IP 每个网站不同,需要自行查看日志添加到黑名单

除了 UA 和 IP,还可以:

  • 如果有不友好的 query string,也可以通过判断 $args 或者 $query_string(二者没有区别)返回状态码
  • 如果网站绑定了域名,可以新建监听在 80 端口的 server 块并指定为 default_server,然后直接 return 一个状态码
    server { 
        listen 80 default_server;
        server_name _;
        return 503;
    }
  • 使用 $request_method 变量判断 HTTP 方法类型,屏蔽掉特定方法
    if ($request_method !~ ^(GET)$ ) {
        return 504;
    }

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据