15 10 月 2026

日志里每分钟几十个 404、后台登录页被疯狂试探、漏洞扫描器全天候关照——你的网站每天都在被扫。这篇讲怎么识别扫描和爆破、怎么分层防御、误报了怎么办。全部配置可抄,30 分钟见效。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站和游戏服都能快速部署。

一、先看懂攻击长什么样

1.1 目录扫描

# 日志里短时间内大量 404,路径还带漏洞扫描特征
grep " 404 " /var/log/nginx/access.log | tail -20
# 典型路径: /.env /wp-config.php.bak /phpmyadmin/ /.git/config

特征:单个 IP 高频请求不存在的路径,User-Agent 常是扫描器默认值或伪装。

1.2 后台爆破

# 登录接口被疯狂 POST
grep "POST /wp-login.php" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head
# 输出: 89 45.x.x.x  ← 一个 IP 试了 89 次

1.3 漏洞探测

请求里带 payload:?id=1' AND 1=1、/<script>alert(1)</script>、构造特殊的上传文件名。这些请求大部分进不了业务,但全打在你带宽和日志上。

识别脚本:

# 今日 Top 10 请求 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# 404 最多的 IP(扫描器特征)
awk '$9==404 {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

日志分析方法见Web 日志分析实战。

二、第一层:fail2ban 自动封禁

扫描和爆破的主力防御,装完即生效:

sudo apt-get install fail2ban

sudo tee /etc/fail2ban/jail.d/web.conf >/dev/null <<'EOF'
[nginx-badbots]
enabled = true
port    = http,https
filter  = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 3
bantime  = 86400
findtime = 600

[nginx-404]
enabled = true
port    = http,https
filter  = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 20
findtime = 60
bantime  = 3600
EOF

# 自建 404 过滤器(默认没有)
sudo tee /etc/fail2ban/filter.d/nginx-404.conf >/dev/null <<'EOF'
[Definition]
failregex = ^<HOST> .* "(GET|POST|HEAD) [^"]*" (404|444) .*$
ignoreregex =
EOF

sudo systemctl restart fail2ban
sudo fail2ban-client status

效果:一个 IP 一分钟内 20 个 404 就封一小时;试 3 次已知恶意 UA 封一天。完整配置见fail2ban 防暴力破解实战。

三、第二层:Nginx 限流限速

针对高频接口(登录、搜索、API):

# 定义限流区:每秒 10 个请求,突发 20
limit_req_zone $binary_remote_addr zone=login:10m rate=10r/s;

location = /wp-login.php {
    limit_req zone=login burst=20 nodelay;
    limit_req_status 429;
    try_files $uri =404;
    fastcgi_pass unix:/run/php/php-fpm.sock;
    include fastcgi_params;
}

# 全局限速(可选):单 IP 总并发连接数
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20;

详细限流策略见Nginx 限速与 CC 防护进阶。

四、第三层:WAF 规则

fail2ban 管「频率」,WAF 管「内容」——请求里带 SQL 注入、XSS、webshell 特征的直接拦:

# ModSecurity + OWASP CRS(开箱即用的规则集)
sudo apt-get install libapache2-mod-security2   # Nginx 用 libmodsecurity3
# 或国产方案:雷池(SafeLine),面板化管理更适合新手

规则实战见WAF 规则实战。新手建议直接上雷池这类可视化 WAF:规则不用手写、误报能一键加白、攻击日志看得懂。

五、后台与入口加固

扫描器最爱找的是已知路径,改掉它们成本最低:

对象默认路径加固
WordPress 后台/wp-login.php /wp-admin插件改登录地址 + IP 白名单
phpMyAdmin/phpmyadmin改端口 + HTTP Basic 认证 + IP 白名单
宝塔面板/8888 固定端口改随机端口 + 安全入口 + 面板 Basic Auth
Typecho 后台/adminBasic Auth 或 IP 白名单
# phpMyAdmin 只允许自己 IP + 加密码
location /phpmyadmin {
    allow 你的IP/32;
    deny all;
    auth_basic "Admin Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}
# 生成 Basic Auth 密码文件
sudo htpasswd -c /etc/nginx/.htpasswd admin

后台加固全景见SSH 安全加固进阶。

六、验证与调优:别误伤自己

# 看封禁记录
sudo fail2ban-client status nginx-404
sudo fail2ban-client status nginx-badbots

# 误伤了正常用户/自己的监控?解封
sudo fail2ban-client set nginx-404 unbanip 1.2.3.4

# 把搜索引擎 UA 加白(否则爬虫被误封影响收录)
# filter 里 ignoreregex 加:
# ^.*"(Baiduspider|Googlebot|bingbot|Sogou|360Spider).*"$

防误伤三原则:

  1. 搜索引擎 UA 加白(影响 SEO 的大事)
  2. 自己的办公 IP 加白(fail2ban 的 ignoreip)
  3. 封禁阈值别太狠(404 阈值 20/分钟比较稳,5 太激进)

搜索引擎友好性见网站 SEO 基础优化指南。

七、被扫描时的日常心态

说句实话:被扫是常态,不是事故。互联网上任何暴露的 IP 每天都被扫几百次。你要做的不是「不被扫」,而是:

  • 扫描打不进来(WAF+限流+加固)
  • 爆破试不走(密钥登录+强密码+fail2ban)
  • 日志看得见(异常有告警)
  • 真出事了有预案(见应急排查)

按这个 checklist 过一遍,扫描器就只能在你门外转转:Nginx 挡目录、fail2ban 封频率、WAF 拦 payload、后台改路径加认证。四层配齐,日志里的 404 风暴就只是背景噪音。

需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,建站快速部署。延伸阅读:网站被 CC 攻击怎么办、DDoS 攻击基础认知与防护、Linux 防火墙配置实战。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Git 仓库与代码泄露防范:.env 推上 GitHub 的急救与预防
  2. 下一篇:钓鱼邮件与社会工程防范:技术之外的最后一道防线
发表评论 5