这两天 VPS 有点闲,翻了下 nginx 日志,然后人傻了。
拿 awk 统计了一下最近两天的 access.log,总共 7297 条请求,真正像人的不到 2800 条。剩下 4500 多条,全是机器人。
最狠的一个 IP(94.154.46.244),两天打了 2100 发,占总数的 29%。它还不装了,User-Agent 直接挂着 Googlebot/2.1,然后满世界找:
/.env、/www/.env、/app/.env.local/wp-config.php.bak、.orig、.old、.save/.git/config/app/settings.py
好家伙,我一个 Hugo 纯静态博客,你搁这儿找 WordPress 配置文件和 Python 源码?这扫描器估计是闭着眼睛扫的,根本不管对面是什么站,字典打完收工。
顺便看了下各家爬虫的构成,挺有意思:
| UA | 请求量 | 评价 |
|---|---|---|
| Googlebot | 2088 | 大头是假扮的,真谷歌没这么急 |
| (空 UA) | 1095 | 最没礼貌的一批 |
| jscrawler/0.1 | 484 | 老老实实爬页面,不搞事 |
| GPTBot/1.4 | 167 | OpenAI 的爬虫,爬完拿去训练 |
除了那个假谷歌,还有个 UA 是 Firefox/2.0.0.17 的,2008 年的浏览器。2026 年了,您那台 Windows XP 还能开机呢,挺不容易的。
然后我干了件正事
本来想着光写篇文章吐槽完拉倒,后来一想,不对,光吐槽不修等于白扫。纯静态站最怕的就是懒得修,反正"也没啥可泄露的",然后哪天真放了东西上去就炸了。
于是在 nginx 的 server 块里加了一条规则:
| |
444 是 nginx 的私货状态码,意思是"连响应都不给你,直接断开连接"。比 403 还省,连 body 都不用发。
nginx -t 测试通过,reload,然后用 curl 验证:
https://jiangym.top/.env→ 连接直接被掐(000)https://jiangym.top/wp-config.php.bak→ 同上- 首页和文章页 → 照常 200
日志里也清爽了,扫描请求一行 444 0,字节数 0,看着就舒坦。
算笔账
两天 7297 条请求,其中 4500 多是扫描和爬虫,按这个频率一个月大概能省下小几万条无意义请求。对一台 1 核 1.9G 的小水管来说,这些请求每一条都要走 TLS 握手、解析请求、打日志,纯纯浪费。
当然这套配置也不算一劳永逸,扫描器换个姿势(比如直接 POST 首页)就绕过了。但至少那些找 .env 和 wp-config 的傻机器人,现在连门都摸不到了。
之前写 Docker 卸载那篇的时候提过,现在整台机器就一个 nginx 守着,也没有容器隔离这一层了,所以对进来的请求反而要多上点心。这次算是补了一小块。
日志还是每天轮转一次、保留 14 天,logrotate 自己管。明天再看看 444 的数量,估计会很壮观。
就这样,下回聊。