Nginx 接入 CDN 后,访问日志里的 $remote_addr 变成一组边缘节点 IP,这是正常现象:与源站建立 TCP 连接的是 CDN,而不是访客浏览器。要记录真实客户端地址,不能简单地从任意请求头取第一个 IP,正确做法是先建立“哪些代理可信”的边界,再让 Nginx 的 real_ip 模块只处理这些可信来源。
先保留两种地址,排障会更清楚
一类是源站实际看到的连接地址,用于判断请求从哪个 CDN 节点回源;另一类是经过可信代理链还原的客户端地址,用于访问分析、限流和安全审计。只保留还原后的地址,会在 CDN 配置错误时失去原始证据。
Nginx 启用 real_ip 后,$remote_addr 通常会被替换成解析后的客户端地址,原始连接地址可通过 $realip_remote_addr 保留。日志格式应同时记录两者,以及当前 CDN 使用的转发头和请求标识。
配置前必须确认三项官方信息
- 回源地址段:从所用 CDN 的官方文档、API 或控制台获取 IPv4 和 IPv6 网段。
- 真实 IP 请求头:不同服务商可能使用不同头字段,必须按当前官方说明选择。
- 代理链规则:确认该头存放单个地址还是地址列表,以及是否需要递归解析。
不要从搜索结果里复制多年未更新的 IP 段,也不能照搬另一家 CDN 的头名称。极跃圈的网址导航可用于查找 DNS、CDN 和 IP 检测工具,但生产配置仍应以当前服务商官方资料为准。
一份便于理解的 Nginx 配置骨架
# 仅示意:请替换成 CDN 官方发布的实际网段
set_real_ip_from 192.0.2.0/24;
set_real_ip_from 2001:db8::/32;
# 替换成 CDN 官方指定的真实客户端 IP 头
real_ip_header CDN-Client-IP;
# 只有官方说明该头包含可信代理链时才按要求启用
real_ip_recursive on;
log_format cdn_main
'$remote_addr real_peer=$realip_remote_addr '
'xff="$http_x_forwarded_for" request="$request" status=$status';
示例中的地址属于文档示例网段,不能直接用于生产。真实配置要包含服务商公布的全部必要地址段,并通过配置管理发布。若 CDN 提供的是单一可信客户端地址头,是否需要 real_ip_recursive 应按照该头的语义决定,不能机械开启。
为什么不能无条件信任 X-Forwarded-For
任何能直接连接源站的客户端,都可以自己发送 X-Forwarded-For。如果 Nginx 对所有来源都信任该头,攻击者就能把日志、应用限流和访问控制中的地址伪造成任意值。更危险的是,应用可能据此误判内网地址或受信用户。
set_real_ip_from 的作用,就是限定只有来自指定 CDN 节点的请求才有资格改写客户端地址。非可信来源携带的相同头字段不应改变 $remote_addr。如果源站还接受负载均衡器、WAF 或内部反向代理回源,应逐层画清代理链,并只添加实际存在的可信网络。
源站最好同时限制只能由 CDN 回源
在云安全组、防火墙或源站前置网关中,只允许 CDN 官方回源网段访问业务端口,可以减少绕过 CDN 直连源站的机会。管理端口不要与 CDN 白名单混在一起,SSH、面板或数据库应使用独立的受控入口。
限制前先确认健康检查、证书验证、监控探针和其他合法回源是否使用不同地址。贸然只留下 CDN 段,可能让监控、自动续期或内部服务中断。变更时应先添加规则并验证,再删除旧来源,保留回滚版本。
正向和反向测试缺一不可
- 通过 CDN 访问自有测试页面,确认日志中的还原地址与测试客户端公网 IP 一致。
- 核对
$realip_remote_addr是否为 CDN 回源节点,确保原始连接证据仍在。 - 从获授权的非 CDN 网络直连源站,主动携带伪造的真实 IP 头,确认 Nginx 不采信。
- 测试 IPv4 和 IPv6 客户端,避免只维护了一类 CDN 地址段。
- 检查应用、WAF、限流和日志分析系统使用的是哪个字段,防止 Nginx 改对了但应用仍读旧头。
这些测试只应针对自己管理或明确获授权的源站。公开扫描他人服务器既不能验证自己的配置,也可能违反规则。
CDN 地址段变化后怎样维护
优先使用服务商提供的公告、API 或机器可读列表,定期拉取后先做格式校验和差异比较。发现新增网段时,先加入可信列表和防火墙并做灰度验证;旧网段只有在官方确认移除、观察期无回源后再删除。自动化更新也应经过审核、配置测试和失败告警,不能下载后直接覆盖生产。
最后还要按隐私策略管理 IP 日志:明确用途、限制查询和导出权限、设置保存期限,不在调试日志中记录密码、令牌或无关正文。真实客户端 IP 配置的目标,是让日志可用且不可伪造,不是尽可能长久地保存每一个访客标识。






