nginx可通过allow/deny指令配合cidr实现ip段黑白名单控制,白名单需先allow后deny all,黑名单则deny在allow all前;支持ipv4/ipv6,推荐geo模块提升可维护性,并注意real_ip_module还原真实ip。

Nginx 本身不直接支持“IP段黑白名单”的图形化配置,但可以通过 allow / deny 指令配合 CIDR 表示法(如 192.168.1.0/24)实现精确的 IP 段访问控制,且规则生效优先级明确、性能高效。
使用 allow/deny 实现 IP 段白名单
只允许指定网段访问,其余全部拒绝。适用于内网管理后台、API 调试接口等场景:
- 在
server或location块中添加规则,顺序很重要:先写allow,最后用deny all拦截其他所有请求 - 支持标准 CIDR 格式,例如:
allow 10.0.0.0/8、allow 172.16.0.0/12、allow 192.168.50.0/24 - 若需允许多个网段,逐行写多个
allow即可,Nginx 会按顺序匹配,遇到第一条匹配即停止
示例配置:
location /admin/ {
allow 192.168.10.0/24;
allow 2001:db8::/32; # 支持 IPv6
deny all;
}使用 allow/deny 实现 IP 段黑名单
禁止特定网段访问,其余默认放行。常用于屏蔽恶意扫描源或已知攻击 IP 段:
- 把
deny规则放在allow all之前(否则会被提前放行) - 可叠加多个
deny,例如屏蔽某 IDC 的整个 C 段:deny 203.203.203.0/24 - 注意:如果 server 块顶层已有
deny all,再加allow才能放开合法流量;黑名单逻辑依赖规则顺序,务必测试验证
示例配置:
location / {
deny 198.51.100.0/24;
deny 203.0.113.64/27;
allow all;
}结合 geo 模块做更灵活的 IP 分组控制
当黑白名单规则较多、需复用或动态调整时,推荐用 geo 指令预定义变量,再在 location 中引用,结构更清晰、维护性更强:
-
geo块必须放在http级别,不能嵌套在 server 内 - 用变量标记 IP 归属(如
$allowed = 1),然后在 location 中用if ($allowed != 1) { return 403; } - 支持 “default” 值设定默认行为,未匹配 IP 自动落入 default 分支
示例:
http {
geo $is_trusted {
default 0;
10.0.0.0/8 1;
172.16.0.0/12 1;
192.168.0.0/16 1;
}
<pre class="brush:php;toolbar:false;">server {
location /api/ {
if ($is_trusted = 0) {
return 403;
}
}
}}
注意事项与常见问题
实际部署中容易踩坑,需特别留意:
- IPv4 和 IPv6 规则需分别配置,
allow 127.0.0.1不影响::1,反之亦然 - 若 Nginx 前有 CDN、反向代理(如 SLB、WAF),
remote_addr是代理 IP,需用real_ip_module+set_real_ip_from还原真实客户端 IP 后,allow/deny 才有效 - 规则修改后必须
nginx -t检查语法,并nginx -s reload生效,不要直接 kill 进程 - 不建议在高并发入口大量使用
if(尤其含正则),geo + return 方式比 if + deny 更高效稳定










