接入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#cfip4set_real_ip_from 103.21.244.0/22; #cfipv4set_real_ip_from 103.22.200.0/22; #cfipv4set_real_ip_from 103.31.4.0/22; #cfipv4set_real_ip_from 104.16.0.0/12; #cfipv4set_real_ip_from 108.162.192.0/18; #cfipv4set_real_ip_from 131.0.72.0/22; #cfipv4set_real_ip_from 141.101.64.0/18; #cfipv4set_real_ip_from 162.158.0.0/15; #cfipv4set_real_ip_from 172.64.0.0/13; #cfipv4set_real_ip_from 173.245.48.0/20; #cfipv4set_real_ip_from 188.114.96.0/20; #cfipv4set_real_ip_from 190.93.240.0/20; #cfipv4set_real_ip_from 197.234.240.0/22; #cfipv4set_real_ip_from 198.41.128.0/17; #cfipv4#cfip6set_real_ip_from 2400:cb00::/32; #cfipv6set_real_ip_from 2405:8100::/32; #cfipv6set_real_ip_from 2405:b500::/32; #cfipv6set_real_ip_from 2606:4700::/32; #cfipv6set_real_ip_from 2803:f800::/32; #cfipv6set_real_ip_from 2c0f:f248::/32; #cfipv6set_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.pyfrom django.http import HttpResponsedef 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_ipelse:# 如果 CF-Connecting-IP 头不存在,直接使用 REMOTE_ADDRreal_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.rhkb.cn/news/228232.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析泛型

一、泛型的诞生 在C#1 中我们还没有泛型的时候我们收集数据通常需要使用到数组,或者使用封装好的数组集合Hashtable ArrayList。 举个例子: 我们在读取文件的时候就会需要一个数组来储存读取的数据的内容 但我们并不知数据的具体长度也就无法在声明的…

信息安全概论考试题目

文章目录 一、计算题二、网络安全协议应用(30 分)三、材料分析(15 分)四、系统安全配量(共 15 分) 一、计算题 1、Playfair 算法属于经典对称加密方式。曾经在相当长的一段时期内,Playfair算法被认为是一种牢不可破的加密方法。现有明文 introduction to informati…

python使用openpyxl操作excel

文章目录 前提读取已有excel创建一个excel工作簿对象创建excel工作簿中的工作表获取工作表第一种:.active 方法第二种:通过工作表名获取指定工作表​​​​​​第三种:.get_sheet_name() 修改工作表的名称数据操作写入数据按单元格写入通过指…

Java 基础学习(十九)网络编程、反射

1 Socket编程 1.1 Socket编程概述 1.1.1 Socket简介 在网络编程中,Socket(套接字)是一种抽象概念,它用于在不同计算机之间进行通信。Socket可以看作是一种通信的端点,可以通过Socket与其他计算机上的程序进行数据传…

2021-06-21 C51的模拟羽毛球游戏设计

缘由C51的模拟羽毛球游戏设计求解_嵌入式-CSDN问答 #include "REG52.h" sbit K2 P1^6; sbit K1 P1^7; bit k1; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128};//0-9. unsigned char Js0,fen0;//中断计时 unsigned int miao8,dfj0,dfy0; voi…

计算机科学速成课【学习笔记】(2)——电子计算机

本集课程B站链接 2. 电子计算机-Electronic Computing_哔哩哔哩_bilibili2. 电子计算机-Electronic Computing是【计算机科学速成课】[40集全/精校] - Crash Course Computer Science的第2集视频,该合集共计40集,视频收藏或关注UP主,及时了…

FA模板制作流程

1、FA模板制作的流程(完整复制模板制作) 总结: FA完整复制云桌面模板流程: 1、安装一个全新的Windows,挂载并安装tools 2、关闭防火墙、启动administrator本地超管用户 3、挂载FusionAccess_WindowsDesktop_Instal…

SpringBoot实用篇

SpringBoot实用篇 1、热部署 什么是热部署? 所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。对于Java应用程序来说,热部署就是在运行时更新Java类文件。 热部署有什么用? 节约时间,热…

以太网转RS485通讯类库封装

最近选用有人科技的以太网转RS485模块做项目,设备真漂亮,国货之光。调通了通讯的代码,发到网上供大家参考,多多交流。 以下分别是配套的头文件与源文件: /*******************************************************…

【Leetcode】1154. 一年中的第几天

文章目录 题目思路代码 题目 1154. 一年中的第几天链接 思路 题目要求是给定一个字符串 date,它代表一个日期,采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。 首先,我们可以通过字符串的索引来提取年、月和日的数值&…

2023-12-23 LeetCode每日一题(移除石子使总数最小)

2023-12-23每日一题 一、题目编号 1962. 移除石子使总数最小二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 piles ,数组 下标从 0 开始 ,其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k ,请你执行下述…

Centos7:Jenkins+gitlab+node项目启动(2)

Centos7:Jenkinsgitlabnode项目启动(1) Centos7:Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7:Jenkinsgitlabnode项目启动(2) Centos7:Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7:Jenkinsgitlabnode项目启…

爬虫工作量由小到大的思维转变---<第三十章 Scrapy Redis 第一步(配置同步redis)>

前言: 要迈向scrapy-redis进行编写了;首要的一步是,如何让他们互通?也就是让多台电脑连一个任务(这后面会讲); 现在来做一个准备工作,配置好redis的同步!! 针对的是windows版本的redis同步,实现主服务和从服务共享一个redis库; 正文: 正常的redis for windows 的安装这里就…

扩散模型基础

扩散模型发展至今日,早已成为各大机器学习顶会的香饽饽。本文简记扩散模型入门相关代码,主要参阅李忻玮、苏步升等人所编著的《扩散模型从原理到实战》 文章目录 1. 简单去噪模型1.1 简单噪声可视化1.2 去噪模型1.3 小结 2 扩散模型2.1 采样过程2.2 上科…

Gin 源码深度解析及实现

介绍 什么是 gin ? 一个轻量级高性能 HTTP Web 框架。 Introduction | Gin Web Framework (gin-gonic.com) Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。 为什么使用 gin ? In…

C#进阶-IIS应用程序池崩溃的解决方案

IIS是微软开发的Web服务器软件,被广泛用于Windows平台上的网站托管。在使用IIS过程中,可能会遇到应用程序池崩溃的问题,原因可能有很多,包括代码错误、资源不足、进程冲突等。本文将为大家介绍IIS应用程序池崩溃的问题分析和解决方…

目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

前言 损失函数是用来评价模型的预测值和真实值一致程度,损失函数越小,通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段,如果我们想让预测值无限接近于真实值,就需要将损失值降到最低…

机器学习系列--R语言随机森林进行生存分析(1)

随机森林(Breiman 2001a)(RF)是一种非参数统计方法,需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术,通过拟合一组树来稳定预测精度模型估计。随机生存森林(RSF&#xff0…

HTML与CSS

目录 1、HTML简介 2、CSS简介 2.1选择器 2.1.1标签选择器 2.1.2类选择器 2.1.3层级选择器(后代选择器) 2.1.4id选择器 2.1.5组选择器 2.1.6伪类选择器 2.2样式属性 2.2.1布局常用样式属性 2.2.2文本常用样式属性 1、HTML简介 超文本标记语言HTML是一种标记语言&…

Python 从入门到精通之通俗易懂学闭包

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合(List列表、Tuple元组、Dict字典、Set)-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…