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

可以用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 地址。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio 2015 中 SDL2 开发环境的搭建

Visual Studio 2015 中 SDL2 开发环境的搭建 Visual Studio 2015 中 SDL2 开发环境的搭建新建控制台工程拷贝并配置 SDL2 开发文件拷贝 SDL2 开发文件配置 SDL2 开发文件 测试SDL2 开发文件的下载链接 Visual Studio 2015 中 SDL2 开发环境的搭建 新建控制台工程 新建 Win32 …

Vue.js和Node.js的关系--类比Java系列

首先我们看一张图 这里我们类比了Java的jvm和JavaScript的node.js。 可以看到,node.js是基础,提供了基础的编译执行的能力。vue,js是实际上定义了一种他自己的代码格式,以加速开发。

CDH 6.3.2集成flink 1.18 zookeeper版本不匹配Flink-yarn启动失败

CDH 6.3.2集成flink 1.18 zookeeper版本不匹配Flink-yarn不能正常启动,而在CHD Web页面,flink日志报错提示不明确,不能定位具体错误。CM WEB启动失败错误日志如下图所示: CM查看完成错误日志 [31/Dec/2023 10:45:09 0000] 26000…

Java设计模式实战:从If-Else到策略+工厂方法的演变

引言 可能很多开发者,虽然理解了设计模式的概念,但在实际工作中应用却是另一回事。本篇文章旨在用一个具体的案例来展示如何将设计模式应用到工作的编程问题中。正所谓:“纸上得来终觉浅,绝知此事要躬行。”理论的学习固然重要&a…

若依generator模块解读,Java小白入门(七)

模块基本内容 若依的核心模块基本除了安全那一块,现在还是剩下一个比较重要的章节,是ruoyi-generator,就是代码根据模板来生成,这一块很有必要进行深入了解,本章节我们弄清楚基本框架,以后,我们会在这一块…

回顾 2023,展望 2024

by zhengkai.blog.csdn.net 项目与心得 今年最大的项目和心得,非GCP莫属,作为全球顶尖的云平台, GCP有他的优势,也有很多难用的地方。但是作为当时的一个strategic solution,我们的印度本地化项目必须使用GCP&#xf…

丰田「退股」电装,传统汽车供应链体系走到十字路口

就在中国市场热衷于车企与零部件厂商的合纵连横之际,本周,传统汽车巨头丰田公司宣布,将出售部分电装(Denso)公司股份,资金用于投入电动化、智能驾驶等新技术研发。 按照计划,丰田汽车拟出售超过…

OpenCV-11颜色通道的分离与合并

本次我们使用两个比较重要的API split(mat)将图像的通道进行分割。 merge((ch1,ch2,ch3))将多个通道进行融合。 示例代码如下: import cv2 import numpy as npimg np.zeros((480, 640, 3),…

【python 的各种模块】(8) 在python使用matplotlib和wordcloud库来画wordcloud词云图

目录 目标:用python画出,网上流行的wordcloud词云图 1 准备工作 1.1环境准备 1.1.1安装步骤 1.2 资源准备 1.2.1 文本文件内容如下 1.2.2 图片资源 2 代码测试 2.1 第一版代码和效果 2.1.1 代码和效果 2.1.2 一般plt里解决中文乱码问题 2.1…

【网络面试(4)】协议栈和套接字及连接阶段的三次握手原理

1. 协议栈 一直对操作系统系统的内核协议栈理解的比较模糊,借着这一篇博客做一下简单梳理, 我觉得最直白的理解就是,内核协议栈就是操作系统中的一个网络控制软件,就是一段程序代码,它负责和网卡驱动程序交互&#xff…

Python玫瑰花完整代码

文章目录 环境需求完整代码普通玫瑰花三维玫瑰花多彩玫瑰花环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want…

文献阅读:LoRA: Low-Rank Adaptation of Large Language Models

文献阅读:LoRA: Low-Rank Adaptation of Large Language Models 1. 文章简介2. 方法介绍3. 实验 & 结论 1. 基础实验 1. Bert系列模型2. GPT系列模型 2. 消解实验 1. 作用矩阵考察2. 中间维度考察3. 扰动程度分析 4. 总结 & 思考 文献链接:htt…

骑砍战团MOD开发(29)-module_scenes.py游戏场景

骑砍1战团mod开发-场景制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Cw411N7G4/ 一.骑砍游戏场景 骑砍战团中进入城堡,乡村,战斗地图都被定义为场景,由module_scenes.py进行管理。 scene(游戏场景) 天空盒(Skyboxes.py) 地形(terrain code) 场景物(scene_…

WorkPlus私有化即时通讯的标杆,助力企业实现信息管控与保障

在信息时代,保护企业的信息安全至关重要。而私有化即时通讯成为了企业提升信息安全的重要手段。作为私有化即时通讯的领先选择,WorkPlus以其卓越的性能和领先的技术,为企业提供了安全可靠的通信解决方案。 私有化即时通讯是企业保护信息安全的…

新手快速上手掌握基础排序<二>快速排序快速入门

目录 引言 一:快速排序qsort的简介 1.qsort是一个库函数 2.库函数的查询了解方法 3.qsort的具体使用方法 4.qsort函数使用的一些注意点 5.qsort函数的特点 6.代码实现 (1)整数数组的快速排序 (2)结构体的快速排序(学…

在Go中使用Goroutines和Channels发送电子邮件

学习如何使用Goroutines和Channels在Go中发送电子邮件 在现代软件开发的世界中,通信是一个关键元素。发送电子邮件是各种目的的常见实践,例如用户通知、报告等。Go是一种静态类型和编译语言,为处理此类任务提供了高效和并发的方式。在本文中&…

论文阅读: AAAI 2022行人重识别方向论文-PFD_Net

本篇博客用于记录一篇行人重识别方向的论文所提出的优化方法《Pose-Guided Feature Disentangling for Occluded Person Re-identification Based on Transformer》,论文中提出的PDF_Net模型的backbone是采用《TransReID: Transformer-based Object Re-Identificati…

numpy数组04-数组的轴和读取数据

一、数组的轴 在numpy中数组的轴可以理解为方向,使用0,1,2...数字表示。 对于一个一维数组,只有一个0轴,对于2维数组(如shape(2,2)),有0轴和1轴…

计算机操作系统(OS)——P3内存管理

1、内存的基础知识 学习目标: 什么是内存?有何作用? 内存可存放数据。程序执行前__需要先放内存中才能被CPU处理__——缓和CPU与硬盘之间的速度矛盾。 【思考】在多道程序程序下,系统会有多个进程并发执行,也就是说…

「GPT」G、P、T分别是啥意思?

G意为Generative :生成式 比如,生成式的分类器(模型)包括---- generative classifiers: naive Bayes classifier and linear discriminant analysis 与之对应的为判别式----- discriminative model: logistic regression P意为…