【全方位解析】如何获取客户端/服务端真实 IP
一、应用场景
1.比如在投票系统开发中,为了防止刷票,我们需要限制每个 IP 地址只能投票一次
2.当网站受到诸如 DDoS(Distributed Denial of Service,分布式拒绝服务攻击)等攻击时,我们需要快速定位攻击者 IP
3.在渗透测试过程中,经常会碰到网站有 CDN(Content Distribution Network,内容交付网络),这时我们需要绕过 CDN 查找真实 IP
二、解决方案
服务端(CDN)
验证是否具有 CDN
1、使用超级 Ping 网站,查看对应 IP 地址是否唯一,如果不唯一多半是使用了 CDN ,诸如:
- http://ping.chinaz.com/
 - http://ping.aizhan.com/
 - http://ce.cloud.360.cn/
 
2、使用 nslookup 进行检测,如果返回域名解析对应多个 IP 地址多半是使用了 CDN
检测方式,直接命令行输入nslookup,随后输入对应域名
有 CDN 如下

无 CDN 如下

方法1:查询历史 DNS 记录
查看 IP 与 域名绑定的历史记录,可能会存在使用 CDN 前的记录,相关查询网站:
DNS查询:https://dnsdb.io/zh-cn/
在线域名信息查询:http://toolbar.netcraft.com/site_report?url=
DNS、IP等查询:http://viewdns.info/
CDN查询 IP:https://tools.ipip.net/cdn.php
方法2:查询子域名
毕竟 CDN 还是不便宜的,所以很多站长可能只会对主站或者流量大的子站点做了 CDN,而很多小站子站点又跟主站在同一台服务器或者同一个C段内,此时就可以通过查询子域名对应的 IP 来辅助查找网站的真实IP。
dnsdb 查询(https://www.dnsdb.io/)
只需输入baidu.com type:A就能收集百度的子域名和ip

方法3:网络空间搜索引擎
网络空间搜索引擎是为了解决个人每次进行渗透测试是都要进行的信息收集过程,通过全网扫描的方式,将基础数据进行格式化存储,供安全人员按需搜索使用,提升了安全人员的工作效率。
常用的网络空间搜索引擎:fofa、shodan、zoomeye、censys
每种搜索引擎都有对应的搜索语法,例如 fofa ,只需输入:title:“网站的title关键字”或者body:“网站的body特征”就可以找出 fofa 收录的有这些关键字的 ip 域名,获取能获取网站的真实 ip,其他搜索引擎语法请看推荐阅读
方法4:利用 SSL 证书寻找真实原始 IP
假如你在xyz123boot.com上托管了一个服务,原始服务器IP是136.23.63.44。 而CloudFlare则会为你提供DDoS保护,Web应用程序防火墙和其他一些安全服务,以保护你的服务免受攻击。为此,你的Web服务器就必须支持SSL并具有证书,此时CloudFlare与你的服务器之间的通信,就像你和CloudFlare之间的通信一样,会被加密(即没有灵活的SSL存在)。这看起来很安全,但问题是,当你在端口443 https://136.23.63.44:443 上直接连接到IP时,SSL证书就会被暴露。
此时,如果攻击者扫描0.0.0.0/0,即整个互联网,他们就可以在端口443上获取在xyz123boot.com上的有效证书,进而获取提供给你的Web服务器IP。
以 Censys 工具为例,我们仅仅需要做的就是把上面用文字描述的搜索词翻译成实际的搜索查询参数,如下
-  
xyz123boot.com证书的搜索查询参数为:parsed.names:xyz123boot.com
 -  
只显示有效证书的查询参数为:tags.raw:trusted
 -  
组合后的搜索参数为:parsed.names: xyz123boot.com and tags.raw: trusted
 
但是缺点就是很多非法网站根本没有 SSL 证书,无法获取 IP。
方法5:使用国外主机解析域名
国内很多 CDN 厂商因为各种原因只做了国内的线路,而针对国外的线路可能几乎没有,此时我们使用国外的主机直接访问可能就能获取到真实IP。
方法6:网站漏洞查找
1)目标敏感文件泄露,例如:phpinfo之类的探针、GitHub信息泄露等。
 2)XSS盲打,命令执行反弹shell,SSRF等。
 3)无论是用社工还是其他手段,拿到了目标网站管理员在CDN的账号,从而在从CDN的配置中找到网站的真实IP。
