排查nginx ip访问控制需重点验证cidr语义正确性、真实客户端ip还原、allow/deny顺序与作用域,以及实测验证;如192.168.1.100/24实际匹配整个子网,单ip应写为/32。

排查 Nginx IP 访问控制中 CIDR 掩码书写错误,关键不是看语法能不能通过,而是确认它表达的网段是否真如你所想——常见问题不是 Nginx 拒绝了不该拒的,就是放过了本该拦的。
检查 CIDR 是否符合网络地址规范
Nginx 不校验语义,只做位运算。写 192.168.1.100/24 看似直观,但实际会被归一化为 192.168.1.0/24,等效于整个 C 类子网(256 个地址)。如果你只想放行这一个 IP,必须写成 192.168.1.100/32。
- /32 表示单主机,/24 表示前 24 位固定、后 8 位可变,对应掩码 255.255.255.0
- 私有网段要写标准网络地址:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16,而非 10.0.0.5/8 或 192.168.1.1/24
- 用
ipcalc 192.168.1.100/24或在线 CIDR 计算器验证网络地址和广播地址,确认覆盖范围是否合理
验证真实客户端 IP 是否被正确还原
如果请求经过 CDN、负载均衡或反向代理,$remote_addr 默认是上一级代理的 IP,不是用户真实 IP。此时 allow/deny 对的是代理地址,规则完全失效。
- 确认已启用
real_ip_module,并正确配置set_real_ip_from和real_ip_header - 在日志中加
$http_x_forwarded_for和$realip_remote_addr字段,比对两者是否一致 - 未还原真实 IP 时,即使 CIDR 写得再准,匹配对象也是错的
确认 allow/deny 的顺序与作用域是否生效
Nginx 的访问控制按配置自上而下逐条匹配,且只在当前作用域(http/server/location)内有效。掩码错误常导致逻辑倒置。
- deny all 应放在所有 allow 之后,否则会提前拦截合法流量
- 嵌套 location 中的规则不自动继承:外层
allow 10.0.0.0/8已放行全部,内层deny 10.0.0.5就不会触发 - 用
error_log /var/log/nginx/error.log debug;开启调试日志(需编译含 --with-debug),搜索access phase相关行,看实际命中哪条规则
用 curl 模拟不同来源 IP 验证行为
不要只靠浏览器测试。用 curl -H "X-Forwarded-For: 192.168.1.100" http://your-site/admin 模拟内网请求,再换 IP 测试拒绝逻辑。
- 配合
nginx -t只能检查语法,不能替代实测 - 若使用云 WAF 或四层代理,注意它们可能改写或清除 X-Forwarded-For,需在最外层设备确认头信息传递链路
- 测试时关闭浏览器缓存,避免 304 响应干扰判断











