网站配置了Cloudflare代理后,如何配置Nginx获取的真实客户端IP地址?
网站配置了Cloudflare代理后,如何配置Nginx获取的真实客户端IP地址?
这是一个很简单的问题,如何在后台获取真实的访问者IP地址? 网站为了避免有些不怀好意的访问者,不得不自动分析一下客户端访问信息,比如同一个IP一秒钟访问了一千次,正常人哪有这么快的手速,直接认定为程序所为(恶意攻击、爬虫等),今天分享下如何在日志中记录访问者的真实IP地址,以及如何配置一些简单的防止访问频率过高的限制。
本文获取IP地址方法仅对 Cloudflare代理 有效,其他代理如何解决需要阅读其官方文档,原理应该是类似的。
接下来就分享一下具体的配置过程,带大家了解下配置过程,最后还会分享给大家的自动化处理Bash脚本,帮你你省去了自己编写脚本的时间了。
第一步:获取代理IP段信息
Cloudflare提供了其所有代理主机的IP段(ipv4/ipv6),我们需要提前获取这些IP段来识别哪些访问是通过Cloudflare发送到服务器的。
Cloudflare提供的获取方式如下:
- IPv4地址段: https://www.cloudflare.com/ips-v4
- IPv6地址段: https://www.cloudflare.com/ips-v4
比如,我们使用如下命令获取ipv4段信息:
$ curl https://www.cloudflare.com/ips-v4
173.245.48.0/20
103.21.244.0/22
....
131.0.72.0/22
如果需要IPv6地址段,方法同理的。
第二步:生成nginx配置信息
nginx配置文件支持模块化导入,因此我们只需要单独将 Cloudflare配置内容生成一个配置文件即可,不需要额外修改nginx的其他配置文件。
Nginx对应的配置格式如下:
$ cat /etc/nginx/conf.d/cloudflare.confset_real_ip_from 173.245.48.0/20;
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 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;real_ip_header X-Forwarded-For;
因此,我们按照上面格式生成对应配置即可, 最后获取真实IP地址的是最后一行real_ip_header
,可以有如下两种方法:
# real_ip_header CF-Connecting-IP;
real_ip_header X-Forwarded-For;
这里的X-Forwarded-For
格式是这样的:
X-Forwarded-For: client1, proxy1, proxy2
其中的client1
就是真实的访问者IP地址,而proxy1
和proxy2
都是中间经过的代理转发节点,这里有个匿名代理
的知识点,简单说一下:
- 普通代理: 不匿名,可以通过X-Forwarded-For字段获取真实IP地址
- 高匿名代理: X-Forwarded-For 只包含代理服务器地址,没有客户端地址,这样就无法得知真实的访问者IP地址了。
第三步:脚本自动化生成配置
接下来,我们编写脚本,自动化这个配置文件生成的过程,因为Cloudflare的IP段是定期更新的,我们也要定期更新这个配置。
#!/usr/bin/env bash
# 功能: 生成 cloudflare 代理IP列表,用户配置nginx获取客户端真实IP地址cf_ipv4="https://www.cloudflare.com/ips-v4"
cf_ipv6="https://www.cloudflare.com/ips-v6"
mod_cffile="/etc/nginx/conf.d/cloudflare.conf"get_cfipinfo() {# 生成nginx配置记录格式: set_real_ip_from 103.21.244.0/22;curl $cf_ipv4 2>/dev/null | grep -v '#' | grep -v '^$' | sed 's/^/set_real_ip_from /g;s/$/;/g'curl $cf_ipv6 2>/dev/null | grep -v '#' | grep -v '^$' | sed 's/^/set_real_ip_from /g;s/$/;/g'echo# echo "real_ip_header CF-Connecting-IP;"echo "real_ip_header X-Forwarded-For;"echo
}get_cfipinfo | tee $mod_cffile
脚本有了,定期执行就靠cron
调度来帮助了。
下面是一个调度示例(每月15日 0点更新一次):
# 更新 CF 代理IP段并重新加载nginx服务(nginx -t 检测配置正确了才会重新加载)
0 0 15 * * sh /path/to/you-script.sh >/dev/null 2>&1 && nginx -t && systemctl reload nginx
关于nginx配置
毕竟每个人的nginx服务安装方法、编译选项不可能一样,想要获取真实IP需要
http-real-ip
功能支持,两种选择:获取支持此功能的安装包或者自己编译源代码获取此功能支持。
问题一:如何判断自己的nginx
服务支持http-real-ip
功能?
执行下面命令来判断:
$ nginx -V 2>&1 | grep -i http_realip_module
configure arguments: --prefix=/usr/ ...
--without-poll_module ... --with-http_v2_module `--with-http_realip_module` --with-http_addition_module ...
检测编译选项中携带了--with-http_realip_module
就说明可以获取真实客户端IP了。
问题二:生成了 cloudflare.conf后nginx.conf如何自动识别并生效?
可以在nginx.conf中的http
配置块儿中找到类似下面的配置:
http {....#gzip on;include conf.d/*.conf;# vhost serversinclude vhosts.d/*.conf;}
其中, include conf.d/*.conf;
这行会自动导入conf.d
(提示:你的nginx可能使用其他目录)目录下的*.conf
结尾的文件配置,这些配置会适用于当前nginx运行的所有的Web服务。
- Nginx配置参考: 官方配置示例
- Nginx源码地址: Github源码 或者 官方源码地址
最后
上面介绍的文字比较多,目的为了让大家理解,难免有些赘述,已经掌握的朋友忽略即可。
网站配置了Cloudflare代理后,如何配置Nginx获取的真实客户端IP地址?相关推荐
- Nginx在多层代理下获取真实客户端IP地址
最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...
- 学习笔记 - Nginx在多层代理下获取真实客户端IP地址
最近在研究nginx中如何获取真实客户端IP的方法.众所周知,在编译Nginx时,可通过添加http_realip_module模块来获取真实客户端IP地址.何为真实IP地址呢?请看下图,既获取到的真 ...
- Android Studio配置阿里云代理,Gradle 配置国内镜像
Android Studio配置阿里云代理,Gradle 配置国内镜像 链接:https://www.cnblogs.com/junejs/p/12686834.html
- NGINX前端代理TOMCAT取真实客户端IP
nginx前端代理tomcat取真实客户端IP 使用Nginx作为反向代理时,Tomcat的日志记录的客户端IP就不在是真实的客户端IP,而是Nginx代理的IP.要解决这个问题可以在Nginx配置一 ...
- 魅族手机网络邻居开启后无法连接电脑,电脑无法通过IP地址访问手机文件夹
魅族手机网络邻居开启后无法连接电脑,电脑无法通过IP地址访问手机文件夹 1 先找到控制面板打开它,WIN10的控制面板不好找,如果不会可以百度下. 2 在控制面板里点击程序 3 在程序里再点击&quo ...
- Charles学习(四)之使用Map local代理本地静态资源以及配置移动端代理在真机上调试iOS和Android客户端...
前言 问题一:我们在App内嵌H5开发的过程中,肯定会遇到一个问题就是我不想在chrome的控制台中调试也不想在模拟器中调试,我想要在真机上调试,那么如何解决这个问题呢? 问题二:我们期待调试时达到的 ...
- pb 查询客户端ip地址_特别篇-SAP 客户端(配置、测试、生产)
特别篇-SAP 客户端(配置.测试.生产) 1.登录SAP系统的途径 有两种途径: 一种是通过企业门户网站: 一种是安装SAP GUI,通过GUI登录: 2.什么是SAP 客户端? 看下图 图1 图2 ...
- nginx curl命令有效 curl_setopt无效_日志分析系列(外传一):Nginx透过代理获取真实客户端IP...
本系列中的故事纯属虚构,如有雷同实属巧合 小B是Q公司的安全攻城狮,为了完成任务小B开始做起了调研(欲知背景如何,且听下回分说). 首先小B弄明白了Q公司的应用系统架构是:Client --> ...
- Nginx透过代理获取真实客户端IP
本系列中的故事纯属虚构,如有雷同实属巧合 小B是'柒'公司的安全攻城狮,为了完成任务小B开始做起了调研(欲知背景如何,且听下回分说). 首先小B弄明白了'柒'公司的应用系统架构是:Client --& ...
最新文章
- 圆圈中最后剩下的数字
- PHP中对象的深拷贝与浅拷贝
- 程序员的节日怎么过?
- jQuery命名空间,插件开发
- 「ProtocolBuffers2」ProtocolBuffers2 Python简易入门
- Groovy 1.5.7 出现java.lang.LinkageError问题
- 在计算机的通信子网中 其操作方式有两种,全国自考计算机网技术模拟试卷(八)及答案.doc...
- webBroser获取cookie
- C语言小知识---printf()函数
- 第三方服务-阿里云视频点播服务java服务端SDK相关代码
- 使用pt-query-digest进行日志分析
- MIPS 已死,转身投靠 RISC-V!
- 内核同步机制-优化屏障和内存屏障
- TV Metro界面(仿泰捷视频TV版)源码解析
- 畅购商城项目v1-环境搭建
- 苹果手机屏幕尺寸_Apple 苹果 iPhone SE2智能手机屏幕测评报告 「Soomal」
- vue中使用clipboard实现点击复制功能
- Derivation of Linear Regression with One Variable
- Node.js结合Express框架项目搭建
- sql server 2008 r2 直接下载地址,可用迅雷下载
热门文章
- Your branch and 'origin/master' have diverged
- 同一wifi下电脑与手机无法ping通
- 阿波罗登月十大疑点逐一解释
- linux基础方面的资料,「LINUX资料」基础命令概览(一)
- c语言编程float,C语言double和float 实例分析
- NNI神经网络调参工具简单学东西笔记,关于参数传递逻辑的学习记录
- 如何使用edge浏览器或chrome谷歌浏览器调试手机端网页(微信网页、浏览器皆可)
- flink中维表Join几种常见方式总结
- java小demo---员工管理系统
- 改善沟通气氛(如何表达感受但给对方保留面子?如何不防卫地回应批评?)...