方法7:网站邮件订阅查找
RSS邮件订阅,很多网站都自带 sendmail,会发邮件给我们,此时查看邮件源码里面就会包含服务器的真实 IP 了。
方法8:用 Zmap 扫全网
需要找 xiaix.me 网站的真实 IP,我们首先从 apnic 获取 IP 段,然后使用 Zmap 的 banner-grab 扫描出来 80 端口开放的主机进行 banner 抓取,最后在 http-req 中的 Host 写 xiaix.me。
方法9:F5 LTM解码法
当服务器使用F5 LTM做负载均衡时,通过对set-cookie关键字的解码真实ip也可被获取,例如:Set-Cookie: BIGipServerpool_8.29_8030=487098378.24095.0000,先把第一小节的十进制数即487098378取出来,然后将其转为十六进制数1d08880a,接着从后至前,以此取四位数出来,也就是0a.88.08.1d,最后依次把他们转为十进制数10.136.8.29,也就是最后的真实ip。
更多方法请看推荐阅读
客户端
获取 IP 方式
在Java中,获取客户端IP最直接的方式就是使用request.getRemoteAddr()。这种方式能获取到连接服务器的客户端IP,在中间没有代理的情况下,的确是最简单有效的方式。但是目前互联网Web应用很少会将应用服务器直接对外提供服务,一般都会有一层 Nginx 做反向代理和负载均衡,有的甚至可能有多层代理。在有反向代理的情况下,直接使用request.getRemoteAddr()获取到的IP地址是Nginx所在服务器的IP地址,而不是客户端的 IP。
介绍如何获取客户端 IP 之前我们需要了解 Nginx 负载均衡 方式,从协议上分为如下:
-  
七层复杂均衡(HTTP/HTTPS协议),工作在第七层“应用层”。
 -  
四层负载均衡(TCP/UDP协议),工作在“网络层”和“传输层”。
 
七层复杂均衡
配置 Nginx (支持X-Forwarded-For)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
$proxy_add_x_forwarded_for会将和Nginx直接连接的客户端IP追加在请求原有X-Forwarded-For值的右边。形式如下:
X-Forwarded-For: client1, proxy1, proxy2
 
X-Forwarded-For包含多个IP地址,每个值通过逗号+空格分开,最左边(client1)是最原始客户端的IP地址,中间如果有多层代理,每一层代理会将连接它的客户端IP追加在X-Forwarded-For右边。
获取 IP 代码段
public String getClientIp(HttpServletRequest request) {
String xff = request.getHeader("X-Forwarded-For");
if (xff == null) {
return request.getRemoteAddr();
} else {
return xff.contains(",") ? xff.split(",")[0] : xff;
}
}
 
缺点:客户端可以伪造X-Forwarded-For
一般的客户端(例如浏览器)发送HTTP请求是没有X-Forwarded-For头的,当请求到达第一个代理服务器时,代理服务器会加上X-Forwarded-For请求头,并将值设为客户端的IP地址(也就是最左边第一个值),后面如果还有多个代理,会依次将IP追加到X-Forwarded-For头最右边,最终请求到达Web应用服务器,应用通过获取X-Forwarded-For头取左边第一个IP即为客户端真实IP。
但是如果客户端在发起请求时,请求头上带上一个伪造的X-Forwarded-For,由于后续每层代理只会追加而不会覆盖,那么最终到达应用服务器时,获取的左边第一个IP地址将会是客户端伪造的IP。也就是上面的Java代码中getClientIp()方法获取的IP地址很有可能是伪造的IP地址
解决方案 :配置 Nginx 反向代理(必须是直接对外的 Nginx)
proxy_set_header X-Forwarded-For $remote_addr;
 
