Nginx IP访问控制依赖allow/deny指令的顺序执行,白名单需allow在deny all之前,黑名单默认放行未匹配IP;代理环境下须配置set_real_ip_from并使用$realip_remote_addr判断。

Nginx 实现 IP 访问控制,核心是靠 allow 和 deny 指令配合顺序执行逻辑——先匹配放行规则,再统一拦截其余请求。它不依赖额外模块(默认已启用),但对配置位置、顺序和上下文非常敏感。
只允许指定 IP 访问(白名单)
这是最常见的安全加固方式,比如限制后台、API 或管理接口仅对运维人员开放。
- 规则必须写在
http、server或location块内,不能放在if里(语法合法但无效) -
allow必须写在deny all之前,否则所有请求都会被第一步拦掉 - 推荐写在
location块中,避免误杀静态资源、健康检查路径或 CDN 探针 - 单个 IPv4 写成
allow 203.0.113.42;;IPv4 段用 CIDR,如allow 192.168.5.0/24;;IPv6 要加方括号,如allow [2001:db8::1];
示例(仅允许两个 IP 访问 /admin):
location /admin {
allow 203.0.113.42;
allow 2001:db8::1;
deny all;
# 其他配置,如 proxy_pass 或 root
}拒绝特定 IP 访问(黑名单)
适用于封禁已知恶意 IP、爬虫或异常请求源,操作更轻量,无需兜底 deny all。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 只需逐条写
deny,未匹配的 IP 默认放行 - 若要彻底封禁某 IP 段,可用 CIDR:例如
deny 192.168.99.0/24; - 注意:多个
deny之间无顺序依赖,但建议集中管理,避免遗漏 - 不建议在根 location(
location /)直接用deny all,容易导致整个站点不可访问
示例(禁止两个 IP 访问全站):
location / {
deny 192.168.1.200;
deny 203.0.113.99;
# 其他配置
}处理代理环境(云服务器、CDN、SLB)
如果你用的是阿里云 SLB、腾讯云 CLB 或 Cloudflare,Nginx 日志里看到的 $remote_addr 往往是代理节点 IP,不是真实用户 IP——直接按它做 allow/deny 会完全失效。
- 先确认可信代理地址(如 SLB 内网段
100.64.0.0/10或 CDN 回源 IP 列表) - 在
http块顶部添加:set_real_ip_from 100.64.0.0/10;<br> real_ip_header X-Forwarded-For;
- 之后改用
$realip_remote_addr做判断(geo 或 if 中),或确保 allow/deny 针对的是该变量 - 务必查 access log 中 403 请求的真实来源 IP,验证是否真被拦住,还是因代理头缺失误判
进阶:用 geo + if 管理大量白名单
当允许 IP 超过 10 个,或需跨多个 server 复用、动态更新时,硬编码 allow/deny 易出错且难维护。
- 在
http块顶部定义:geo $is_trusted {<br> default 0;<br> 192.168.10.5 1;<br> 2001:db8::/32 1;<br> include /etc/nginx/ip-whitelist.conf;<br> } - 在 location 中:
if ($is_trusted = 0) { return 403; } -
ip-whitelist.conf可独立编辑、热 reload(配合 include),适合自动化同步 IP 列表 - 注意:
geo匹配的是$remote_addr,若已配置set_real_ip_from,应改用$realip_remote_addr作为 geo 的输入变量
不复杂但容易忽略

















