nginx使用blacklist禁止ip段访问


正确配置方法

在你的 Nginx 配置文件中(如 /etc/nginx/nginx.conf 或站点配置 sites-enabled/default),在 server 块或 http 块中添加:

server {
    listen 80;
    server_name your-domain.com;

    # 黑名单:禁止 39.101.92.0/24 整个 C 段 
    deny 39.101.92.0/24;
    
    # 允许其他所有 IP
    allow all;

    # 其他配置...
    location / {
        proxy_pass http://backend;
    }
}

顺序很重要! Nginx 按从上到下的顺序匹配 deny/allow,所以 deny 必须写在 allow all; 之前


如果要禁止多个 IP 段(推荐用 include 管理)

为了可维护性,建议将黑名单单独放在一个文件中:

1. 创建黑名单文件

# /etc/nginx/blacklist.conf
deny 39.101.92.0/24;
deny 185.185.185.0/24;
deny 1.2.3.4;
# 可继续添加...

2. 在 server 块中引入

server {
    listen 80;
    server_name your-domain.com;

    include /etc/nginx/blacklist.conf;
    allow all;

    location / {
        # ...
    }
}

3. 重载 Nginx

nginx -t && nginx -s reload

为什么用 39.101.92.0/24

  • 39.101.92.x 是一个 C 类网段,子网掩码为 255.255.255.0
  • CIDR 表示法:/24 表示前 24 位是网络号,后 8 位是主机号(共 2⁸ = 256 个 IP)。
  • 所以 39.101.92.0/24 覆盖了 39.101.92.039.101.92.255

注意:39.101.92.039.101.92.255 通常是网络地址和广播地址,实际可用 IP 是 .1 ~ .254,但 Nginx 的 deny 会匹配整个范围,无需担心。


验证是否生效

  1. 从被禁 IP 段的机器访问你的网站,应返回 403 Forbidden
  2. 查看 Nginx 日志:[error] ... access forbidden by rule, client: 39.101.92.xxx

重要提醒

  • Nginx 的 deny 是基于客户端真实 IP 的。如果你用了 CDN(如 Cloudflare、阿里云 CDN),Nginx 看到的是 CDN 节点 IP,不是真实用户 IP!
    • 此时你需要:
      1. 先通过 real_ip 模块获取真实 IP(设置 set_real_ip_from + real_ip_header X-Forwarded-For
      2. 再用 deny 限制真实 IP
  • 示例(使用 CDN 时): server { # 告诉 Nginx 哪些是可信代理(CDN IP 段) set_real_ip_from 103.21.244.0/22; # Cloudflare set_real_ip_from 39.101.92.0/24; # 如果这是你的反代IP?一般不是 real_ip_header X-Forwarded-For; # 然后再 deny deny 39.101.92.0/24; allow all; }

总结

要禁止 39.101.92.*,只需在 Nginx 的 server 块中加入:

deny 39.101.92.0/24;
allow all;

简单、高效、原生支持。
适用于直接访问(无 CDN)场景。
如有 CDN,需先配置 real_ip 获取真实 IP。

Comments

No comments yet. Why don’t you start the discussion?

发表回复