接入Cloudflare后Nginx和Django获取用户真实IP的办法

news2025/2/25 22:08:50

可以用Nginx的real_ip的相关命令来实现这个需求。

01-real_ip命令集详解

real_ip命令的使用分为两个步骤:

01-1-设置从哪些代理IP获取真实IP

第1个步骤:通过set_real_ip_from命令设置从哪些代理IP请求获取真实的IP,比如下面的命令:

        set_real_ip_from 103.21.244.0/22;
        set_real_ip_from 103.22.200.0/22;
        set_real_ip_from 103.31.4.0/22;
        set_real_ip_from 104.16.0.0/12;
        set_real_ip_from 108.162.192.0/18;
        set_real_ip_from 131.0.72.0/22;
        set_real_ip_from 141.101.64.0/18;
        set_real_ip_from 162.158.0.0/15;
        set_real_ip_from 172.64.0.0/13;
        set_real_ip_from 173.245.48.0/20;
        set_real_ip_from 188.114.96.0/20;
        set_real_ip_from 190.93.240.0/20;
        set_real_ip_from 197.234.240.0/22;
        set_real_ip_from 198.41.128.0/17;

上面这个些IP就是chatgpt给出的所有的Cloudflare的IP。

我通过另一个网站,还获取到了一份含cloudflare的IPV6地址的set_real_ip_from命令集,如下:
https://cloud.tencent.com/developer/article/2203939?areaSource=102001.15&traceId=BtaYzKMt3Qz7kwpj2CLdo

#cfip4
set_real_ip_from 103.21.244.0/22; #cfipv4
set_real_ip_from 103.22.200.0/22; #cfipv4
set_real_ip_from 103.31.4.0/22; #cfipv4
set_real_ip_from 104.16.0.0/12; #cfipv4
set_real_ip_from 108.162.192.0/18; #cfipv4
set_real_ip_from 131.0.72.0/22; #cfipv4
set_real_ip_from 141.101.64.0/18; #cfipv4
set_real_ip_from 162.158.0.0/15; #cfipv4
set_real_ip_from 172.64.0.0/13; #cfipv4
set_real_ip_from 173.245.48.0/20; #cfipv4
set_real_ip_from 188.114.96.0/20; #cfipv4
set_real_ip_from 190.93.240.0/20; #cfipv4
set_real_ip_from 197.234.240.0/22; #cfipv4
set_real_ip_from 198.41.128.0/17; #cfipv4
#cfip6
set_real_ip_from 2400:cb00::/32; #cfipv6
set_real_ip_from 2405:8100::/32; #cfipv6
set_real_ip_from 2405:b500::/32; #cfipv6
set_real_ip_from 2606:4700::/32; #cfipv6
set_real_ip_from 2803:f800::/32; #cfipv6
set_real_ip_from 2c0f:f248::/32; #cfipv6
set_real_ip_from 2a06:98c0::/29; #cfipv6

如果想设置从所有的代理IP获取客户端的真实IP,则可以用下面的命令:

set_real_ip_from 0.0.0.0/0;

01-2-设置从哪个头信息获取真实IP

第2个步骤:使用命令real_ip_header告诉Nignx从哪个头信息中获取真实IP。
在这个步骤里面,常见的下面两条命令:

        real_ip_header CF-Connecting-IP;
        real_ip_header X-Forwarded-For;

两条命令任选一条,但是推荐用第1个,即CF-Connecting-IP,chatgpt对此的解释如下:

在一般情况下,CF-Connecting-IP 更为推荐,因为它是专门为 Cloudflare 设计的头信息,能够提供更可靠的真实 IP地址。

关于CF-Connecting-IP,cloudflare的官方文档有说明:
https://developers.cloudflare.com/fundamentals/reference/http-request-headers/
在这里插入图片描述

相关文章也说明了这一点:
链接:https://www.kchuhai.com/report/view-19321.html
在这里插入图片描述

