Nginx接入CDN后日志全是节点IP,怎样记录真实客户端地址

只信任CDN地址段传来的真实IP头
发布于 更新于
9

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 段,可能让监控、自动续期或内部服务中断。变更时应先添加规则并验证,再删除旧来源,保留回滚版本。

正向和反向测试缺一不可

  1. 通过 CDN 访问自有测试页面,确认日志中的还原地址与测试客户端公网 IP 一致。
  2. 核对 $realip_remote_addr 是否为 CDN 回源节点,确保原始连接证据仍在。
  3. 从获授权的非 CDN 网络直连源站,主动携带伪造的真实 IP 头,确认 Nginx 不采信。
  4. 测试 IPv4 和 IPv6 客户端,避免只维护了一类 CDN 地址段。
  5. 检查应用、WAF、限流和日志分析系统使用的是哪个字段,防止 Nginx 改对了但应用仍读旧头。

这些测试只应针对自己管理或明确获授权的源站。公开扫描他人服务器既不能验证自己的配置,也可能违反规则。

CDN 地址段变化后怎样维护

优先使用服务商提供的公告、API 或机器可读列表,定期拉取后先做格式校验和差异比较。发现新增网段时,先加入可信列表和防火墙并做灰度验证;旧网段只有在官方确认移除、观察期无回源后再删除。自动化更新也应经过审核、配置测试和失败告警,不能下载后直接覆盖生产。

最后还要按隐私策略管理 IP 日志:明确用途、限制查询和导出权限、设置保存期限,不在调试日志中记录密码、令牌或无关正文。真实客户端 IP 配置的目标,是让日志可用且不可伪造,不是尽可能长久地保存每一个访客标识。

常见问题(FAQ)

为什么日志全是CDN IP?
TCP连接由CDN边缘发起,Nginx看到的是节点地址。
能直接记录X-Forwarded-For第一个值吗?
不能无条件信任,外部可伪造。
CDN地址段变化怎么办?
按官方列表自动或定期更新,并监控失败。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600