问题场景
当使用 CDN + Traefik + Docker 架构时,应用获取到的是 CDN 节点 IP 而不是用户真实 IP。
用户真实IP → CDN → Traefik → Docker容器
(58.32.x.x) (117.85.x.x) (显示117.85.x.x)
原因
CDN 会在 X-Forwarded-For 头中设置用户真实 IP,但 Traefik 默认会追加自己看到的 IP(CDN 节点 IP),导致:
X-Forwarded-For: 58.32.x.x, 117.85.x.x
如果应用取最后一个 IP,就会拿到 CDN 节点 IP。
解决方案
在 Traefik 配置中添加 forwardedHeaders.trustedIPs,信任上游代理:
entryPoints:
web:
address: ':80'
forwardedHeaders:
trustedIPs:
- "0.0.0.0/0"
- "::/0"
websecure:
address: ':443'
forwardedHeaders:
trustedIPs:
- "0.0.0.0/0"
- "::/0"
配置说明
0.0.0.0/0- 信任所有 IPv4 地址::/0- 信任所有 IPv6 地址
配置后 Traefik 会直接使用 CDN 传递的 X-Forwarded-For,不再追加节点 IP。
安全提示
如果知道 CDN 的出口 IP 段,建议只信任特定 IP 而非全部:
forwardedHeaders:
trustedIPs:
- "1.1.1.0/24" # CDN IP 段
- "2.2.2.0/24"
验证
修改配置后重启 Traefik,检查应用日志中的 IP 是否为用户真实 IP。