Nginx 利用 fail2ban 自动封禁乱扫的 IP
- 发表于
- Linux
背景:日益猖獗的网络扫描攻击
近日检查服务器日志时,发现大量异常请求尝试扫描 WordPress 站点的敏感路径和文件。攻击者使用自动化脚本系统性地探测网站漏洞,日志中充斥着各种恶意请求:
1 2 3 | 45.155.205.xxx - - [25/Jan/2024:16:53:57 +0000] "GET /wp-admin/admin-ajax.php HTTP/1.1" 404 150 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" 185.180.143.xxx - - [26/Jan/2024:21:10:00 +0000] "POST /xmlrpc.php HTTP/1.1" 403 162 "-" "python-requests/2.28.1" 78.128.113.xxx - - [03/Feb/2024:21:14:32 +0000] "GET /.env HTTP/1.1" 403 13 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" |
这些扫描请求具有明显特征:高频访问敏感路径、使用异常 User-Agent、产生大量 404/403 错误响应。传统的手动处理方式已无法应对这种规模的自动化攻击。
解决方案:Fail2Ban 自动化防护体系
1. Fail2Ban 安装与基础配置
安装步骤:
1 2 3 4 5 6 7 8 9 10 11 12 | # 更新系统包列表 sudo apt update # 安装 Fail2ban sudo apt install fail2ban # 启用并启动服务 sudo systemctl enable fail2ban sudo systemctl start fail2ban # 验证安装 sudo systemctl status fail2ban |
基础配置(/etc/fail2ban/jail.local):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [DEFAULT] # 禁止时间(24小时) bantime = 86400 # 查找时间窗口(10分钟) findtime = 600 # 最大重试次数 maxretry = 3 # 忽略本地网络 ignoreip = 127.0.0.1/8 192.168.1.0/24 # 使用 UFW 作为防火墙后端 banaction = ufw |
2. 针对 WordPress 扫描的专用配置
创建过滤器(/etc/fail2ban/filter.d/nginx-wp-scan.conf):
1 2 3 4 5 6 7 | [Definition] failregex = ^<HOST> -.*"(GET|POST).* (wp-admin|wp-login|xmlrpc\.php).* 404 ^<HOST> -.*"(GET|POST).* /(\.env|wp-config\.php).* HTTP ^<HOST> -.*"(GET|POST).* (eval|base64_decode|call_user_func).* HTTP ^<HOST> -.*"(GET|POST).* \.(sql|bak|backup|old).* HTTP ignoreregex = |
启用防护规则(/etc/fail2ban/jail.d/wordpress.conf):
1 2 3 4 5 6 7 8 9 | [wordpress-scan] enabled = true port = http,https filter = nginx-wp-scan logpath = /var/log/nginx/access.log maxretry = 5 findtime = 600 bantime = 86400 action = %(action_mwl)s |
3. 系统防火墙联动配置
设置 UFW 基础规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # 重置防火墙 sudo ufw --force reset # 设置默认策略 sudo ufw default deny incoming sudo ufw default allow outgoing # 允许基础服务 sudo ufw allow ssh sudo ufw allow http sudo ufw allow https # 启用防火墙 sudo ufw enable |
4. Nginx 层面增强防护
添加安全头限制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | server { # 添加安全头部 add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; # 阻止敏感文件访问 location ~ /\.(env|git|ht) { deny all; return 403; } location ~* (wp-admin|wp-login) { # 允许内部网络访问 allow 192.168.1.0/24; deny all; # 限制请求频率 limit_req zone=wp_limit burst=5 nodelay; } } |
效果验证与监控
1. 测试防护效果
1 2 3 4 5 6 7 8 | # 测试过滤器规则 sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-wp-scan.conf # 查看当前封禁状态 sudo fail2ban-client status wordpress-scan # 实时监控封禁情况 sudo tail -f /var/log/fail2ban.log | grep 'Ban' |
2. 创建监控脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/bash # 安全状态监控脚本 echo "=== 安全防护状态 ===" echo "检查时间: $(date)" echo echo "1. Fail2Ban 封禁统计:" sudo fail2ban-client status wordpress-scan | grep -E '(Currently banned|Total banned)' echo echo "2. 最近封禁记录:" sudo tail -10 /var/log/fail2ban.log | grep 'Ban' | awk '{print $5,$6,$7}' echo echo "3. 当前网络连接数:" netstat -an | grep :80 | wc -l |
高级防护策略
1. 智能频率检测
对于高频请求的进一步防护:
1 2 3 4 5 6 7 8 | [nginx-request-flood] enabled = true port = http,https filter = nginx-request-flood logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 3600 |
2. 地域封锁功能
1 2 3 4 5 6 7 | # 安装 ipset sudo apt install ipset # 创建国家黑名单 ipset create country_blacklist hash:net # 添加需要封锁的国家IP段 |
总结与建议
通过 Fail2Ban 与 Nginx、系统防火墙的联动,我们构建了三层防护体系:
- Nginx 层面:基础防护和频率限制
- Fail2Ban 层面:智能检测和自动封禁
- 防火墙层面:网络层最终防护
实施建议:
- 定期审查 Fail2Ban 日志,调整防护规则
- 监控误封情况,及时调整检测阈值
- 保持系统和软件更新,修复已知漏洞
- 定期备份重要配置和数据库
预期效果:
- 减少 90% 以上的恶意扫描请求
- 降低服务器负载和带宽消耗
- 提高网站安全性和稳定性
这套方案能够有效应对当前普遍存在的自动化扫描攻击,为 WordPress 站点提供坚实的安全保障。
原文连接:Nginx 利用 fail2ban 自动封禁乱扫的 IP 所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。