通过配置 NGINX 实现仅获取可信来源的真实 IP 请求头
Language Unavailable
This article is not available in the current language. Showing the Simplified Chinese version instead.
通常情况下,NGINX 直接认为向它发起请求的 IP 为 CLIENT_IP。如果所有的访客都是直接请求这个 NGINX 服务,那将是多么完美的事情,NGINX 将准确地获取每个请求的客户端 IP 地址。
然而,在实际的生产环境中,为了更好地体验,我们总会将源站置于加速网络之后。在这种情况下,请求源站的就不再是真实的客户端了,而是加速网络的边缘节点(或者专门用于回源的中间源节点)。
根据我们小学 2.5 年级学过的知识,我们知道,通常情况下,加速网络在回源时会携带 X-Forwarded-For 标头。「这还不简单吗?我直接将客户端 IP 用 XFF 标头内容替代就好了。」你心想。殊不知,你的大意带来了严重的安全风险。在 N+2.5 天后,当你审计日志时,你将对着列表中的一大串 IP 地址为 127.0.0.1 的恶意请求感到无从下手。
为什么我们需要仅从可信来源获取真实 IP?
我们知道,请求头中的内容并非完全不可伪造的。事实上,我们完全可以伪造一个值为 127.0.0.1 的 XFF 头,并直接请求源服务器。如果源服务器只是简单地处理 XFF 与真实 IP 的映射,它当然会合理地认为这个请求的真实 IP 是 127.0.0.1。
当然,这类问题可以通过网络层的配置解决——只放行可信 IP 入站即可。今天我们仅探讨从 NGINX 软件层面进行处理。
如何做?
通过 set_real_ip_from 指定可信来源。
比如,如果你正在使用腾讯云 CDN,那么你需要在 NGINX 配置文件中这样书写:
# 处理 X-Forwarded-For
real_ip_header X-Forwarded-For;
# 指定多个可信的代理服务器 IP 地址范围
# 腾讯云
set_real_ip_from 101.71.hidden.0/24;
...
set_real_ip_from 43.140.hidden.0/24;

在腾讯云 CDN 控制面板 回源节点查询 功能中可以查询到特定加速域名的回源 IP 段,点击右侧下载即可导出为文件,按上方形式书写即可。记得行末的分号。
好啦,又水了一篇文章。
Comments
Comments are powered by GitHub Discussions. Joining the discussion is subject to GitHub’s privacy statement. GitHub Privacy Statement
Loading comments
The discussion is provided by giscus and should be ready in a moment.