繁体   English   中英

如何在 Docker 中使用 NGINX 获取远程 IP / 客户端 IP? 同时使用 Laravel

[英]How can I get the remote IP / Client IP using NGINX in Docker ?? Also using Laravel

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

在我家里的开发系统上,当从我的本地机器连接浏览器时,我得到了 docker.network 的 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 转发到在其 inte.net 上运行的服务器?

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

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

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

和/或

  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 header, X-Real-IP ,以及客户端的 IP 地址。 在 Laravel 应用程序中,您可以使用它来获取实际的客户端 IP。在您的应用程序中,请确保仅在可信任时使用此 header 1

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

1 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For#security_and_privacy_concerns

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM