被扫描器盯上的那两周
不是攻击,只是扫描。但每天几万次请求打到一个日活不到一百的小站上,日志和带宽都会难受。
这两周我把日志翻了一遍,得到的结论比想象中具体。
先看四条统计
LOG=/var/log/nginx/blog.access.log
# 谁在打
awk '{print $1}' $LOG | sort | uniq -c | sort -rn | head -20
# 在找什么
awk '{print $7}' $LOG | sort | uniq -c | sort -rn | head -20
# 状态码分布
awk '{print $9}' $LOG | sort | uniq -c | sort -rn | head
# UA
awk -F'"' '{print $6}' $LOG | sort | uniq -c | sort -rn | head -20
我的结果大概是这样:
- Top 路径里一半是
/wp-login.php、/.env、/phpmyadmin、/config.json - 状态码 404 占七成,444 占两成(说明探针规则在干活)
- UA 里出现大量空 UA 和
python-requests
三个判断
大量不同 IP、同一个 UA → 僵尸网络。封 IP 没用,它们换得比你封得快。封 UA 或者上挑战。
单一 IP、高频同一路径 → 脚本在跑。这种最省事,直接限速加封 IP。
大量 404 但流量不高 → 只是有人在扫全网,不用管。回 444 断连就够了,省的是日志体积。
真正省带宽的两条规则
第一是探针路径直接 return 444:
location ~* ^/(?:\.|wp-|xmlrpc|phpmyadmin|\.env|\.git|\.svg/|cgi-bin) { return 444; }
location ~* \.(?:sql|bak|old|swp|ini|log|env|yml|zip|tar)$ { return 444; }
第二是空 UA 和扫描器 UA:
map $http_user_agent $bad_ua {
default 0;
"" 1;
~*(?:sqlmap|nikto|nmap|masscan|zgrab|nuclei|acunetix|dirbuster|gobuster|ffuf) 1;
}
命中就 return 444。这两条加完,日志体积掉了大概六成。
没用的做法
改端口、改路径、加 robots.txt 里的 Disallow——扫描器不看 robots,端口是全端口扫的。
还有"封 IP 段":对家宽段动手会误伤真实用户,对机房段动手要封几百个 /24,维护成本比收益高。除非你有很明确的单点来源。
坑
别在办公网做压测或者规则验证。limit_req 是按 IP 的,同事会跟你一起被封十分钟,然后来找你。
需要按上面的步骤在自己服务器上配一遍? 可以邮件 2725854295@qq.com,或者关注公众号「凌的科技圈」留言。说明系统版本和域名,我给一套现成的配置文件。