插件窝 干货文章 怎么为Nginx服务器配置黑名单或白名单功能

怎么为Nginx服务器配置黑名单或白名单功能

Nginx 配置 名单 黑名单 705    来源:    2025-04-24

Nginx 配置黑名单/白名单功能

Nginx 可以通过多种方式实现 IP 地址的黑名单或白名单控制,以下是几种常见的方法:

1. 使用 denyallow 指令

这是最简单直接的方法,在 Nginx 配置文件中使用 denyallow 指令:

http {
    # 黑名单配置示例
    server {
        deny 192.168.1.100;  # 拒绝单个IP
        deny 10.0.0.0/8;     # 拒绝整个网段
        allow all;           # 允许其他所有IP
    }

    # 白名单配置示例
    server {
        allow 192.168.1.50;  # 允许单个IP
        allow 10.1.0.0/16;   # 允许整个网段
        deny all;            # 拒绝其他所有IP
    }
}

2. 使用单独的配置文件管理

为了便于管理,可以创建单独的配置文件:

  1. 创建黑名单文件 /etc/nginx/blacklist.conf
deny 192.168.1.100;
deny 10.0.0.0/8;
  1. 创建白名单文件 /etc/nginx/whitelist.conf
allow 192.168.1.50;
allow 10.1.0.0/16;
deny all;
  1. 在主配置文件中包含这些文件:
http {
    include /etc/nginx/blacklist.conf;
    # 或
    include /etc/nginx/whitelist.conf;
}

3. 使用 Geo 模块

对于更复杂的场景,可以使用 Nginx 的 Geo 模块:

http {
    geo $blocked {
        default 0;
        192.168.1.100 1;  # 标记为1表示要阻止
        10.0.0.0/8 1;
    }

    server {
        if ($blocked) {
            return 403;
        }
    }
}

4. 动态黑名单(结合 fail2ban)

对于需要动态更新的黑名单,可以结合 fail2ban 工具:

  1. 安装 fail2ban:
sudo apt-get install fail2ban  # Debian/Ubuntu
sudo yum install fail2ban      # CentOS/RHEL
  1. 配置 fail2ban 来监控日志并更新 Nginx 黑名单

5. 使用 Nginx Plus 或第三方模块

对于企业级需求,可以考虑: - Nginx Plus 的动态黑名单功能 - ngx_http_geoip_module 模块(基于地理位置过滤) - ModSecurity 等 WAF 模块

最佳实践建议

  1. 白名单优先:对于高安全性要求的应用,优先使用白名单模式
  2. 定期审查:定期检查并更新黑白名单
  3. 日志记录:记录被阻止的访问尝试
  4. 测试验证:应用新规则前先在测试环境验证
  5. CDN 考虑:如果使用 CDN,确保规则适用于原始客户端 IP 而非 CDN IP

示例:完整的白名单配置

http {
    # 白名单IP列表
    allow 192.168.1.50;
    allow 203.0.113.25;
    deny all;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 记录被拒绝的访问
            error_page 403 = @deny;
            try_files $uri $uri/ =404;
        }

        location @deny {
            return 403 "Access Denied";
        }

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
    }
}

配置完成后,记得测试并重新加载 Nginx:

sudo nginx -t
sudo systemctl reload nginx