Nginx 利用 fail2ban 自动封禁乱扫的 IP
文章介绍了通过 Fail2Ban 自动化防护体系应对日益猖獗的 WordPress 站点网络扫描攻击的方法,包括 Fail2Ban 的安装配置、专用过滤规则创建、系统防火墙联动及 Nginx 层面增强防护等措施,并提供了效果验证与监控脚本及高级防护策略建议,构建了多层安全防护体系以有效减少恶意请求并提高网站安全性。 2025-9-29 02:50:57 Author: www.uedbox.com(查看原文) 阅读量:16 收藏

背景:日益猖獗的网络扫描攻击

近日检查服务器日志时,发现大量异常请求尝试扫描 WordPress 站点的敏感路径和文件。攻击者使用自动化脚本系统性地探测网站漏洞,日志中充斥着各种恶意请求:

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 安装与基础配置

​安装步骤:​

# 更新系统包列表

sudo apt update

# 安装 Fail2ban

sudo apt install fail2ban

# 启用并启动服务

sudo systemctl enable fail2ban

sudo systemctl start fail2ban

# 验证安装

sudo systemctl status fail2ban

​基础配置(/etc/fail2ban/jail.local):​

[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):​

[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):​

[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 基础规则:​

# 重置防火墙

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. 测试防护效果

# 测试过滤器规则

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. 创建监控脚本

#!/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. 智能频率检测

对于高频请求的进一步防护:

[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. 地域封锁功能

# 安装 ipset

sudo apt install ipset

# 创建国家黑名单

ipset create country_blacklist hash:net

# 添加需要封锁的国家IP段

总结与建议

通过 Fail2Ban 与 Nginx、系统防火墙的联动,我们构建了三层防护体系:

  1. ​Nginx 层面​​:基础防护和频率限制
  2. ​Fail2Ban 层面​​:智能检测和自动封禁
  3. ​防火墙层面​​:网络层最终防护

​实施建议:​

  • 定期审查 Fail2Ban 日志,调整防护规则
  • 监控误封情况,及时调整检测阈值
  • 保持系统和软件更新,修复已知漏洞
  • 定期备份重要配置和数据库

​预期效果:​

  • 减少 90% 以上的恶意扫描请求
  • 降低服务器负载和带宽消耗
  • 提高网站安全性和稳定性

这套方案能够有效应对当前普遍存在的自动化扫描攻击,为 WordPress 站点提供坚实的安全保障。


文章来源: https://www.uedbox.com/post/119731/
如有侵权请联系:admin#unsafe.sh