Nginx 反向代理怎么配置限制特定 IP 访问防止恶意攻击?

文章导读
对于已知的恶意 IP 地址,最直接的方法是在 Nginx 配置文件中通过 allow 和 deny 指令进行访问控制。在反向代理架构下,需特别注意获取客户端真实 IP,否则限制可能失效。
📋 目录
  1. A 完整配置示例
  2. B 反向代理获取真实 IP
  3. C 操作步骤
  4. D 验证方法
  5. E 性能与管理建议
  6. F 常见坑
A A

对于已知的恶意 IP 地址,最直接的方法是在 Nginx 配置文件中通过 allow 和 deny 指令进行访问控制。在反向代理架构下,需特别注意获取客户端真实 IP,否则限制可能失效。

先说结论:通过 ngx_http_access_module 模块配置 IP 黑白名单是 Nginx 原生支持的功能,无需额外安装模块,配置生效后请求会被直接返回 403 状态码。

  • 先判断:确认攻击来源 IP 是单一地址还是网段,避免误伤正常用户。
  • 优先做:在 server 或 location 块中写入 deny 或 allow 规则,反向代理场景需先配置 real_ip。
  • 再验证:使用 curl 命令模拟请求,确认被禁 IP 收到 403 响应且日志有记录。

完整配置示例

以下配置片段包含完整的 server 块上下文,可直接参考嵌入。注意规则顺序是从上到下匹配,一旦匹配成功即停止。

server {
    listen 80;
    server_name example.com;

    location / {
        deny 192.168.1.1;
        allow 192.168.1.0/24;
        allow all;
        
        proxy_pass http://backend;
    }
}

反向代理获取真实 IP

如果 Nginx 前有 CDN 或负载均衡,客户端 IP 可能是代理 IP,需配置 real_ip 模块,否则限制的可能是 CDN 节点 IP。

http {
    set_real_ip_from 10.0.0.0/8;
    set_real_ip_from 172.16.0.0/12;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
}

将上述配置放入 http 块或 server 块上方,确保 Nginx 能识别经过代理后的真实客户端 IP。

Nginx 反向代理怎么配置限制特定 IP 访问防止恶意攻击?

操作步骤

1. 找到配置文件:通常位于/etc/nginx/nginx.conf 或/etc/nginx/conf.d/域名.conf。

2. 编辑配置:在需要保护的 location 或 server 块中添加指令。若要禁止特定 IP,写 deny IP;若只允许特定 IP,先写 allow IP 再写 deny all。

3. 检查语法:执行 nginx -t 命令,确保输出 syntax is ok 和 test is successful。

4. 重载服务:执行 nginx -s reload 使配置生效,避免直接重启导致服务中断。

验证方法

在受限制的 IP 机器上使用 curl -I http://域名 命令,观察 HTTP 状态码是否为 403 Forbidden。同时查看 Nginx 错误日志,通常位于/var/log/nginx/error.log,确认是否有 access forbidden by rule 的记录。

Nginx 反向代理怎么配置限制特定 IP 访问防止恶意攻击?

性能与管理建议

当需要限制的 IP 数量较大时,直接写在配置文件中会增加加载时间。建议将 IP 列表存入单独文件,通过 include 指令引入。

location / {
    include /etc/nginx/conf.d/deny_ips.conf;
    allow all;
}

常见坑

1. 规则顺序:Nginx 按顺序匹配,若先写了 allow all,后面的 deny 将不生效。

2. 真实 IP 获取:未配置 set_real_ip_from 和 real_ip_header 会导致限制失效,务必根据实际代理架构填写可信网段。

3. 语法错误:IP 格式错误或 CIDR 掩码写错会导致 nginx -t 检查失败,不要直接 reload。