Traefik 获取真实用户 IP 配置

问题场景

当使用 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。