You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何通过Nginx Proxy Manager访问内部资源时请求来源显示为公网IP?

为何通过Nginx Proxy Manager访问内部资源时请求来源显示为公网IP?

嘿,我刚好碰到过一模一样的问题!你这情况是典型的**NAT回环(也叫发夹NAT)**在搞鬼。

咱们捋捋逻辑:你在内网用公网域名(比如service3.mydomain.com)访问服务时,内网DNS确实把域名指向了NPM的内网IP,但你的路由器开了端口转发(让外网能访问这些服务)。有些路由器处理这种“内网设备访问公网域名指向内网服务”的请求时,会把请求的源地址转换成路由器自己的公网IP,再转发给内网的NPM。这就导致NPM日志里看到的客户端IP是公网IP,完全不是你的内网设备的RFC1918地址,自然触发了“LAN Only”访问列表的403拦截。

给你几个实用的解决办法,按推荐程度排序:

1. 开启路由器的Hairpin NAT功能(最直接)

大部分现代路由器都支持Hairpin NAT(也叫“NAT反射”),你登录路由器后台,找到端口转发或NAT相关设置,开启这个功能就行。开启后,路由器会正确处理内网设备访问公网域名指向内网服务的请求,不会替换源IP,NPM就能拿到真实的内网客户端IP,访问列表也就正常工作了。

2. 给NPM配置真实IP识别

如果你的路由器没法开启Hairpin NAT,但支持在端口转发时保留客户端IP(或传递X-Forwarded-For头),可以在NPM里这么操作:

  • 打开service3.mydomain.com的代理主机设置,切换到「Advanced」标签页
  • 在「Custom Nginx Configuration」里添加这段配置:
    # 把下面的IP换成你的路由器内网IP或内网子网,比如192.168.1.0/24
    set_real_ip_from 192.168.1.0/24;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    

这段配置告诉NPM:信任来自这个内网范围的请求,并且从X-Forwarded-For头里获取真实的客户端IP,这样访问列表就能识别到你的内网IP了。

3. 用内网专属域名访问服务

你可以给内网服务单独设置一个内网域名,比如service3.local.mydomain.com,然后在内网DNS里把这个域名指向NPM的内网IP,同时在NPM里给这个内网域名配置对应的代理规则和“LAN Only”访问列表。这样内网访问用这个专属域名,流量完全走内网路径,根本不会触发NAT回环,NPM肯定能拿到真实的内网IP。

4. 临时 workaround(不推荐长期用)

如果以上方法暂时没法实施,你可以把你的公网IP加入“LAN Only”访问列表里,这样即使请求源显示为公网IP,也能通过验证。但这个方法有两个坑:一是如果你的公网IP是动态的,IP一变就失效;二是相当于把敏感服务间接开放给了公网,违背了你“LAN Only”的初衷,只能临时救急用。

备注:内容来源于stack exchange,提问作者Matthias

火山引擎 最新活动