线上 Nginx 配置 IP 白名单,使用allow + deny all做访问控制,仅允许内网 IP196.16.0.2访问服务。
|
1 2 |
allow 196.16.0.2; deny all; |
同一台 Windows 浏览器发起两类请求:
现象:同一个浏览器,页面请求放行,接口请求被拦截,Nginx 日志记录两个完全不同的客户端 IP,业务人员第一反应怀疑浏览器或者 Nginx 缓存异常。
|
1 2 |
196.16.0.2 - - [07/Aug/2026:15:01:25 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36" 1.80.211.195 - - [07/Aug/2026:15:01:26 +0800] "GET /test/get HTTP/1.1" 403 555 "http://196.16.0.37/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36" |
Referer 字段http://196.16.0.37/,说明前端页面部署在196.16.0.37这台 Nginx 服务器。
allow、deny属于 Nginx 的access访问控制模块,读取的是 TCP 四层连接的源 IP 变量$remote_addr,完全忽略 HTTP 请求头,包括X?Forwarded?For。 即使 HTTP 头部携带真实客户端内网 IP,allow/deny也不会读取,仅以 TCP 连接对端 IP 作为判断依据。
这是绝大多数开发容易踩坑的知识点:经过代理转发的请求,$remote_addr是代理服务器出口 IP,而不是浏览器真实 IP。真实客户端 IP 被放在 HTTP 请求头X?Forwarded?For中。
关键点:同一个浏览器,不同请求可以走完全独立的网络链路,Nginx 看到的客户端 IP 可以完全不同,不是浏览器故障。
页面在内网访问,接口走公网代理;四层 TCP 源 IP 发生改变,HTTP 头里的真实 IP 没有被 Nginx 访问控制模块识别,最终出现页面正常,接口 403 的诡异现象。

说明:$remote_addr是 Nginx 拿到的TCP 连接对端 IP,allow/deny 直接读取这个值。 下面全部是会改变服务端看到 IP 的场景,也就是:浏览器真实 IP 不变,但 Nginx 日志里面记录的 IP 变成别的 IP。
客户端→代理 Nginx→后端 Nginx / 服务。后端 Nginx 看到的 IP 是代理服务器 IP。 需要配置proxy_set_header X?Forwarded?For $remote_addr传递真实 IP;但allow/deny仍然看 TCP 源 IP,不读该 header。
云 SLB、硬件负载均衡,流量经过负载均衡转发,后端服务 TCP 对端 IP 变成 LB 节点 IP。
本次故障就是该场景:页面直连内网,接口走公网 SLB,IP 发生变化。
域名接入 CDN 后,用户请求全部打到 CDN 节点,源站 Nginx 看到的 IP 是 CDN 节点 IP,不是用户真实 IP。
公司内网配置 HTTP 代理,浏览器所有请求经过代理服务器出去,服务端看到代理服务器 IP。
现象:本机真实网卡 IP 不变,但是服务端看到的 IP 已经切换。
浏览器配置 Socks5 代理,全部流量经由代理节点转发,服务端记录代理节点 IP。
组建虚拟局域网,访问虚拟网络地址,TCP 源 IP 为虚拟网卡分配 IP,和物理网卡 IP 不一样。
同一个浏览器,不同域名,会走完全不同网络路径,服务端拿到不同源 IP
典型坑:页面用内网域名http://196.16.0.37访问,JS 接口写死公网域名,虽然是同一台浏览器,两套请求 TCP 链路完全不一样,服务端拿到的源 IP 完全不同,就是我们故障案例。
关键点:域名 / DNS 本身不会修改 IP,但是 DNS 解析结果决定流量走哪条网络链路,最终导致服务端看到的 $remote_addr 改变。
大量企业内网出口防火墙做 SNAT,内网机器访问服务器,源 IP 被转换成防火墙网关 IP。
极易出现:同个浏览器,访问同服务器,不同访问路径,日志 IP 不一样。
容器内部访问外部服务,经过 docker0 网桥 SNAT,外部服务看到宿主机 IP,不是容器内部 IP。
1. 电脑多网卡:机器同时有内网网卡、Wi?Fi、4G 上网卡。访问不同目标 IP,系统路由选择不同网卡出口,TCP 源 IP 随之改变。
例如:访问内网服务走内网网卡;访问公网域名走 Wi?Fi 网卡,服务端看到不同 IP。
2. 双栈网络 IPv4/IPv6:服务器支持 IPv6,客户端优先 IPv6 连接,Nginx 日志记录客户端 IPv6 地址,和 IPv4 内网 IP 完全不同。
| 方式 | 是否改变 TCP 源 IP ($remote_addr) | 是否使用 X?Forwarded?For 传递真实 IP | allow/deny 能否拿到真实客户端 IP |
|---|---|---|---|
| 反向代理 / SLB/CDN | ?改变(变成代理 IP) | ?可以带上真实 IP | ?不能,allow/deny 只看 TCP 源 IP,忽略 header |
| VPN、Socks 代理 | ?改变(网关 / 代理节点 IP) | ?一般不带 X?Forwarded?For | ? |
| DNS 域名切换链路 | ?间接改变(路由链路变化) | 看链路中间设备 | ? |
| SNAT 防火墙 NAT | ?改变(网关 IP) | ? | ? |