其实按照Cloudflare的设计,最好的是从True-Client-IP Header中获取客户端的真实IP,但是如果要使用这个头,是需要付费的。
官方文档:https://developers.cloudflare.com/network/true-client-ip-header/
在这里插入图片描述

02-理解以上信息后,得出我觉得不错的Nginx配置代码

    location / {
        # 设置 Cloudflare 的 IP 地址范围,因为只有下面这些IP才来自cloudflare
		#cfip4
		set_real_ip_from 103.21.244.0/22; #cfipv4
		set_real_ip_from 103.22.200.0/22; #cfipv4
		set_real_ip_from 103.31.4.0/22; #cfipv4
		set_real_ip_from 104.16.0.0/12; #cfipv4
		set_real_ip_from 108.162.192.0/18; #cfipv4
		set_real_ip_from 131.0.72.0/22; #cfipv4
		set_real_ip_from 141.101.64.0/18; #cfipv4
		set_real_ip_from 162.158.0.0/15; #cfipv4
		set_real_ip_from 172.64.0.0/13; #cfipv4
		set_real_ip_from 173.245.48.0/20; #cfipv4
		set_real_ip_from 188.114.96.0/20; #cfipv4
		set_real_ip_from 190.93.240.0/20; #cfipv4
		set_real_ip_from 197.234.240.0/22; #cfipv4
		set_real_ip_from 198.41.128.0/17; #cfipv4
		#cfip6
		set_real_ip_from 2400:cb00::/32; #cfipv6
		set_real_ip_from 2405:8100::/32; #cfipv6
		set_real_ip_from 2405:b500::/32; #cfipv6
		set_real_ip_from 2606:4700::/32; #cfipv6
		set_real_ip_from 2803:f800::/32; #cfipv6
		set_real_ip_from 2c0f:f248::/32; #cfipv6
		set_real_ip_from 2a06:98c0::/29; #cfipv6
		
		# 从CF-Connecting-IP头信息中获取真实 IP 地址
        real_ip_header CF-Connecting-IP;

        # 其他 Nginx 配置...
        # 这里可以配置代理到您的后端服务器
        proxy_pass http://127.0.0.1:41854;
    }

03-Django中如何获取真实IP?

在 Nginx 中使用 real_ip_header CF-Connecting-IP; 指令,表示您希望从 Cloudflare 的 CF-Connecting-IP 头中获取真实 IP 地址。在 Django 中,您可以通过 request 对象的 META 属性来获取这个真实 IP 地址。

下面是一个示例视图函数,演示如何在 Django 中获取真实 IP 地址:

# views.py

from django.http import HttpResponse

def get_real_ip(request):
    # 获取 CF-Connecting-IP 头信息
    cf_connecting_ip = request.META.get('HTTP_CF_CONNECTING_IP')

    # 提取真实 IP 地址
    if cf_connecting_ip:
        real_ip = cf_connecting_ip
    else:
        # 如果 CF-Connecting-IP 头不存在,直接使用 REMOTE_ADDR
        real_ip = request.META.get('REMOTE_ADDR')

    return HttpResponse(f'Real IP: {real_ip}')

在这个例子中,request.META 是包含请求元数据的字典,HTTP_CF_CONNECTING_IP 键对应于 Cloudflare 的 CF-Connecting-IP 头。如果这个头存在,我们就直接使用它的值作为真实 IP 地址。如果头不存在,我们就回退到使用 REMOTE_ADDR

确保在您的 Nginx 配置中配置了正确的 real_ip_header 指令,以确保它与 Cloudflare 的头信息一致。这样,Django 中的视图就能够正确地获取来自 Cloudflare 的真实 IP 地址了。

04-提问:在使用了命令real_ip_header后,在反向代理时还需要用命令proxy_set_header不?

通过命令real_ip_header设置的header值在通过命令:proxy_pass http://127.0.0.1:41854;进行反向代理也会传递给Django是吧,而无需再用proxy_set_header进行设置是吧?

