如何在Traefik中安全还原Cloudflare真实IP?
当然可以!Traefik完全能实现和Nginx http_realip_module一样的效果,核心是用它的ForwardedHeaders中间件来完成信任IP校验和请求头替换,具体配置分两步走:
第一步:配置信任IP与真实IP来源头
首先你需要定义一个中间件,指定信任的Cloudflare IP段,以及要读取的真实IP请求头(也就是CF-Connecting-IP)。
如果是用Traefik的静态配置文件(比如traefik.yml),可以这样写:
http: middlewares: cloudflare-real-ip: forwardedHeaders: # 这里填入Cloudflare的所有出口IP段,只有来自这些IP的请求才会被信任 trustedIPs: - 173.245.48.0/20 - 103.21.244.0/22 - 103.22.200.0/22 - 103.31.4.0/22 - 141.101.64.0/18 - 108.162.192.0/18 - 190.93.240.0/20 - 188.114.96.0/20 - 197.234.240.0/22 - 198.41.128.0/17 - 162.158.0.0/15 - 104.16.0.0/13 - 104.24.0.0/14 - 172.64.0.0/13 - 131.0.72.0/22 # 指定从CF-Connecting-IP头读取用户真实IP remoteIPHeader: "CF-Connecting-IP" # 让Traefik使用上面的trustedIPs作为信任代理列表 trustedProxies: "trustedIPs"
这个配置的作用和Nginx里的这两行完全对应:
set_real_ip_from 173.245.48.0/20; real_ip_header CF-Connecting-IP;
当请求来自trustedIPs里的地址时,Traefik会自动把CF-Connecting-IP的值写入X-Real-Ip和X-Forwarded-For请求头,无需额外手动配置替换规则。
第二步:将中间件绑定到路由/服务
配置好中间件后,你需要把它绑定到对应的路由或者服务上,让Traefik对这些请求应用这个规则。
如果是Docker部署
给你的服务添加Traefik标签,指定使用这个中间件:
labels: - "traefik.http.routers.your-router-name.middlewares=cloudflare-real-ip@file"
(@file表示中间件定义在静态配置文件里,如果是用其他动态配置源比如Kubernetes,改成对应的标识即可)
如果是Kubernetes部署
在IngressRoute资源里引用这个中间件:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRoute metadata: name: your-ingress spec: routes: - match: Host(`your-domain.com`) kind: Rule services: - name: your-service port: 80 middlewares: - name: cloudflare-real-ip
额外注意事项
- 确保你的Cloudflare域名已经开启了代理(橙色云朵图标),否则
CF-Connecting-IP头不会被发送。 - Cloudflare的IP段可能会不定期更新,记得定期去官方渠道获取最新的IP列表来更新
trustedIPs。 - 如果有其他信任的代理IP,也可以添加到
trustedIPs列表里,Traefik会同样处理这些来源的请求。
这样配置完成后,只有来自信任IP的请求,Traefik才会替换X-Real-Ip头为用户的真实IP,和你之前用Nginx的效果完全一致。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

