首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过配置 Nginx 实现仅获取可信来源的真实 IP 请求头

通过配置 Nginx 实现仅获取可信来源的真实 IP 请求头

原创
作者头像
Yangsh888
发布2025-04-23 22:09:58
发布2025-04-23 22:09:58
38600
代码可运行
举报
文章被收录于专栏:Yangsh888的专栏Yangsh888的专栏
运行总次数:0
代码可运行

通常情况下,Nginx 直接认为向它发起请求的 IP 为 CLIENT_IP。那么,如果所有的访客都是直接请求这个 Nginx 服务,那将是多么完美的事情,Nginx 将准确地获取每个请求的客户端 IP 地址。

然而,在实际的生产环境中,为了更好的用户体验,我们总会将源站置于内容分发网络(CDN)之后。在这种情况下,请求源站的就不再是真实的客户端了,而是内容分发网络的边缘节点(或者处在边缘节点与源站之间,专门用于收敛回源请求、减轻后端压力的中间源节点)。

根据我们小学 2.5 年级就学过的知识,我们知道,通常情况下,内容分发网络在回源时会携带 X-Forwarded-For 标头,方便后端能够到获取客户端的真实 IP。

「这还不简单吗?我直接将客户端 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 配置文件中这样书写:

代码语言:javascript
代码运行次数:0
运行
复制
# 处理 X-Forwarded-Forreal_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 段,点击右侧下载即可导出为文件,按上方形式书写即可。记得行末的分号。

图片
图片

好啦,又水了一篇文章。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档