答:是的。当您使用 real_ip_header 指令设置了真实 IP 地址的头信息后,Nginx 会将这个头信息传递给后端服务器,而无需额外的 proxy_set_header 设置。在您的配置中,您已经使用了以下指令:

real_ip_header CF-Connecting-IP;

这告诉 Nginx 使用 Cloudflare 的 CF-Connecting-IP 头作为真实 IP 地址。接着,通过 proxy_pass http://127.0.0.1:41854; 指令,Nginx 会将请求转发到 Django 的后端服务器,同时将 CF-Connecting-IP 头传递给 Django。

因此,您无需额外的 proxy_set_header 来设置真实 IP 地址头信息,因为 real_ip_header 已经处理了这个任务。在 Django 中,您可以通过 request.META.get('HTTP_CF_CONNECTING_IP') 来访问这个头信息,以获取真实的客户端 IP 地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1347505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年全球软件质量效能大会(QECon北京站2022)-核心PPT资料下载

一、峰会简介 当前,新一轮科技革命和产业变革正在重塑全球经济格局,以云计算为代表的新一代信息技术创新活跃,与实体经济深度融合,推动泛在连接、数据驱动、智能引领的数字经济新形式孕育而生。 新兴技术的出现给测试乃至整个软…

探索 Vue 异步组件的世界:解锁高效开发的秘密(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

JavaScript 基础通关

快速熟悉 JavaScript 的基础语法,比较高级的比如事件放在后面的笔记中。 JavaScript 1. JavaScript 介绍 1.1 JavaScript 基本介绍 JavaScript 是一门运行在客户端(浏览器)的编程语言,实现人机交互的效果。实现网页特效、表单验…

SpringBoot学习(一)

注:此为笔者学习狂神说SpringBoot的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!! Spring Boot 是一种基于 Spring 框架的开发模式,旨在简化 Spring 应用程序的创…

学生管理系统(vue + springboot)

学生管理系统(vuespringboot)资源-CSDN文库 项目介绍 这是一个采用前后端分离开发的项目,前端采用 Vue 开发、后端采用 Spring boot Mybatis 开发。 项目部署 ⭐️如果你有 docker 的话,直接 docker compose up 即可启动&#…

NullByte

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-29 09:23 CST Nmap scan report for 192.168.1.1 Host is up (0.00038s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for …

使用软件解决T490笔记本57摄氏度温度墙的问题

项目场景: 提示:这里简述项目相关背景: 客户使用LenovoT490跑GQRX SDR,接入SDR在5MHz采样率下,机器卡顿。这对于10代i7CPU显然是不正常的。后续发现上网页也卡,卸载杀毒、重装系统、BIOS电源设置、系统最…

uniapp的css样式图片大小截图展示

目录 截取图片前截取图片后第一种方式&#xff1a;代码第二种方式&#xff1a;代码最后 截取图片前 截取图片后 第一种方式&#xff1a;代码 <view class"swiper-box-img"><image class"swiper-box-img-img" :src"item.file_path" mod…

10TB海量JSON数据从OSS迁移至MaxCompute

前提条件 开通MaxCompute。 在DataWorks上完成创建业务流程&#xff0c;本例使用DataWorks简单模式。详情请参见创建业务流程。 将JSON文件重命名为后缀为.txt的文件&#xff0c;并上传至OSS。本文中OSS Bucket地域为华东2&#xff08;上海&#xff09;。示例文件如下。 {&qu…

【后端】Docker学习笔记

文章目录 Docker一、Docker安装&#xff08;Linux&#xff09;二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台&#xff0c;主要基于Go语言构建&#xff0c;它使开发者能够将应用程序及其依赖项打包到一个轻…

Linux:apache优化(1)—— 长链接/保持连接

系统:CentOS 7.9 apache版本为&#xff1a;2.4.25 需要使用源码包进行安装才能够使用这些扩展模块 在使用这些扩展模块前要先下载zlib-devel 安装--enable-deflate选项需要的网页压缩传输的软件包 yum -y install zlib-devel 在配置编译安装时需要使用扩展配置 ./config…

【瞎折腾/3D】无父物体下物体的旋转与移动

目录 说在前面移动World SpaceLocal Space 旋转World SpaceLocal Space 代码 说在前面 测试环境&#xff1a;Microsoft Edge 120.0.2210.91three.js版本&#xff1a;0.160.0其他&#xff1a;本篇文章中只探讨了无父对象下的移动与旋转&#xff0c;有父对象的情况将在下篇文章中…

2024-01-01 事业-代号s-科特勒《营销管理》-分析

摘要: 2024-01-01 事业-代号s-科特勒《营销管理》-分析 科特勒《营销管理》-分析 营销管理 - 思维导图 01 理解营销管理 这本书不仅从概念出发介绍了营销管理的定义、职能和计划&#xff0c;还拆解了每一个管理环节策划的具体实施方法。通过下面这张思维导图&#xff0c;我们…

分布式数据库事务故障恢复的原理与实践

关系数据库中的事务故障恢复并不是一个新问题&#xff0c;自70年代关系数据库诞生之后就一直伴随着数据库技术的发展&#xff0c;并且在分布式数据库的场景下又遇到了一些新的问题。本文将会就事务故障恢复这个问题&#xff0c;分别讲述单机数据库、分布式数据库中遇到的问题和…

深度学习 | 编码器-解码器网络、seq2seq模型、束搜索算法

我们知道传统RNN输入和输出数据是等长的&#xff0c;这显然极大限制了他的应用范围。 前面几节我们讲到的循环神经网络的各种变体基本上都在解决一个序列的问题。还有一大类问题涉及到的是两个序列间转换。它是自然语言处理中的一个重要领域&#xff0c;包括机器翻译、语音识别…

go slice源码探索(切片、copy、扩容)和go编译源码分析

文章目录 概要一、数据结构二、初始化2.1、字面量2.2、下标截取2.2.1、截取原理 2.3、make关键字2.3.1、编译时 三、复制3.1、copy源码 四、扩容4.1、append源码 五&#xff1a;切片使用注意事项六&#xff1a;参考 概要 Go语言的切片&#xff08;slice&#xff09;是对数组的…

FA对接FC流程

2、FA进行对接 &#xff08;1&#xff09;首先安装好AD域控服务器DHCPDNS&#xff08;注意&#xff0c;不要忘记了做DNS正反向解析&#xff0c;就是把已经安装了ITA的主机做解析&#xff09;&#xff0c;在里面创建域用户 &#xff08;2&#xff09;安装ITA和VAG/VLB&#xf…

Redis7.2.3(Windows版本)

1、解压 &#xfeff; &#xfeff; 2、设置密码 &#xff08;1&#xff09; 右击编辑redis.conf文件&#xff1a; &#xfeff; &#xff08;2&#xff09; 设置密码。 &#xfeff; 3、测试密码是否添加成功 &#xfeff; 如上图所示&#xff0c;即为成功。 4、设置…

Redis(Linux版本7.2.3)

1、停止Redis服务器 [roottssvr1-c1 sysconfig]# ps -ef | grep redis root 322 1 0 10月30 ? 02:58:53 ./bin/redis-server 0.0.0.0:6379 root 32664 12498 0 14:45 pts/0 00:00:00 grep --colorauto redis [roottssvr1-c1 sysconfig]# [roottssvr…

在Mac上恢复SD卡数据的 6 个有效应用程序

慌&#xff01;SD卡里的照片和视频不小心删了&#xff0c;Mac设备上还恢复不了数据&#xff01; 遇到这种情况&#xff0c;你需要的是一款可靠的Mac适用的SD卡恢复软件。我们为你准备了一份最佳的SD卡恢复软件列表&#xff0c;并且还有详细的评论。另外&#xff0c;我们还会给…