如何正确将请求远程地址转发到代理的 Go 服务?

如何正确将请求远程地址转发到代理的 Go 服务?

Request.RemoteAddr我有一个简单的 go 服务,它使用标准检查请求 IP 地址net/http 包

该 go 服务部署在 nginx 后面,具有以下简单的位置配置:

location /api {
    proxy_pass http://localhost:8080;
}

显然,当应用程序部署在代理后面时,Request.RemoteAddr现在返回本地主机/服务器地址(例如::1

我知道我可以定义类似的东西:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

但这样做还需要修改 go 服务(如果服务部署为独立服务器,则需要进行一些额外的安全检查,因为这些标头可能会被客户端修改)

有没有办法将请求远程地址传递给go服务,以便可以返回Request.RemoteAddr


附注:在这种情况下,例如在带有 fastcgi 的 php 中,我可以执行以下操作:

fastcgi_param REMOTE_ADDR $remote_address;

答案1

您已向 Web 服务器提出了正确的配置更改。这些标头是将真实 IP 地址从 Web 服务器传递到应用服务器的方式,无论使用哪种语言。您应该将它们添加到您的serverlocation块中。

然后要在 Go 中接收这些数据,您可以使用如下中间件代理头来自 gorilla/handlers,它将把其中一个标头中的 IP 地址插入到 中Request.RemoteAddr。您可能可以使用其他方法,但编程问题应该在 Stack Overflow 上询问。

答案2

由于相关的 Go 库是开源的,因此很容易检查出没有轻松定制的可能性Request.RemoteAddr

您可以摆脱 nginx,并将您的 go 服务放在 api.example.com(单独的非代理公共 IP 地址)下,而不是 example.com/api。

相关内容