Nginx 配置允许指定 IP 段访问:从 192.168.1.1 到 192.168.1.124 及 /24 详解

Nginx 配置允许指定 IP 段访问

一、需求与结论

假设你要在 Nginx 中只允许:

text 复制代码
192.168.1.1 ~ 192.168.1.124

访问某个站点或目录。

Nginx 的 allow / deny 指令只支持:

  • 单个 IP,例如 192.168.1.10
  • CIDR 网段,例如 192.168.1.0/24

它不支持这种写法:

nginx 复制代码
allow 192.168.1.1-192.168.1.124;  # 错误

所以必须把 IP 范围拆成多个 CIDR 段,再按顺序配置。


二、精确覆盖 192.168.1.1 ~ 192.168.1.124

如果要求精确覆盖 .1 到 .124,可以这样拆:

nginx 复制代码
server {
    listen 80;
    server_name example.com;

    location / {
        allow 192.168.1.1/32;      # 1
        allow 192.168.1.2/31;      # 2-3
        allow 192.168.1.4/30;      # 4-7
        allow 192.168.1.8/29;      # 8-15
        allow 192.168.1.16/28;     # 16-31
        allow 192.168.1.32/27;     # 32-63
        allow 192.168.1.64/27;     # 64-95
        allow 192.168.1.96/28;     # 96-111
        allow 192.168.1.112/29;    # 112-119
        allow 192.168.1.120/30;    # 120-123
        allow 192.168.1.124/32;    # 124
        deny  all;

        root  /var/www/html;
        index index.html;
    }
}

注意:deny all; 必须放在最后。Nginx 按顺序匹配,命中第一条 allow 或 deny 就生效。


三、简化写法

如果 .0、.125、.126、.127 这些地址实际不会使用,可以简化为:

nginx 复制代码
allow 192.168.1.0/25;   # 覆盖 192.168.1.0 ~ 192.168.1.127
deny  all;

这样写更简单,但范围会比 .1 ~ .124 略宽,会额外允许 .0 和 .125 ~ .127。

如果只是想允许整个 192.168.1.x 网段,则可以用 /24:

nginx 复制代码
allow 192.168.1.0/24;
deny  all;

四、/24 是多少?

/24 是 CIDR 表示法,表示子网掩码:

text 复制代码
255.255.255.0

以 192.168.1.0/24 为例:

项目 值
子网掩码 255.255.255.0
网络前缀 24 位
主机位 8 位
总 IP 数 256 个
IP 范围 192.168.1.0 ~ 192.168.1.255
传统可用主机 254 个,通常 .0 是网络地址,.255 是广播地址

在 Nginx 中:

nginx 复制代码
allow 192.168.1.0/24;
deny  all;

表示允许整个 192.168.1.0 ~ 192.168.1.255 访问。Nginx 层面会匹配这 256 个地址。


五、只限制某个路径

如果只想保护后台或管理目录:

nginx 复制代码
location /admin/ {
    allow 192.168.1.0/25;
    deny  all;

    proxy_pass http://127.0.0.1:8080;
}

这样只有指定 IP 段能访问 /admin/,其他 IP 返回 403。


六、全局限制

也可以放在 http、server 或 location 块中:

nginx 复制代码
http {
    allow 192.168.1.0/25;
    deny  all;
}

一般建议放在 server 或 location 中,避免影响所有站点。


七、反向代理后如何拿到真实 IP

如果 Nginx 前面还有负载均衡、CDN 或反向代理,$remote_addr 拿到的可能是代理 IP,而不是客户端真实 IP。

这时需要配置真实 IP 模块:

nginx 复制代码
set_real_ip_from 10.0.0.0/8;      # 你信任的代理网段
real_ip_header   X-Forwarded-For;
real_ip_recursive on;

配置后,allow / deny 才会按客户端真实 IP 生效。


八、常见坑

  1. Nginx 不支持 IP 范围写法

    192.168.1.1-192.168.1.124 必须拆成 CIDR。

  2. deny all; 要放最后

    Nginx 按顺序匹配,放错位置会导致规则不符合预期。

  3. 403 Forbidden

    通常是被 deny all; 拦截,检查 CIDR 是否写错。

  4. 反向代理下 IP 不生效

    检查是否配置了 set_real_ip_from、real_ip_header。

  5. 修改后验证并重载

    bash 复制代码
    nginx -t && nginx -s reload

九、CIDR 速查表

CIDR 可用地址数 子网掩码
/24 256 255.255.255.0
/25 128 255.255.255.128
/26 64 255.255.255.192
/27 32 255.255.255.224
/28 16 255.255.255.240
/29 8 255.255.255.248
/30 4 255.255.255.252
/31 2 255.255.255.254
/32 1 255.255.255.255

十、总结

  • Nginx 用 allow / deny 做 IP 访问控制。
  • 不支持 192.168.1.1-192.168.1.124,必须拆成 CIDR。
  • 精确覆盖 .1 ~ .124 可以用多个 CIDR 段。
  • 如果允许整个 192.168.1.x,直接写 192.168.1.0/24。
  • /24 表示 255.255.255.0,范围是 192.168.1.0 ~ 192.168.1.255。
  • 前面有代理时,要配置真实 IP,否则 allow / deny 可能失效。
    参考:https://www.ecjson.com/article/206.html
相关推荐
javaDocker1 小时前
16.5 小时,我打掉了两只「SSL 握手失败」的怪
网络·网络协议·ssl
蜗牛互联网2 小时前
Python接入Gemini 3.8 Flash实现票据视觉抽取与规则校验
java·javascript·网络·人工智能·python
我就是不信2 小时前
TCP 原理详解:从三次握手到拥塞控制
网络·网络协议·tcp/ip
木白CPP2 小时前
USB(一): USB 概述&&介绍
linux·网络·嵌入式硬件
可乐鸡翅yeah_2 小时前
AES‑128 加密 M3U8,IV 初始化向量新手容易踩坑
前端·网络·数据库·ffmpeg·音视频·m3u8在线
吴声子夜歌3 小时前
Nginx应用与运维——Nginx编译及部署(部署)
java·运维·nginx
HEJOO93 小时前
指针与结构体:C 语言进阶核心详解
c语言·开发语言·网络
en.en..3 小时前
IO 多路复用:select、poll、epoll 核心函数解析
网络
我就是不信3 小时前
TCP/IP 网络编程:从入门到实战
网络·网络协议·tcp/ip