---
id: scanner-two-weeks
title: 被扫描器盯上的那两周
date: 2026-10-15
updated: 2026-10-15
category: 复盘
tags: 日志, 防护
minutes: 9
---

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

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

## 先看四条统计

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