找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18|回复: 0

[维护日志] Discuz! X3.5 站点自动化防护体系:从 Nginx 限流到 Fail2ban 永久封禁

[复制链接]
  • 打卡等级:本地老炮

9337

威望

7448

金钱

1万

贡献

管理员

自由的灵魂

积分
107434
主题
5630
回帖
26661
注册时间
2003-4-10
最后登录
2026-10-2
发表于 2025-12-1 16:48:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖内容基于历史实践,现在已经不复使用,最新防护实践已经转向雷池WAF。


🛡️ Discuz! X3.5 站点自动化防护体系实践

作者:一位被bot折磨后走向自动化的站长
站点:www.dianbo.org
更新日期:2025-12-01




📌 防护目标

  • 阻断 WordPress 扫描(即使站点非WP)
  • 拦截路径遍历、SQL注入等通用Web攻击
  • 防御 SSH 暴力破解
  • 重点压制 Discuz 搜索接口滥用(当前主要攻击面)
  • 所有恶意 IP 永久拉黑,且不影响正常用户




🧱 整体架构

  1. graph LR
  2. A[公网请求] --> B{Nginx 层}
  3. B -->|WP/敏感路径| C[return 444 + 不记录日志]
  4. B -->|正常请求| D[PHP-FPM]
  5. B -->|搜索请求| E[限流 zone=search]
  6. E -->|超限| F[返回 503 + 记录日志]
  7. F --> G[Fail2ban 实时分析]
  8. G --> H[ipset 永久封禁]
  9. C --> I[攻击者无感知,无日志残留]
复制代码


核心思想:
  • 无关攻击 → 静默丢弃(不浪费资源)
  • 有效攻击 → 精准记录 + 自动封禁




🔒 第一层:Nginx 前置拦截(零日志、零响应)

1. 拦截 WordPress 扫描(彻底“隐身”)

  1. location ~* ^/(?:xmlrpc\.php|wp-login\.php|wp-admin|wp-config\.php|wp-content|wp-includes|wp-json|\.env|readme\.html|license\.txt)(?:$|/) {
  2.     access_log off;      # 关键:不写入 access.log
  3.     log_not_found off;
  4.     return 444;          # 静默关闭 TCP 连接
  5. }
复制代码


  • 效果:扫描者收不到任何响应,也不会触发 fail2ban
  • 优势:节省磁盘 I/O 和 CPU,避免日志污染




2. 禁止访问敏感文件

  1. location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
  2.     return 404;
  3. }
复制代码





⚡ 第二层:关键接口限流(制造“可捕获信号”)

针对 /search.php 设置专门限流策略:

  1. limit_req_zone $binary_remote_addr zone=search:10m rate=10r/s;
  2. limit_req_zone $server_name zone=search_total:10m rate=30r/s;

  3. location = /search.php {
  4.     limit_req zone=search burst=5 nodelay;
  5.     limit_req zone=search_total burst=10;
  6.     fastcgi_pass unix:/tmp/php-cgi-82.sock;
  7.     include fastcgi.conf;
  8. }
复制代码


  • 正常用户:几乎不会触发限流
  • 恶意 Bot:高频请求 → 返回 503 Service Unavailable
  • 关键点:503 会被记录到 access.log,作为 fail2ban 的封禁依据




🤖 第三层:Fail2ban 智能封禁(基于日志分析)

Jail 配置(/etc/fail2ban/jail.local)

  1. [DEFAULT]
  2. ignoreip = 127.0.0.1/8 221.1.204.34 103.148.244.129
  3. bantime  = 600
  4. findtime = 300
  5. maxretry = 5

  6. ### 主战场:Discuz 搜索攻击 ###
  7. [search-ipset]
  8. enabled  = true
  9. filter   = search-ipset
  10. logpath  = /www/wwwlogs/www.dianbo.org.log
  11. maxretry = 1          # 一次 503 即封
  12. findtime = 600
  13. bantime  = 30d        # 实际用 ipset 永久封
  14. banaction = iptables-ipset[type=multiport, name=search-ipset, port="80,443"]

  15. ### 其他防护(虽静止但保留) ###
  16. [nginxmalicious-ipset]
  17. enabled  = true
  18. filter   = nginxmalicious-ipset
  19. logpath  = /www/wwwlogs/www.dianbo.org.log
  20. maxretry = 2

  21. [nginxwpscan-ipset]
  22. enabled  = true
  23. filter   = nginxwpscan-ipset
  24. logpath  = /www/wwwlogs/www.dianbo.org.log
  25. maxretry = 1
复制代码


Filter 示例(search-ipset.conf)

  1. [Definition]
  2. failregex = ^<HOST> .*"(GET|POST) /(search|home)\.php\?.*formhash=[a-f0-9]{8}.*" 503
  3. ignoreregex =
复制代码

💡 为什么其他 jail 静止?
- WP扫描被 Nginx access_log off 屏蔽 → fail2ban 看不见
- 路径遍历等被 Nginx/PHP 拦截 → 未进入日志
- SSH 已改端口 → 无暴力破解日志
这是设计使然,不是漏报!




🔥 第四层:永久 IP 黑名单(跨重启持久化)

  • 使用 ipset 存储封禁 IP(O(1) 高效查找)
  • 每日通过脚本导出:ipset save > bad-ips.map
  • Nginx 启动时加载黑名单:
    1. map $remote_addr $blocked_ip {
    2.     default 0;
    3.     include /www/fail2ban-persist/bad-ips.map;
    4. }
    5. server {
    6.     if ($blocked_ip) { return 444; }
    7. }
    复制代码

  • 效果:即使 fail2ban 重启,历史恶意 IP 仍被拦截




📊 当前效果(截至 2025-12-01)

Jail 名称封禁 IP 数近期活跃情况
search-ipset154,463✅ 每日新增 10,000+
nginxmalicious-ipset679❌ 多日不变
nginxwpscan-ipset151❌ 多日不变
sshd-ipset44❌ 多日不变


✅ 结论:攻击高度集中于搜索接口,其他入口因“无利可图”已被 bot 放弃。




💡 经验总结

  • 不要依赖 fail2ban 处理所有攻击 → 前置拦截更高效
  • 对非目标路径使用 access_log off → 避免日志膨胀
  • 限流是制造“可检测信号”的关键 → 让 bot “留下痕迹”
  • 永久黑名单比临时封禁更有效 → 防止 IP 轮换重试




📎 关键配置文件位置

  • Nginx 站点配置:/www/server/panel/vhost/nginx/www.dianbo.org.conf
  • Fail2ban Jail:/etc/fail2ban/jail.local
  • Filter 规则:/etc/fail2ban/filter.d/*.conf
  • 持久化黑名单:/www/fail2ban-persist/bad-ips.map




✨ 提示

如果你也在使用 宝塔面板 + Discuz,这套方案可直接参考调整。




欢迎交流指正,也希望能帮助到同样在对抗自动化攻击的朋友! 😄
不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
学然后知不足,教然后知困。知不足,然后能自反也;知困,然后能自强也。故曰:教学相长也。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|点拨论坛 |网站地图

GMT+8, 2026-10-2 02:23 , Processed in 0.071889 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表