我搜索了 serverfault,但找不到答案。也许我只是不知道正确的关键字,或者这是一个概念上的误解。任何帮助都将不胜感激!
情况:
- 我的本地服务在 NGINX 反向代理后面运行
- 我用的是路由器上的 LAN DNS(Draytek)将对 *.example.com 的本地请求直接解析到我的本地服务器(192.168.1.2)。
即使没有互联网连接,域名也会解析到本地服务器,所有服务都可以访问。这就是我使用 LAN DNS 的原因。到目前为止一切顺利。
现在我想仅允许本地客户端使用NGINX 访问模块和:
allow 192.168.1.0/24;
deny all;
但是 NGINX 只能看到路由器的公网 IP,而看不到客户端的 IP(192.168.1.100),因此所有请求都会被拒绝:
[...] access forbidden by rule, client: 123.123.123.123, server: service.example.de, request: [...]"
我的问题是:
在这种情况下,如何区分 NGINX 上的本地客户端和远程客户端?
答案1
首先是一个假设/条件,即检查你的路由器是否添加了X-转发标题或类似内容(保留实际客户端 IP 的踪迹)
您应该首先通过以下方式解析客户端 IP:ngx_http_realip_module
那里提供的示例配置:
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
set_real_ip_from 2001:0db8::/32;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
这样,用于访问检查的 IP 应该是正确的(实际客户端)。
需要注意的是,在这样的配置下,无法将路由器添加到 X-Forwarded-For 标头自动地使用 proxy_add_x_forwarded_for,因为通过此命令添加的 IP 将被前一个指令更改。该特定案例已在关于堆栈溢出