我如何在Docker中使用NGINX获得远程IP /客户端IP ??同样使用Laravel



我正在运行NGINX作为Docker包的一部分。它既是一个web服务器,也是一个反向代理,容器中捆绑了PHP。前端web应用程序是用Laravel构建的。在某些情况下,我想获得客户端的IP地址,在某些情况下,这似乎有点问题。这不是针对代理的,而是针对使用NGINX和PHP服务的web应用程序的。

在我家里的开发系统上,当我从本地机器连接到浏览器时,我得到了docker网络的IP。

$_SERVER['SERVER_ADDR'] = 172.19.0.10
$_SERVER['REMOTE_ADDR'] = 172.19.0.1

在Digital Ocean Dev服务器上有:

$_SERVER['SERVER_ADDR'] 172.27.0.16
$_SERVER['REMOTE_ADDR'] 213.225.x.xx, which is Austria, my IP

,在其他地方的生产服务器上,我认为它有:

$_SERVER['SERVER_ADDR'] ???
$_SERVER['REMOTE_ADDR'] = The WAN IP for the office where the server is installed.

这不是客户端IP,而是办公室本身的WAN地址。

我想那个办公室的服务器在WatchGuard或Fortigate路由器/防火墙后面。

所以,Digital Ocean Dev服务器实际上是"ok"的。我可以访问我需要的东西,但是办公室设置可能没有设置将客户端ip转发到在他们的互联网上运行的服务器?

目前还不是很关键,但如果能在所有情况下捕获公共客户端IP就好了。

我可以对日志文件等做更多的调查,但我很确定我必须:

  1. 可能在我的NGINX配置
  2. 中配置一些东西

  1. 让某人配置防火墙通过客户端IP,因为它目前似乎没有这样做,或者我没有捕获它正在发送的内容。

办公室的nginx代理可以配置为使用proxy_set_header指令传递客户端的IP地址。

nginx反向代理文档在这里展示了一个例子:

location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}

在设置反向代理proxy_pass指令的配置块中,添加proxy_set_header X-Real-IP $remote_addr;告诉代理注入一个新的HTTP头X-Real-IP,其中包含客户端的IP地址。在Laravel应用中,你可以使用这个来获取实际的客户端IP。在您的应用程序中,请确保仅在可信任的情况下才使用此标头1

这是必要的,因为代理正在从自己的网络地址通过代理服务器接收并重新发送客户端的请求。应用程序可以获得被代理请求的原始客户端IP的唯一方法是,如果该IP地址在标头中由代理传递。

1<一口>https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For security_and_privacy_concerns

最新更新