最稳妥的是使用 ipwhitelist 中间件,但必须显式配置 proxyheader(如 "x-forwarded-for")并确保 nginx/cloudflare 正确透传该头,否则 c.ip() 将返回代理地址导致永远放行或拦截;白名单支持 cidr 和单 ip,不支持域名;应通过 group 绑定路径(如 /admin)而非全局 use;不可手写 if c.ip() 判断,以免绕过中间件生命周期、错误处理与组合能力。

直接用 ipWhitelist 中间件最稳妥,但必须注意它只校验 X-Forwarded-For 或远程地址,且不自动处理代理头——生产环境若走 Nginx/Cloudflare,不显式配置 ProxyHeader 会永远放行或永远拦截。
如何正确配置 ipWhitelist 中间件
这个中间件不是“开箱即用”的安全开关,它默认只读 c.IP(),而真实 IP 在反向代理后通常藏在 X-Forwarded-For 头里。Fiber 不会自动信任该头,必须手动启用解析:
- 调用
ipWhitelist.New()时传入ipWhitelist.Config{ ProxyHeader: "X-Forwarded-For" } - 确保你的反向代理(如 Nginx)已设置
proxy_set_header X-Forwarded-For $remote_addr;,否则头为空 - 白名单列表支持 CIDR 格式,例如
"192.168.1.0/24"或单 IP"203.0.113.42",但不支持域名 - 如果用
app.Use(ipWhitelist.New(...)),它会对所有路由生效;若只想保护/admin/*,应改用app.Group("/admin", ipWhitelist.New(...))
为什么直接写 if c.IP() == "xxx" 不推荐
手写 IP 判断看似简单,但绕过了 Fiber 的中间件生命周期和错误统一处理机制,容易导致:
- 重复逻辑:每个需要白名单的路由都得复制粘贴判断代码
- 遗漏边缘情况:没处理 IPv6 地址、代理链多层转发、
X-Real-IP与X-Forwarded-For冲突 - 错误响应不一致:手写常返回
403硬编码,而ipWhitelist默认返回fiber.ErrForbidden,可被全局错误处理器捕获并格式化 - 无法组合:不能像中间件一样和其他鉴权逻辑(如 JWT)顺序叠加
如何与 JWT 或 Session 鉴权混合使用
白名单常是第一道防线,后面接身份验证。执行顺序决定安全水位:
- 先白名单再 JWT:
app.Get("/api/data", ipWhitelist.New(...), jwt.New(...), handler)→ 只有白名单 IP 才会进入 token 解析,减少无效 JWT 开销 - 白名单 + 路由组嵌套:
admin := app.Group("/admin", ipWhitelist.New(...)); admin.Get("/users", jwt.New(), userHandler)→ /admin 下所有子路由受双重保护 - 注意:不要把
ipWhitelist放在logger后面,否则被拦截请求不会打日志,排查时会“消失”
常见失效原因与调试方法
白名单没生效?大概率是这几处出了问题:
-
c.IP()返回::1或127.0.0.1:说明没配ProxyHeader,或代理没传头 —— 用c.Get("X-Forwarded-For")打印确认 - 白名单写了
"192.168.1.*":CIDR 不支持通配符,必须写成"192.168.1.0/24" - 本地开发用
curl http://localhost:3000测试:回环地址默认不在白名单内,临时加"127.0.0.1"或用AllowLocal配置项 - 中间件注册位置错误:写成
app.Use("/api", ipWhitelist.New(...))是错的 ——ipWhitelist不接受路径前缀,它必须无前缀调用或绑定到 Group
真正麻烦的是多层代理场景:Cloudflare → Nginx → Fiber,此时 X-Forwarded-For 是逗号分隔的链,Fiber 默认只取第一个,但真实客户端 IP 可能在第二个。这时候得自定义 ProxyHeader 解析逻辑,而不是依赖开箱配置。











