我已经为上述问题苦苦挣扎了无数小时,并且无法在此站点或任何其他站点上找到有关该行为的解释。可能是我使用了错误的查询。这是我关于堆栈溢出的第一个问题,所以请温柔;)
我正在使用的设置:
我的路由器后面有一个服务器(具有内部 IP 192.168.2.254),并使用端口转发将公共端口 80 和 443 转发到我的(ubuntu)服务器。我可以通过输入其公共 IP(例如 80.81.82.83)或转到 A 记录包含相同公共 IP 的域(例如 example.org)或输入其内部 IP(例如 192.168.2.1)来访问该服务器) 在同一网络上时。我在该服务器上使用 NGINX 作为反向代理,将请求委托给同一服务器上的相应(Web)应用程序。路由器是我从互联网提供商处获得的标准路由器。
我有两个客户端连接到该服务器,客户端 A与服务器位于同一网络(例如 192.168.2.2),而客户端 B不在同一网络上,而是在世界其他任何地方(例如 90.91.92.93)。
当我与客户端 B(即不在同一网络上)连接到我的服务器(使用公共 IP 或域名)并检查客户端 IP(即 $remote_addr)的 NGINX 访问日志时,正确/预期的 IP 地址显示:90.91.92.93。
现在我不明白的部分:
当我使用服务器的内部 IP(192.168.2.1)将客户端 A(与服务器相同的网络)连接到服务器时,访问日志显示来自客户端的正确/预期 IP 地址:192.168.2.2。但是当我使用公共 IP 地址或域名从同一个客户端连接到服务器时,NGINX 访问日志显示来自路由器的 IP 地址:192.168.2.254。
为什么会这样?这样我就无法记录(并采取行动)哪些内部客户端连接到服务器。
这是因为当您连接到公共 IP 地址(或使用公共 IP 地址的公共域名)时,连接从您的客户端 (192.168.2.2) 到路由器 (192.168.2.254),然后路由器 NAT连接到它自己的接口的源地址,即最接近目标的接口的 IP 地址。