Nginx 的real_ip 模块允许您$remote_addr
根据特定标头字段中发送的值设置变量。它对header有特殊的理解,X-Forwarded-For
能够将header中最右边的untrusted值作为连接IP地址。
我想使用 real_ip 模块来设置$remote_addr
连接 IP 地址。我遇到的问题是我知道从末尾返回多少跳X-Forwarded-For
,但不知道中间代理的 IP 地址。据我了解,这意味着我不能set_real_ip_from
用来指定代理的 IP 地址。
我想要做的是配置 nginx 选择列表中倒数第二个地址作为$remote_addr
. 似乎 real_ip 模块仅在您拥有知道代理 IP 地址的基础架构时才有效。
有没有办法用 real_ip 模块做到这一点?我已经制定了一个基于正则表达式的解决方案,但如果可能的话,我更愿意使用 real_ip 模块。
我不认为这是nginx real_ip_header 的欺骗,而 X-Forwarded-For 似乎是错误的或类似的问题。重申问题:
- 我知道连接IP地址从末端有多少跳。
- 我不知道连接 IP 和我的服务器之间的中间代理的可信 IP 地址,所以我不能使用
set_real_ip_from
.
有关细节的更多详细信息:
我在 Google Cloud HTTP 负载均衡器后面的 Google Cloud 中运行 nginx。Google Cloud使用标X-Forwarded-For
头指示 Google Cloud 网络的入口点。我知道X-Forwarded-For
列表中倒数第二个值是我想要的值,但我不知道最后一个值(代理)的 IP 地址是什么。即使我可以为代理枚举所有 Google Cloud 的地址空间(没有指定 GCLB 仅在 GCP 的地址空间内运行),这也会为任何其他可以在该地址空间内获取服务器的用户打开它。
我最终使用了基于正则表达式的版本。从我的 nginx 配置中:
然后我在我的服务器定义中使用 $connecting_ip :
这不能用它本身来完成,因为正如's description
ngx_http_realip_module
中所指定的那样,只有头字段中的最后一个地址(即您的 GFE,当设置为 时)或最后一个不受信任的地址(即客户端的地址,当设置为) 将匹配到 replace ,因此即使您从字符串操作中获得了前一个代理的地址并将其设置为它,模块也不会更改。real_ip_recursive
off
on
$remote_addr
$http_x_forwarded_for
$set_real_ip_from
$remote_addr
因此,看起来您将不得不
$remote_addr
像您提到的那样使用正则表达式手动重新定义自己,或者使用另一个模块。话虽如此,值得注意的是负载均衡器的 GFE 地址应始终与
35.191.0.0/16
或130.211.0.0/22
CIDRs匹配。