昨天发了篇日志,我说疑似是 OneAV 插件(微步木马扫描)引发的内耗,导致博客流量、负载高居不下。后来我把该插件删除了,博客就访问正常了,睡了一觉起来发现……仍然有持续不断的流量消耗,反正比平常高不少。
然后我开始排查,试了很多办法,比如启用 WAF 屏蔽境外流量、在 Nginx 配置中禁止空 UA 访问、用 iptables 添加各种限速和封锁规则……结果,全都没用。最离谱的是:无论是网络流量监控,还是服务器 access/error 日志,完全查不到任何可疑请求(常规的漏扫司空见惯,我都认得)。流量就是源源不断地涌进来,但后台记录一片“风平浪静”。对我这个只是折腾 WordPress 的互联网爱好者来说,已经完全超出我的知识理解范畴了。
然后我接着检查是不是博客程序本身被篡改,或者插件被污染。于是我逐个排查,先停用所有插件,再更换主题,甚至直接清空前端内容,但问题依旧。
最终我只能把博客 Kevin's Space 整站停掉——只有在彻底关站的情况下,流量才明显下降。而奇怪的是,同服务器上其他网站完全不受影响,说明攻击目标就是我的博客本身,而不是整个服务器。


我用 iftop 工具看了一下实时流量,结果非常震惊:即使没有任何人访问我的网页(我停掉了所有其他网站和后台应用,只保留 Kevin's Space 的首页),流量依然在不断涌入!
而且这些访问根本不像正常用户。我随便查了几个 IP,发现很多都伪装成国内某些知名 IT 企业的反代服务器,表面上看像是“可信流量”,但一查就暴露了真实位置,有的是爱尔兰的,有的是法国的,甚至还有北美、东南亚、非洲的——遍布全球。从这些特征来看,基本可以确定这些是“伪装 UA + 全球分布 + 高并发探测”组合攻击,目的是啥目前还不明确,但绝对不是误访问那么简单。
此后我又在宝塔后台进一步“自救”——设置了访问频率限制、单 IP 并发上限、总流量阈值等各种防护措施,试图堵住这些恶意请求。但很遗憾,这些手段几乎没有起作用,攻击依旧稳定输出,甚至毫无波动,像是精准控制过的一样。
我又转向 Cloudflare,希望通过它的 CDN 和安全防护做一道“外墙”。我开启了基本防火、开启 JS Challenge,甚至尝试把整个站点设置为“仅限受信用户访问”模式……但也没起到作用!?

最后,我决定从源头卡住——直接在 Nginx 做了配置,强制所有流量必须经过 Cloudflare,服务器只接收来自 Cloudflare 官方 IP 段的请求,其他一律拒绝(403)。别说,你真别说——流量立马就下来了。但这么做的恶果是,我自己也访问不了了,看日志能看到所有正常流量器的流量也都没了……清洗完了。
经过一番资料查阅和配置检查,我基本确认:我的 Nginx 配置逻辑没问题,Cloudflare 的设置流程也都走对了。但奇怪的是,大陆地区的大部分正常访问却全部被拦成了 403,而一些海外访客反倒可以正常加载网站。
这就非常诡异了。结合前面被攻击的情况来看,我开始怀疑——Cloudflare 可能将大陆用户误判为攻击源。可能是之前的大量恶意流量“污染”了行为特征,或者我的站点在某种攻击模型中触发了防御策略。为了修复这一点,我又尝试了 Cloudflare 提供的验证码插件(Turnstile),想着给正常用户一个验证通道,但结果也不理想。

最后,我用了一个你大概已经体验的“土办法”——写了一个纯 HTML 的验证码页面,强制所有访问本站的用户,必须先跳转到验证页,输入验证码之后,才能访问他们原本想打开的页面。
我知道,这种方式非常“原始”,也确实影响用户体验——别说 SEO 了,连我自己测试都觉得麻烦。但没办法,它实用啊!!!更重要的是,以我目前的能力和资源,也确实想不到比这更有效、更可靠的方式了。相比被持续刷流量、服务器负载爆表、CF 误判正常用户,我宁愿牺牲点交互体验,至少网站能稳定运行下来。
目前网站终于恢复可访问状态了,虽然恶意流量依然持续在打……这段时间,我还顺手把阿里云服务器宽带限制在了 2MB/s,意外发现——只要搭配好 CDN,跑几个 WordPress 小站其实也挺够用的。所以,以后我也不打算升太高。
现在我开始着手处理这批恶意流量的具体来源。我依然用“土办法”:自己写了个脚本,实时记录访问日志(IP、UA、来源),再手动分析出那些可疑段,逐个加入服务器防火墙黑名单。
#!/bin/bash
LOGFILE="/root/visitor-log.txt"
INTERFACE=$(ip route get 8.8.8.8 | awk '{print $5}')
echo "[*] 开始监听接口:$INTERFACE,日志输出至 $LOGFILE"
touch "$LOGFILE"
sudo stdbuf -oL tcpdump -i "$INTERFACE" port 80 or port 443 -nn -l \
| awk '{print $3}' \
| while read raw_ip; do
# 提取纯净 IP(去除端口或多余内容)
ip=$(echo "$raw_ip" | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}')
# 跳过空或内网地址
[[ -z "$ip" ]] && continue
[[ "$ip" =~ ^(127|10|192\.168|172\.(1[6-9]|2[0-9]|3[0-1]))\. ]] && continue
# 反查域名
hostname=$(dig +short -x "$ip" | sed 's/\.$//')
# 写入日志
if [ -z "$hostname" ]; then
echo "$(date '+%F %T') => $ip" >> "$LOGFILE"
else
echo "$(date '+%F %T') => $ip ($hostname)" >> "$LOGFILE"
fi
done
通过以上脚本,能生成形如下边的流量日志,在短短半小时内,日志中累计记录了超过 40,000 条访问记录,数据量惊人!这进一步印证了——我的网站当前确实正在承受一波持续、高频、分布式的恶意流量攻击。
接下来我会对这些日志做一轮高频 IP 提取,把那些反复刷请求的地址拉出来,加进防火墙黑名单。这完全是一项纯体力活,而且肯定会有误封——正常用户可能也被波及……有没有更好的办法?兄弟们,救救我!
2025-06-03 14:04:37 => 124.90.71.75
2025-06-03 14:04:38 => 117.152.144.104
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 124.90.71.111
2025-06-03 14:04:38 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:38 => 40.77.190.150 (msnbot-40-77-190-150.search.msn.com)
2025-06-03 14:04:38 => 100.100.30.25
2025-06-03 14:04:39 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:39 => 100.100.30.25
2025-06-03 14:04:39 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:39 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:39 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:39 => 121.229.156.124 (sogouspider-121-229-156-124.crawl.sogou.com)
2025-06-03 14:04:39 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:39 => 167.94.138.36 (scanner-06.ch1.censys-scanner.com)
2025-06-03 14:04:39 => 121.229.156.124 (sogouspider-121-229-156-124.crawl.sogou.com)
2025-06-03 14:04:39 => 121.229.156.124 (sogouspider-121-229-156-124.crawl.sogou.com)
2025-06-03 14:04:39 => 121.229.156.124 (sogouspider-121-229-156-124.crawl.sogou.com)
2025-06-03 14:04:39 => 121.229.156.124 (sogouspider-121-229-156-124.crawl.sogou.com)
2025-06-03 14:04:39 => 121.229.156.124 (sogouspider-121-229-156-124.crawl.sogou.com)
2025-06-03 14:04:39 => 100.100.30.25
2025-06-03 14:04:39 => 121.229.156.124 (sogouspider-121-229-156-124.crawl.sogou.com)

你这是阿里云服务器直接裸奔啊,反正备案,推荐你用多吉云CDN试一下