nginx ip白名单生效且兼容cdn回源的关键是:启用real_ip_module还原真实用户ip,并基于$realip_remote_addr配置白名单,同时显式放行cdn回源ip段、管理ip及健康检查ip。

要让 Nginx 的 IP 白名单生效,同时不影响 CDN 回源请求,关键不是“绕过白名单”,而是**让白名单规则基于真实用户 IP 判断,同时主动放行 CDN 节点的回源 IP**。否则,默认只认 `$remote_addr`(即 CDN 节点 IP),所有真实用户都会被拒,CDN 也拿不到内容,导致全站 403 或空白。
必须还原真实客户端 IP
CDN 会把用户真实 IP 写在请求头(如 X-Forwarded-For 或 X-Real-IP),但 Nginx 默认不信任这些头。需启用 real_ip_module 并明确指定可信代理段:
- 在
http块顶部添加可信源(以 Cloudflare 为例):set_real_ip_from 173.245.48.0/20;<br>set_real_ip_from 103.21.244.0/22;<br>real_ip_header X-Forwarded-For;<br>real_ip_recursive on;
- 阿里云、腾讯云、华为云等 CDN 需查官方文档获取其回源 IP 段,逐条写入
set_real_ip_from - 配置后,
$realip_remote_addr才代表真实用户 IP,白名单应基于它判断(而非默认的$remote_addr)
白名单规则要兼容 CDN 回源
不能只写 allow 192.168.1.100; deny all;——这会把 CDN 回源请求一起拦掉。正确做法是:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 先允许 CDN 回源 IP 段(用
allow显式放行) - 再允许你自己的管理 IP(如办公网段、堡垒机 IP)
- 最后加
deny all; - 所有规则必须放在
location块内(例如只保护/admin),避免影响静态资源或健康检查路径
推荐用 geo + if 实现更清晰的逻辑
当规则较多或需复用时,geo 指令比堆砌 allow/deny 更可靠,且天然支持变量判断:
- 在
http块定义:geo $is_trusted {<br> default 0;<br> 192.168.10.0/24 1;<br> 127.0.0.1 1;<br> # CDN 回源段(示例)<br> 173.245.48.0/20 1;<br> 103.21.244.0/22 1;<br>} - 在目标
location中:if ($is_trusted = 0) { return 403; } - 注意:仍需配合
set_real_ip_from,且geo默认匹配$remote_addr;若已启用 real_ip,应改用$realip_remote_addr作为 geo 的输入变量
别忘了健康检查和监控探针
负载均衡器、K8s Ingress、云 SLB 等常从固定内网 IP(如 100.64.0.1、192.168.0.0/16)发起 /healthz 请求。若未加入白名单,会导致服务被误判为异常下线:
- 检查你的基础设施健康检查配置,确认探针来源 IP
- 将这些 IP 或网段一并加入
allow列表或geo变量中 - 上线前用
curl -H "X-Forwarded-For: 203.0.113.5" http://your-site/admin模拟 CDN 请求测试










