Traefik的whitelistSourceRange配置疑问:设公网IP后无法访问容器
嘿,这个问题我之前排查过类似的,核心原因是Traefik没拿到你的真实公网IP,反而把Docker网络网关的IP当成了请求源,所以你的白名单规则匹配不上。
为什么会出现10.255.0.2这个IP?
这个10.255.0.2是Docker网络的网关IP(大概率是Traefik所在的overlay或bridge网络的网关)。当你的请求从公网到达Traefik时,实际上是先经过Docker的网络转发层,Traefik如果没正确配置转发头处理,就会把转发请求的网关IP当作客户端源IP,而不是你的真实公网IP,自然匹配不上你设置的白名单。
具体解决步骤
1. 配置Traefik信任代理并解析真实IP
从日志时间和标签格式来看,你用的是Traefik v1,需要让Traefik信任Docker内部的IP段,并且从X-Forwarded-For头里提取真实客户端IP:
- 如果是用命令行启动Traefik,添加参数:
--entryPoints.http.forwardedHeaders.trustedIPs=你的公网IP/32,10.255.0.0/16 - 如果是用toml配置文件,添加:
[entryPoints.http.forwardedHeaders] trustedIPs = ["你的公网IP/32", "10.255.0.0/16"]
这里把10.255.0.0/16加入信任IP段,是让Traefik接受来自这个Docker内部网段的转发请求,从而正确解析X-Forwarded-For里的真实IP。
2. 确认白名单标签格式正确
确保你的Docker容器标签是正确的单个IP格式,比如:
traefik.frontend.whitelistSourceRange=123.45.67.89/32
一定要加/32,表示匹配单个公网IP,不加的话可能会被当成IP段解析出错。
3. 排查上层代理(如果有的话)
如果你还有其他上层代理(比如云服务商的负载均衡、Nginx反向代理),要确保这些代理正确传递了X-Forwarded-For和X-Forwarded-Proto头,同时把上层代理的IP段也加入Traefik的trustedIPs里,这样Traefik才会信任这些代理发来的转发头。
验证方法
修改配置后重启Traefik,再次尝试访问容器,查看Traefik日志里的source-IP是否变成你的公网IP。如果还是有问题,可以临时去掉白名单标签,然后在你的容器里打印请求头(比如用curl -I或者查看应用的访问日志),确认X-Forwarded-For头里是否包含你的真实公网IP,以此判断转发头是否正确传递。
内容的提问来源于stack exchange,提问作者Ppito

