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

Nginx HTTP基础认证配置:内部IP白名单不生效问题排查

解决Nginx HTTP基础认证内部IP白名单不生效的问题

你遇到的核心问题是Nginx没拿到你的真实内部/VPN IP——因为流量是通过公网网关(比如路由器、防火墙)转发到服务器的,Nginx识别到的是网关的公网IP,而非你客户端的内部IP,所以配置的192.168.1.0/2410.8.0.0/24白名单自然不会触发。另外你配置里还有个小笔误:allow 192.168.1.1/24应该改成192.168.1.0/24,这才是正确的网段CIDR写法。

下面是具体的解决步骤:

1. 确认Nginx是否启用了realip模块

首先要确保你的Nginx安装了http_realip_module,这个模块用来从请求头里还原真实客户端IP。执行命令检查:

nginx -V 2>&1 | grep -- '--with-http_realip_module'

如果输出包含该参数,说明模块已启用;如果没有,你需要重新编译Nginx添加这个模块,或者通过CentOS的epel源安装自带该模块的Nginx包。

2. 修改Nginx配置,获取真实客户端IP

在你的HTTPS server块中添加realip相关配置,告诉Nginx哪些是可信的代理服务器(比如你的网关内部IP、VPN服务器IP),并指定从哪个请求头提取真实IP:

server {
 listen 443 ssl;
 server_name mydomain.com;

 # 添加realip配置,替换为你的可信代理IP
 set_real_ip_from 192.168.1.1; # 你的网关内部IP
 set_real_ip_from 10.8.0.1;    # 你的VPN服务器IP
 real_ip_header X-Forwarded-For;
 real_ip_recursive on;

 # 原有配置...
 access_log /var/log/nginx/myapplication3.access.log;
 error_log /var/log/nginx/myapplication3-errors.log;
 ssl on;
 # ...

 # 修正CIDR写法,保持认证与白名单规则
 satisfy any;
 allow 127.0.0.1;
 allow 192.168.1.0/24;
 allow 10.8.0.0/24;
 deny all;
 auth_basic "Authentication required";
 auth_basic_user_file /etc/httpd/.htpasswd;

 location / {
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_pass http://myapplication-3.3.2;
 }
}
  • set_real_ip_from:指定可信代理IP,Nginx会信任这些IP发送的请求头信息
  • real_ip_header X-Forwarded-For:告诉Nginx从X-Forwarded-For头提取真实客户端IP
  • real_ip_recursive on:如果请求头里有多个IP,会递归找到最后一个非可信代理的IP(也就是你的真实客户端IP)

3. 推荐:将规则移至location块内

allow/deny和认证规则放到location /块中,避免和其他location规则冲突:

location / {
 satisfy any;
 allow 127.0.0.1;
 allow 192.168.1.0/24;
 allow 10.8.0.0/24;
 deny all;
 auth_basic "Authentication required";
 auth_basic_user_file /etc/httpd/.htpasswd;

 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_pass http://myapplication-3.3.2;
}

4. 验证配置并重启Nginx

先检查配置是否合法:

nginx -t

如果没有报错,重启Nginx生效:

systemctl restart nginx

为什么公网IP能生效?

因为Nginx直接拿到的是网关转发过来的公网IP,所以allow 你的公网IP能匹配到;而内部IP经过了NAT转换,Nginx默认看不到,必须通过realip模块还原真实IP才能触发白名单规则。

现在用内部IP或VPN IP访问时,Nginx就能正确识别你的真实IP,白名单规则就会生效了。

内容的提问来源于stack exchange,提问作者shaneoh

火山引擎 最新活动