一、 引言 (Introduction)
1. 痛点与背景
描述您的服务器遇到的问题:日志中出现大量的 403 Forbidden 和 404 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 =
EOF2. 配置监狱(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 状态。
评论区