侧边栏壁纸
  • 累计撰写 70 篇文章
  • 累计创建 22 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

利用 Fail2ban 强力拦截 Nginx 恶意扫描与非法请求

七月流火
2025-11-27 / 0 评论 / 0 点赞 / 12 阅读 / 0 字

一、 引言 (Introduction)

1. 痛点与背景

  • 描述您的服务器遇到的问题:日志中出现大量的 403 Forbidden404 Not Found 错误。

  • 强调恶意扫描、爬虫(如 SemrushBot, DotBot)和暴力猜测对服务器资源的浪费和安全隐患。

  • Fail2Ban 简介: 简要说明 Fail2Ban 的作用——通过分析日志,自动识别并使用防火墙(如 iptables)封禁恶意 IP 地址。

2. 环境说明

  • 系统环境: Linux (CentOS/Ubuntu)

  • 面板: 1Panel 应用管理面板

  • 核心服务: OpenResty (Nginx)

  • 安全工具: Fail2Ban

二、 识别恶意日志模式

1. 漏洞挖掘与扫描(恶意行为)

  • 路径穿越尝试GET /index.php?lang=../../../../../../../../tmp/index1

    • 意图:这明显是在尝试通过“目录遍历”读取你服务器上的系统文件。

  • Docker 漏洞扫描GET /containers/json

    • 意图:他在看你有没有开着未授权访问的 Docker 接口,想直接接管你的容器。

  • 敏感文件扫描GET /.env

    • 意图:尝试偷取你的配置文件,里面通常包含数据库密码、API 密钥等。

  • 各种 \x16\x03\x01... 乱码

    • 真相:这是客户端在尝试发起 HTTPS (SSL/TLS) 连接,但你的端口可能只配置了 HTTP。Nginx 看不懂这些二进制握手包,所以报了 400 错误。

  • SSH 协议扫描"SSH-2.0-Go"

    • 真相:扫描器用 SSH 协议去撞你的 HTTP 端口,发现牛头不对马嘴,被 Nginx 踢了出去。

  • 远程桌面扫描mstshash=Administr

    • 真相:这是 Windows 远程桌面 (RDP) 的指纹,黑客在扫看这台机器是不是开了 3389 端口(只是他扫错端口了)。

  • Palo Alto Networks / Censys / BitSightBot

    • 这些是安全公司或网络测绘引擎(如著名的 Censys、Shodan)。他们在全网扫描并记录所有服务器的开放端口、证书和响应头,用于安全研究或测绘。

  • Bytespider (字节跳动)

    • 这是今日头条/抖音的爬虫,来抓取网页内容的

  • 引用您日志中的关键行,突出显示恶意 IP 和状态码。

  • 关注状态码: 403 (Forbidden) 和 404 (Not Found)。

2. OpenResty 日志路径确认 (关键)

  • 告知读者如何找到正确的日志文件路径。

  • 您的日志路径: /opt/1panel/apps/openresty/openresty/log/access.log

  • 强调:这是 Fail2Ban 必须监控的文件。

三、 Fail2Ban 核心配置 (Jail & Filter)

这是文档的核心部分,详细介绍如何创建并验证过滤器。

1. 创建自定义过滤器(Filter)

  • 目的: 创建一个 nginx-bad-requests 过滤器,用于捕获所有 403 和 404 错误。

  • 文件路径: /etc/fail2ban/filter.d/nginx-bad-requests.conf

  • 文件内容 (最终测试成功的版本):

代码段

# /etc/fail2ban/filter.d/nginx-bad-requests.conf

cat <<EOF > /etc/fail2ban/filter.d/nginx-bad-requests.conf
[Definition]
failregex = ^<HOST> -.*" (444|400)
            ^<HOST> -.*\.env
            ^<HOST> -.*index\.php
            ^<HOST> -.*containers/json
            ^<HOST> -.*\\\\x
            ^<HOST> -.* "(GET|POST|HEAD|OPTIONS|PUT|DELETE) [^"]*" (403|404)

ignoreregex = 
EOF

2. 配置监狱(Jail)

  • 目的: 定义封禁规则,告诉 Fail2Ban 监控哪个日志文件、使用哪个过滤器、以及如何封禁。

  • 文件路径: /etc/fail2ban/jail.local

  • 配置内容:

代码段

[nginx-bad-requests]
enabled = true
filter = nginx-bad-requests
logpath = /opt/1panel/apps/openresty/openresty/log/access.log 
banaction = iptables-allports
bantime = 3600    ; 封禁时间 (秒),此处为 1 小时
maxretry = 5      ; 最大尝试次数
findtime = 600    ; 查找时间 (秒),10 分钟内失败 5 次即封禁

四、 验证与部署

1. 过滤器有效性验证 (专业性体现)

  • 使用 fail2ban-regex 工具来测试过滤器是否能匹配日志。

  • 命令:

    Bash

    sudo fail2ban-regex /opt/1panel/apps/openresty/openresty/log/access.log /etc/fail2ban/filter.d/nginx-bad-requests.conf
    
  • 结果解读: 如果 matched 行数大于 0,说明过滤器有效。

2. 重启服务并检查状态

  • 告知读者如何通过 1Panel 或 SSH 重启 Fail2Ban 服务。

  • SSH 命令:

    Bash

    sudo systemctl restart fail2ban
    
  • 检查 Jail 状态: 确保 Jail 被正确加载,并查看封禁列表。

    Bash

    sudo fail2ban-client status nginx-bad-requests
    

五、 进阶建议 (Advanced Tips)

  • 推荐使用 nginx-badbots 对于 SemrushBot 等已知 User-Agent 的恶意行为,内置的 nginx-badbots 过滤器往往更具针对性。读者可以考虑同时启用两个 Jail 或仅启用此 Jail。

  • bantime 警告: 提醒读者不要将 bantime 设置为 -1 (永久封禁),以免造成误封难以恢复。

  • 白名单 (Ignore IP): 提示读者将自己的 IP 或可信的爬虫 IP (如 Googlebot) 加入 jail.local 文件的 ignoreip 列表中,防止误封。

六、 总结 (Conclusion)

  • 总结 Fail2Ban 带来的好处:减少服务器负载、提升安全性。

  • 呼吁读者定期检查日志和 Fail2Ban 状态。

0

评论区