被攻击了?
被攻击了?
偶然的异象
在查看nginx访问日志时,偶尔会看到一些不是那么常见的ua,可能是openai,claude的bot
240d:c010:74:4::39 - - [08/Mar/2026:04:05:16 +0800] "GET /robots.txt HTTP/2.0" 200 106 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
240d:c010:75:5::46 - - [08/Mar/2026:04:05:17 +0800] "GET /robots.txt HTTP/2.0" 200 106 "-" ""
240d:c010:c8:4::66 - - [08/Mar/2026:04:05:18 +0800] "GET /favicon.ico HTTP/2.0" 404 223 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)"
240d:c010:c8:2::de - - [06/Apr/2026:02:31:57 +0800] "GET /archives/2026/03 HTTP/2.0" 200 17048 "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.3; +https://openai.com/gptbot)"
240d:c010:74:8::35 - - [06/Apr/2026:02:32:00 +0800] "GET /archives/2025/06 HTTP/2.0" 200 18065 "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.3; +https://openai.com/gptbot)"
没想到我也有被除了主动告诉的人看到的一天,虽然看到我网站的不诗人,是bot。一方面来说,被bot看到可能确实可以增加为别人带去帮助的可能性,但是文章是有时效性的,作为个人,我没有精力按时检测文章是否还有效,所以也可能误导别人。我还是偏向于用robots.txt不让这些自动机器人爬了。
激增的日志
240d:c010:132:2::9c - - [08/Mar/2026:12:03:29 +0800] "GET / HTTP/2.0" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56"
240d:c010:77:7::10d - - [08/Mar/2026:12:03:38 +0800] "GET /application/.env HTTP/2.0" 200 446 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3872.0 Safari/537.36 Edg/78kuan.0.244.0"
240d:c010:77:5::3c - - [08/Mar/2026:12:03:38 +0800] "GET /php_info.php HTTP/2.0" 200 446 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
240d:c010:132:3::7c - - [08/Mar/2026:12:03:38 +0800] "GET /_profiler/phpinfo HTTP/2.0" 200 446 "-" "Mozilla/5.0 (Linux; Android 8.1.0; Redmi Note 6 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.105 Mobile Safari/537.36"
240d:c010:77:c::61 - - [08/Mar/2026:12:03:38 +0800] "GET /config.json HTTP/2.0" 200 446 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 1083) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1469.0 Safari/537.36"
240d:c010:77:7::110 - - [08/Mar/2026:12:03:38 +0800] "GET /api/.env HTTP/2.0" 404 173 "-" "Mozilla/5.0 (Linux; Android 9; Nokia 7.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Mobile Safari/537.36"
240d:c010:132:3::89 - - [08/Mar/2026:12:03:38 +0800] "GET /.env.prod HTTP/2.0" 200 446 "-" "Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)"
240d:c010:75:4::a2 - - [08/Mar/2026:12:03:45 +0800] "GET /phpinfo.php HTTP/2.0" 200 446 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3889.0 Safari/537.36"
240d:c010:c8:2::df - - [07/Apr/2026:10:34:49 +0800] "GET //cms/wp-includes/wlwmanifest.xml HTTP/2.0" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
这些访问很明显是异常的,因为它在访问根本不存在的文件,应该不诗人。
其实这种访问是很危险的 .env往往是存储环境变量的,也就是密码,secret这种超级机密的信息,不应该被除了自己之外的任何人访问到。一旦密钥泄露,往往就能给粗心大意的站长带去致命打击,比如api额度被薅光,倒欠云服务厂商钱等。
其余的文件应该也是和.env一个体量的,比如config.json这种,一看就是放密码的地方。其实这种自动化程序也不一定是怀着某些特定目的的,比如就是让你受到损失之类的,也可能就是宣传一下他们的网络扫描技术。不过作为站长还是要做好必要的防护,让真的恶意软件来得时候无懈可击。
增加防御
君子协定
既然那些bot没有隐藏ua,而且先看了robots.txt,那我姑且认为他们还是君子,对于君子当然要用君子协定防御,他们试图访问的网站是我之前那个大作业,作为超轻量级的项目,我当时连robots.txt都没写,这些君子看见我门户大开就来串门了,不怪它,加上就是
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
如果他们遵守君子协定的话,现在应该不会来了,不过拦得住君子,拦不住小人,对付小人,就要用其他方法了。
上点手段
robots.txt可以遵守也可以不遵守,如果它硬要访问也是拦不住的,而且也不太可能包含所有机器人的ua,如果这个机器人会伪装ua的话更是一点用没有,上面就有伪装ua的访问。
240d:c010:77:7::110 (Linux; Android 9; Nokia 7.1)
240d:c010:132:3::7c (Linux; Android 8.1.0; Redmi Note 6 Pro)
240d:c010:77:c::61 (Macintosh; Intel Mac OS X 1083)
现在谁还在用这么老的机型,而且ip地址段是同一个,应该就是一家的。
对付这种访问ua不同但是访问的文件一样的,则可以在nginx配置页面防御,懒得手写,让ai生成一版吧。本是同根生,相煎何太急
# --- [新增] 第一道防线:直接封杀敏感文件扩展名和目录 ---
# 匹配 .env, .git, .php, .json (如果你前端不需要加载json的话), .sql 等
location ~* \.(env|php|sql|bak|config|log|yaml|yml|ini)$ {
return 444; # 直接丢弃连接,不给任何解释
}
# --- [新增] 第二道防线:封杀特定的恶意探测路径 ---
location ~* ^/(application|_profiler|backup|config|web-console|admin|wp-includes|wp-admin|wp-content) {
return 444;
}
# --- [新增] 第三道防线:拦截隐藏文件 ---
location ~ /\.(?!well-known) {
deny all;
access_log off;
log_not_found off;
}
顺手加上ua过滤吧,万一君子不遵守君子协定呢
if ($http_user_agent ~* (GPTBot|ClaudeBot|CCBot|ChatGPT-User)) {
return 403;
}
这样,一部分小人就能拦住了。吧。。。。。
手动构造一个恶意请求试试
curl -I https://ai.tianhua.xyz/.env
curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
curl -I https://ai.tianhua.xyz/application/config.php
curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
curl -I https://ai.tianhua.xyz/
HTTP/2 200
server: nginx/1.22.1
date: Mon, 06 Apr 2026 15:21:18 GMT
content-type: text/html
content-length: 817
last-modified: Thu, 19 Jun 2025 19:16:00 GMT
etag: "685461f0-331"
accept-ranges: bytes
curl -I -A "ClaudeBot1145141.0" https://ai.tianhua.xyz/
HTTP/2 403
server: nginx/1.22.1
date: Mon, 06 Apr 2026 15:31:51 GMT
content-type: text/html
content-length: 153
确实拦住了,看看日志如何
2409::19f0:xxxx::e6 - - [06/Apr/2026:23:20:56 +0800] "HEAD /.env HTTP/2.0" 444 0 "-" "curl/8.14.1"
2409::19f0:xxxx::e6 - - [06/Apr/2026:23:21:14 +0800] "HEAD /application/config.php HTTP/2.0" 444 0 "-" "curl/8.14.1"
2409::19f0:xxxx::e6 - - [06/Apr/2026:23:21:18 +0800] "HEAD / HTTP/2.0" 200 0 "-" "curl/8.14.1"
2409::19f0:xxxx::e6 - - [06/Apr/2026:23:31:51 +0800] "HEAD / HTTP/2.0" 403 0 "-" "ClaudeBot1145141.0"
出现了预期的444和403返回码,证明拦截成功。
自动加固
我这如此之小的一个站点都能被自动机器人看上,那么互联网上还有一堆完全不看访问日志的站长呢,会不会他们正在每天泄露隐私而不自知,写个bash辅助进行自动化防御吧。
框架
- 先看看开源社区有没有类似的idea,不要重复造轮子
- 程序进行任何文件操作时都要备份,如果用完出故障,具备还原的能力
- 增加更多的ua和恶意文件检查
轮子
开源社区是有相关的内容的,有根据nginx配置文件拦截常见恶意ua或者恶意访问的项目,也有利用自动化waf,同步规则来进行启发式防御,让新老bot都能被一视同仁,都被防御。
CrowdSec:实时行为分析 + 全球共享封禁情报
nginx-ultimate-bad-bot-blocker:海量恶意 UA + 爬虫规则库
既然开源社区有现成的,那么就可以不用我们自己在造轮子了,我们只需要写个脚本部署到nginx即可。
写sh
拜托一下柴特寄屁踢老师吧,我sh基础薄弱