$proxy_add_x_forwarded_for会在原有X-Forwarded-For上追加IP,这就相当于给了伪造X-Forwarded-For的机会。
而$remote_addr是获取的是直接TCP连接的客户端IP(类似于Java中的request.getRemoteAddr()),这个是无法伪造的,即使客户端伪造也会被覆盖掉,而不是追加。
需要注意的是,如果有多层代理,那么只要在直接对外访问的Nginx上配置X-Forwarded-For为 r e m o t e a d d r ∗ ∗ , ∗ ∗ 内部层的 N g i n x 还是要配置为 remote_addr**,**内部层的Nginx还是要配置为 remoteaddr∗∗,∗∗内部层的Nginx还是要配置为proxy_add_x_forwarded_for,不然内部层的Nginx又会覆盖掉客户端的真实IP。
四层负载均衡
四层负载均衡基于 TCP/UDP协议 ,X-Forwarded-For的方式获取客户端 IP 方式将会失效,此时可以配置 Nginx 开启 透传功能:
stream {server {# 开启透传proxy_protocol on ;}
}
 
添加这个配置后Nginx建立TCP连接时会主动发送一段报文,会包含客户端真实Ip
携带客户端IPv4地址的Proxy Protocol v2二进制头格式如下所示:

携带客户端IPv6地址的Proxy Protocol v2二进制头格式如下所示:

补充
代理 IP
- 透明代理
 
其实即便使用了透明代理IP,还是会发送真实IP。这种一般是用来突破网络浏览限制,比如说一般用户不能随意访问的教育网,使用代理IP就可以突破的。
- 匿名代理(普通匿名代理和高匿名代理)
 
普通代理IP是否能查到真实IP。普通代理IP相比于透明代理IP会安全很多,有的服务器是无法识别真实IP的,但这也不是绝对的,还是会有服务器识别到使用了代理IP的。
高匿代理IP的可以模拟真正的客户浏览器访问目标网站,不容易识别出使用了代理IP,会直接认为代理IP就是你用的IP。使用高匿名代理,经过高级加密后,在网络难以查找信息,但是仍可以从现实查找。想要查真实IP,可以直接从代理IP商那里,通过查看服务器日志等方式找出他的真实IP地址。
参考文章
http获取客户端真实ip的原理及利用X-Forwarded-For伪造客户端IP漏洞成因及防范 - lovearpu - 博客园 (cnblogs.com)
11种绕过CDN查找真实IP方法 - STARTURN - 博客园 (cnblogs.com)
如何获取来访者的真实IP (huaweicloud.com)
通过Proxy Protocol获取客户端真实IP(四层监听) (aliyun.com)
解决Nginx代理TCP获取不到客户端真实IP的问题
推荐阅读
渗透测试|玩转网络空间搜索引擎 - FreeBuf网络安全行业门户
技术|互联网扫描器 ZMap 完全手册 (linux.cn)
F5 BIG-IP LTM 负载均衡器 功能介绍 下篇-阿里云开发者社区 (aliyun.com)
Nginx 理解四层/七层负载均衡 - Awecoder - 博客园 (cnblogs.com)
用代理IP后还能追踪到真实IP吗 - 掘金 (juejin.cn)
本文由博客一文多发平台 OpenWrite 发布!
相关文章:
【全方位解析】如何获取客户端/服务端真实 IP
一、应用场景 1.比如在投票系统开发中,为了防止刷票,我们需要限制每个 IP 地址只能投票一次 2.当网站受到诸如 DDoS(Distributed Denial of Service,分布式拒绝服务攻击)等攻击时,我们需要快速定位攻击者…...
Ceph简介和特性
Ceph是一个多版本存储系统,它把每一个待管理的数据流(例如一个文件) 切分为一到多个固定大小的对象数据,并以其为原子单元完成数据存取。 对象数据的底层存储服务是由多个主机 (host) 组成的存储集群,该集群也被称之为 RADOS (ReliableAutoma…...
Python基本语法之符号使用
好久没有和小伙伴们更新python了,我对于此感到抱歉以后有时间尽量多更新 目录 一. 标识符 A.定义: B.使用特点 C.Python标识符,进一步探讨以下几个方面的详细内容: 1. 规则和约定: 2. 有效的标识符示例࿱…...
前端vue部署到nginx并且配置https安全证书全流程
说明一下: 本人原本使用的是docker安装nginx通过挂载实现部署,但是出现了很多bug(例如部署安全证书后还是无法访问),所以困扰了很久,最后改为本地安装nginx,最终在不懈的努力下终于按照好了&…...
三子棋(超详解+完整码源)
三子棋 前言一,游戏规则二,所需文件三,创建菜单四,游戏核心内容实现1.棋盘初始化1.棋盘展示3.玩家下棋4.电脑下棋5.游戏胜负判断6.game()函数内部具体实现 四,游戏运行实操 前言 C语言实现三子棋…...
【算法提高:动态规划】1.2 最长上升子序列模型(TODO:最长公共上升子序列)
文章目录 题目列表1017. 怪盗基德的滑翔翼1014. 登山482. 合唱队形1012. 友好城市(⭐排序后 最长上升子序列模型)1016. 最大上升子序列和1010. 拦截导弹解法1——最长递减子序列 贪心解法2——最长递减子序列 最长递增子序列(⭐贪心结论&am…...
会不会好奇ai绘画生成器?ai创作的灵感从何而来?
在这个宁静的公园里,阳光透过树叶的缝隙洒在的地面上,微风轻拂着艺术家的发丝,带来一丝清凉。坐在长椅上的他,手中紧握着一支触控画笔,目光凝视着眼前的美景。旁边一台智能绘画助手正在悄悄发光,它似乎能够…...
【Ajax】笔记-JQuery发送请求与通用方法
Get请求 语法格式: $.get(url, [data], [callback], [type]) url:请求的 URL 地址。data:请求携带的参数。callback:载入成功时回调函数。type:设置返回内容格式,xml, html, script, json, text, _default。 准备三个按钮分别测试Get 、Post、通用型方…...
视频的音频提取怎么做?这样提取很简单
提取视频中的音频通常在需要从视频中独立使用音频或需要对音频进行编辑时使用。例如,当我们需要将音频上传到音乐流媒体平台或将其用于播客或其他音频项目时,就可能需要从视频中提取音频。问题是该怎么提取呢?教给大家几种简单的提取方法&…...
几百本常用计算机开发语言电子书链接
GitHub - XiangLinPro/IT_book: 本项目收藏这些年来看过或者听过的一些不错的常用的上千本书籍,没准你想找的书就在这里呢,包含了互联网行业大多数书籍和面试经验题目等等。有人工智能系列(常用深度学习框架TensorFlow、pytorch、keras。NLP、…...
Docker Compose 解析:定义和管理多容器应用,从多角度探索其优势和应用场景
🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~ἳ…...
Linux系列---【CentOS 7通过MSTSC连接远程桌面】
安装对应的yum源 yum list lightdm xorgxrdp xrdp 可以看到这些软件都在epel中,如果没有的话,请先安装对应的yum源。命令如下: yum install -y epel-release 确认yum源没有问题之后,我们就可以进行安装了。 安装lightdm xorgxrdp…...
width: calc(~“100% - 267px“);动态css 调样式
.result-filtering {color: #8b8b8b;display: flex;// width: 82.6%;width: calc(~"100% - 267px");}...
Windows Server 2012 搭建网关服务器并端口转发
需求 使用 Windows server 作为Hyper-V 虚拟出许多虚拟机,基本上都分配了内网地址,现在需要这些虚拟机访问外网,或者外网直接访问这些虚拟机,必须配置一个网关服务器。我决定直接使用 Windows 的远程访问中的 NAT 服务来完成。 …...
基于linux下的高并发服务器开发(第三章)- 3.10 死锁
deadlock.c #include <stdio.h> #include <pthread.h> #include <unistd.h>// 全局变量,所有的线程都共享这一份资源。 int tickets 1000;// 创建一个互斥量 pthread_mutex_t mutex;void * sellticket(void * arg) {// 卖票while(1) {// 加锁pt…...
09.计算机网络——套接字编程
文章目录 网络字节序socket编程socket 常见APIsockaddr结构 UDP编程创建socket绑定socketsendto发送数据recvform接收数据关闭socket TCP编程创建socket绑定socketlisten监听套接字accept服务端接收连接套接字connect客户端连接套接字send发送数据recv接收数据关闭socket 工具n…...
Data Structure, Algorithm,and Applications in C++
在学习这本书进阶内容之前,我们可以跟着它的第一章部分再巩固和复习。本书由Sartaj Sahni撰写,由王立柱和刘志红翻译。全书通俗易懂,内容丰富,是巩固C内容的不二选择。希望本文对各位有所帮助。 目录 1.函数与参数 1.1.传值参数…...
Apipost使用教程
Apipost是一款集API调试、生成文档、Mock、测试于一体的协同工具。单个工具可以同时满足接口测试、生成/分享文档、Mock、流程测试等功能,还有超实用的多人多角色间实时协作的功能。将前端、后端、测试三种角色串联起来,从而实现工作流程无缝衔接、提高研…...
如何使用Python进行服务器管理和自动化操作?
使用Python进行服务器管理和自动化操作可以极大地简化和提高日常管理任务的效率。下面是一些常见的方法和工具: SSH库:使用Python的paramiko库可以通过SSH协议连接到服务器,执行命令、上传文件和下载文件等操作。 例如,使用para…...
Kafka-partition和消费者的关系
Kafka-partition 目录概述需求: 设计思路实现思路分析1.Kafka-partition2.消费者数量小于分区数量3. 拓展实现 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
