Fiber 默认 c.IP() 返回代理 IP 而非真实客户端 IP,因其底层 fasthttp 不解析 X-Forwarded-For 等头;需配置 TrustedProxies 和 ProxyHeader 才能安全获取真实 IP。

Fiber 框架默认拿到的是代理 IP,不是真实客户端 IP。因为大多数生产环境都经过 Nginx、CDN 或云 WAF,X-Forwarded-For 或 X-Real-IP 这类头才是真实来源,而 Fiber 的 c.IP() 默认只读 RemoteAddr——它在有反向代理时就失效了。
为什么 c.IP() 返回的是 127.0.0.1 或代理内网 IP
Fiber 底层用的是 fasthttp,它不解析 HTTP 标准的转发头,默认把连接来源(即 Nginx 的 IP)当“客户端”。即使你在 Nginx 配置了 proxy_set_header X-Real-IP $remote_addr;,Fiber 也不会自动信任或使用它。
必须显式启用 IP 解析,并指定可信代理段,否则会引入伪造风险(比如恶意请求自己带 X-Forwarded-For: 1.1.1.1)。
正确配置 fiber.Config{ProxyHeader: "X-Forwarded-For", TrustedProxies: []string{"127.0.0.1", "10.0.0.0/8", "192.168.0.0/16"}}
这是最安全、最直接的方式。Fiber 提供了原生支持,但需要你在初始化时就声明哪些 IP 是可信代理:
-
ProxyHeader指定从哪个 header 提取原始 IP,常见值为"X-Forwarded-For"或"X-Real-IP"(推荐前者,兼容性更好) -
TrustedProxies必须填你实际部署的反向代理网段,比如 Nginx 在10.10.0.5,那就加"10.10.0.5";如果是整个内网段,写"10.10.0.0/24" - 如果留空或设为
nil,Fiber 会忽略所有X-Forwarded-For,退回到不可靠的RemoteAddr - 注意:CIDR 表达式必须合法,
"10.0.0.0/8"可以,"10.*.*.*"会 panic
示例:
app := fiber.New(fiber.Config{
ProxyHeader: "X-Forwarded-For",
TrustedProxies: []string{"127.0.0.1", "10.0.0.0/8", "172.16.0.0/12"},
})
之后在路由里就能安全调用 c.IP() 获取真实 IP 了。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
没权限改全局配置?用中间件手动提取 X-Forwarded-For
某些场景(比如共享框架实例、测试环境临时调试),你无法修改 fiber.New() 的 config。这时可绕过内置逻辑,自己解析:
- 检查
c.Get("X-Forwarded-For")是否非空 - 按逗号分割(注意空格),取第一个非私有 IP —— 不要直接取首项,因为攻击者可能伪造
X-Forwarded-For: 1.1.1.1, 127.0.0.1 - 用
net.ParseIP()+ip.IsPrivate()过滤掉内网地址 - fallback 到
c.IP()(仅限开发或完全无代理环境)
简版逻辑:
func getRealIP(c *fiber.Ctx) string {
ips := c.Get("X-Forwarded-For")
if ips == "" {
return c.IP()
}
for _, ip := range strings.Split(ips, ",") {
ip = strings.TrimSpace(ip)
if net.ParseIP(ip) != nil && !strings.Contains(ip, ":") && !isPrivateIP(ip) {
return ip
}
}
return c.IP()
}
其中 isPrivateIP 需自行实现,判断是否属于 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 等保留段。
真正容易被忽略的点是:**TrustedProxies 不只是“写对就行”,它必须和你的实际网络拓扑严格一致**。少写一个 CIDR,真实 IP 就拿不到;多写一个公网段,就可能被伪造 IP 绕过。别图省事填 ["0.0.0.0/0"],那等于放弃防护。










