gin v1.7.7 版本(2021-11-24 发布),新增了设置信任代理服务器列表。
gin官方的说明:https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies

1.设置信任代理

设置信任代理服务器列表非常简单,只需要一个命令,在 ginskeleton 只需要在配置文件进行配置即可。

  1. router = gin.Default()
  2. router.SetTrustedProxies([]string{"192.168.10.1","192.168.10.2"})

2.为什么要设置信任代理服务器?

与其花费很大的篇幅去解答这个问题,不如我们一起探讨一下设置信任代理影响到哪几个方面,我们如何使用信任代理反而更容易理解该功能。
本篇结尾会附上一篇详细论述最终原因的文章,供大家阅读、深入理解。

2.1 设置信任代理以后是不是其他服务器就无法访问 gin 的接口了?

答案是否定的,gin的接口依然可以被其他机器访问。

2.2 那么设置信任代理以后有什么影响?

由于实际项目可能部署在很复杂的网络环境,对于服务端获取客户端的 ip 相关函数 context.RemoteIP()context.ClientIP()会有影响。

  1. func main() {
  2. router := gin.Default()
  3. // gin v1.7.7 版本(2021-11-24发布)以后,要求设置信任代理,否则就会在输出面板输出如下地址,告诉你去设置:
  4. // https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies
  5. // 设置信任代理的示例代码
  6. router.SetTrustedProxies([]string{"192.168.10.1","192.168.10.2"})
  7. // 如果gin前置没有代理,参数设置为 nil 即可
  8. // r.SetTrustedProxies(nil)
  9. router.GET("/test", func(context *gin.Context) {
  10. // context.RemoteIP() 无代理返回客户端IP,有代理返回代理IP
  11. // context.ClientIP() 无论是否有代理,都会返回客户端IP
  12. // nginx 设置代理需要设置 x-forward*参数
  13. // nginx 代理设置参见 45 行附近:https://www.yuque.com/xiaofensinixidaouxiang/bkfhct/kxddzd
  14. context.ClientIP()
  15. })
  16. router.Run(":20201")
  17. }

2.3 如果go服务前置有nginx代理,但是关闭信任有何影响?

  1. //以下两个函数获取的ip都是代理机器的ip,无法获取客户端真实ip,
  2. // 所以开发者必须按照gin官方要求设置信任项
  3. context.ClientIP()
  4. context.RemoteIP()

3.这里提供一篇文章大家可以参考,复杂网络想要 100% 准确获取客户 ip 的复杂性:

https://www.shangmayuan.com/a/d58685ed2d914838bd311cf5.html