Buffalo 应用在 Traefik 后需显式启用 middleware.ForwardedHeaders() 并配置信任 IP 网段,否则 RemoteIP() 和 Scheme() 无法获取真实客户端 IP 与 HTTPS 协议;Traefik 侧也必须正确设置 trustedIPs 和 forwardedHeaders,确保每层网关信任链对齐。

Traefik 后的 Buffalo 应用默认拿不到真实协议(https)和客户端 IP(只能拿到 Traefik 容器 IP),必须手动配置信任头并启用中间件解析,否则 buffalo.Request().RemoteIP() 和 buffalo.Request().Scheme() 都会失准。
Buffalo 必须显式启用 X-Forwarded-* 头信任
Buffalo 基于 Go net/http,默认不信任任何 X-Forwarded-For、X-Forwarded-Proto 等头。Traefik 虽然默认会加这些头,但 Buffalo 不解析——它只认原始 TCP 连接对端地址。
- 在
app.go初始化处添加:app.Use(middleware.ForwardedHeaders()) - 该中间件会读取
X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Port,但仅当请求来源 IP 在信任列表中才生效 - 信任 IP 列表必须显式设置,不能留空;否则所有转发头都被忽略
- 常见可信网段示例:
127.0.0.1/32(本地调试)、172.18.0.0/16(Docker 默认桥接网段)、10.0.0.0/8(K8s Calico/Flannel 常见网段)
Traefik 侧必须正确配置 trustedIPs 和 forwardedHeaders
Traefik 若没把前置代理 IP 加入 trustedIPs,它就不会往下游写 X-Forwarded-* 头;即使写了,Buffalo 也会因不信任而丢弃。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 确认 Traefik 配置中
entryPoints.web.forwardedHeaders.trustedIPs包含所有上游可能 IP:Cloudflare 网段、公网直连出口 IP、内网网关 IP、Docker 宿主机 IP(如192.168.1.1) - 若用 Traefik 3 的
http.routers,确保路由未禁用forwardedHeaders:检查是否误设了middlewares覆盖或passHostHeader: false干扰 - Cloudflare 场景下,
trustedIPs必须包含 Cloudflare 官方 IPv4/IPv6 网段(如173.245.48.0/20),否则X-Forwarded-For会被清空或截断 - 多级 Traefik(如 DMZ → 内网)时,每一级都需配置
trustedIPs,且后一级要信任前一级容器网络 CIDR
Buffalo 中获取 IP 和协议的正确方式
启用 ForwardedHeaders 后,不能再依赖 r.RemoteAddr 或 r.Header.Get("X-Real-IP")——Buffalo 已将可信头解析结果注入请求上下文。
- 获取真实客户端 IP:
buffalo.Request().RemoteIP()(自动回退到X-Forwarded-For最左可信 IP) - 获取协议:
buffalo.Request().Scheme()(返回"https"或"http",基于X-Forwarded-Proto) - 避免手撕
X-Forwarded-For字符串:Buffalo 的RemoteIP()已做防伪造校验(只取第一个在trustedIPs范围内的 IP) - 若需原始头用于审计,用
r.Header.Get("X-Forwarded-For"),但注意该值可能被恶意构造,不可直接用于鉴权或限流
常见错误现象与排查点
即使配置看似正确,仍可能因细节失效。典型表现包括:日志里全是 172.18.0.2、Scheme() 永远返回 "http"、蜜罐记录到伪造 IP。
- Traefik 日志中出现
skipping forwarding headers: client IP not trusted→ 检查trustedIPs是否漏掉当前请求源 - Buffalo
RemoteIP()返回空或::1→ 中间件未注册,或ForwardedHeaders()在路由链中位置太靠后 - Cloudflare + Traefik + Buffalo 链路中 IP 变成 Cloudflare 入口 IP 而非用户真实 IP → Traefik 未配置 Cloudflare 网段为
trustedIPs,导致它不敢转发原始X-Forwarded-For - 内网直连(如家庭 WiFi)时 IP 正确,但公网 IPv4 打洞访问时变成宿主机 IP → Traefik
trustedIPs缺少宿主机外网接口所在子网(如192.168.1.0/24)
真正麻烦的不是配置项本身,而是每层网关对“谁可信”的定义必须严格对齐:Traefik 信任谁,Buffalo 就只能信谁;中间漏一环,X-Forwarded-For 就变成不可信字符串,RemoteIP() 就退回容器网络地址。

















