零度/服务器 · 网络 · 自建
← 全部笔记

被扫描器盯上的那两周

不是攻击,只是扫描。但每天几万次请求打到一个日活不到一百的小站上,日志和带宽都会难受。

这两周我把日志翻了一遍,得到的结论比想象中具体。

先看四条统计

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 的,同事会跟你一起被封十分钟,然后来找你。

标签:日志 · 防护 导出:Markdown · Word

需要按上面的步骤在自己服务器上配一遍? 可以邮件 2725854295@qq.com,或者关注公众号「凌的科技圈」留言。说明系统版本和域名,我给一套现成的配置文件。