fail2ban防护nginx核心三步:安装服务并确认active(running);确保nginx日志含$remote_addr等关键字段;启用nginx-404、nginx-badbots、nginx-noscript等内置规则,配合ignoreip白名单防误封。

新手用 Fail2ban 防护 Nginx,核心就三步:装好它、告诉它看什么日志、定义什么样的行为算“坏”。不需要改代码、不碰防火墙命令,靠配置就能让服务器自动拉黑扫描 IP、撞库请求和恶意 UA。
一、先装好 Fail2ban 并确认运行正常
它不是开箱即用的软件,但安装极简:
- Ubuntu/Debian 系统:sudo apt update && sudo apt install fail2ban -y
- CentOS/Rocky/AlmaLinux:sudo dnf install epel-release fail2ban -y
装完立刻检查状态:
sudo systemctl status fail2ban
看到 active (running) 就说明服务已启动。别跳过这步——很多问题其实卡在服务根本没跑起来。
二、确保 Nginx 日志格式含关键字段
Fail2ban 是靠“读日志”工作的,如果日志里没有 IP、请求方式、状态码或 UA,它就无从判断谁在捣乱。检查你的 Nginx 配置(通常在 /etc/nginx/nginx.conf 或站点 conf 文件中)是否启用了标准或兼容格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
重点是 $remote_addr(真实客户端 IP)必须存在。如果你用的是 CDN 或反向代理,需额外配置 real_ip 指令,否则封的会是 CDN 的 IP,不是攻击者的真实地址。
三、启用现成规则,快速拦截常见恶意行为
Fail2ban 自带一批成熟 filter,新手直接启用最稳妥。编辑 /etc/fail2ban/jail.local(没有就新建),加入这几项:
[nginx-404] enabled = true filter = nginx-404 logpath = /var/log/nginx/access.log maxretry = 6 findtime = 600 bantime = 86400 <p>[nginx-badbots] enabled = true filter = nginx-badbots logpath = /var/log/nginx/access.log maxretry = 1</p><p>[nginx-noscript] enabled = true filter = nginx-noscript logpath = /var/log/nginx/access.log maxretry = 6 </p>
它们分别针对:
-
高频 404 扫描(如扫
/wp-admin、/phpmyadmin) -
已知恶意爬虫 UA(如
sqlmap、nmap、nikto) -
尝试执行脚本文件(如请求
.php、.jsp但你网站不提供)
保存后执行:
sudo fail2ban-client reload
这样新规则就生效了。
四、加白名单,防止把自己锁在外面
封错自己 IP 是新手最常踩的坑。务必在 jail.local 的 [DEFAULT] 区块开头加上可信 IP:
[DEFAULT] ignoreip = 127.0.0.1/8 ::1 203.0.113.5 203.0.113.6
把 203.0.0.113.5 这类替换成你自己的公网 IP 或办公室出口 IP。多个地址用空格隔开。宝塔用户可在插件界面直接填“IP 白名单”,效果一样。











