老调重谈:获取用户IP,ip138能够获取到真实的IP

高坚果兄弟 2014-03-09 12:19:17
加精
最近在弄nginx反向代理,引发了对获取用户IP的深入学习(以前发的帖子都没有满意结贴,没的返还50%积分,还有编辑器难用,抱怨一下)。

我在北京用的是宽带通的宽带,他们肯定有自己的服务器(缓存啥的,我也不懂的),请求网站的时候,肯定是通过他们的服务器的,而且是匿名代理,这一点通过下面贴出来的服务器接收的请求头可以看出来。
这样就导致了获取的用户IP是宽带提供商的服务器IP地址,而不是宽带提供商分配给用户的IP地址。

经过测试,得出下面这些数据:
1、223.21.65.225 宽带提供商给路由器分配的IP地址(真实IP)
2、118.186.134.251 服务器端收到用户的IP地址(代理服务器IP)
3、118.186.134.251 百度加速乐查询到用户的IP地址(代理服务器IP)
4、223.21.65.225 ip138.com查询到的IP地址(真实IP)
5、访问ip138.com时,携带X-Forwarded-For=2.2.2.2请求头,难么查询到的IP就2.2.2.2(虚假IP)

在程序里我用getRemoteAddr,getHeaders("X-Forwarded-For")均无法获取到真实IP地址,百度加速乐也没有正确获取到,由此我纳闷ip138是如何的到我真实IP的,还是有什么新的获取IP地址的方法?请csdn各位牛人指教


****以下是图片,供参考****

宽带提供商给路由器分配的IP地址223.21.65.225:


服务器端收到的IP地址118.186.134.251:

其中并没有X-Forwarded-For请求头,因此我判断是通过了透明代理(宽带通服务器),没获取到真实的IP地址。

验证一下,通过百度加速IP归属地查询获取到地址118.186.134.251:

和我获取的IP地址是一样的,并不是我真实的IP地址。

但是ip138却获取到了我真实的IP地址223.21.65.225:
(http://iframe.ip138.com/ic.asp,他什么也没做,请求了就直接返回IP地址,因此我截源码的图片)

结果是ip138确实获取到了我的IP地址。

验证一下,我添加X-Forwarded-For请求头,然后访问ip138,IP2.2.2.2:
...全文
43279 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
寂静的神经 2016-08-23
  • 打赏
  • 举报
回复
我遇见这个问题了,我用php获取铁通网络的外网IP获取的不准,获取到的居然是联通IP,但是IP138获取的就是准确的。
Zhang_qiankun 2014-10-18
  • 打赏
  • 举报
回复
我当年做的IP监控 用的就是淘宝的接口
刘思达2012 2014-06-14
  • 打赏
  • 举报
回复 1
引用 16 楼 AsdsNT 的回复:
这个问题实在是简单到不能简单:完全依赖公网服务器本身的特性决定的,ip138和你一样,什么都没有做,他之所以可以获取到某些网络环境的真实ip地址,仅仅只是他的服务器处于的机房不同,物理连接不同而已。具体来说就是,多线路机房获取到的真实外网ip概率要大很多,而且我告诉你,绝大多数国外服务器也能获取到更大范围内的真实外网ip。我本人能够通过编程实现任意网络环境做公网服务器而能获取到比目前你能看到的任何获取用户外网服务器的网站更准确的ip. 我基本能实现自我感知自己的外网ip是哪一个,你给我一个ip,我能判断他究竟可不可能是我的真实外网ip.
这个似乎可以用tracert来验证。楼主你tracert到ip138,看看是不是没有经过 118.186.134.251 的路由,而到另外的网站,是否经过了 118.186.134.251 的路由。 另外最近看了下,很少有客户有 X-Forwarded-For 信息,于是把这个给放弃了,就用remote address了。 如果要获得真实ip必须要把服务器布多,我想,算了吧,呵呵。除非谁服务器很多的,然后有提供这种服务,帮你去获得客户端的最真实ip。
高坚果兄弟 2014-06-14
  • 打赏
  • 举报
回复
引用 53 楼 liusida2012 的回复:
[quote=引用 16 楼 AsdsNT 的回复:] 这个问题实在是简单到不能简单:完全依赖公网服务器本身的特性决定的,ip138和你一样,什么都没有做,他之所以可以获取到某些网络环境的真实ip地址,仅仅只是他的服务器处于的机房不同,物理连接不同而已。具体来说就是,多线路机房获取到的真实外网ip概率要大很多,而且我告诉你,绝大多数国外服务器也能获取到更大范围内的真实外网ip。我本人能够通过编程实现任意网络环境做公网服务器而能获取到比目前你能看到的任何获取用户外网服务器的网站更准确的ip. 我基本能实现自我感知自己的外网ip是哪一个,你给我一个ip,我能判断他究竟可不可能是我的真实外网ip.
这个似乎可以用tracert来验证。楼主你tracert到ip138,看看是不是没有经过 118.186.134.251 的路由,而到另外的网站,是否经过了 118.186.134.251 的路由。 另外最近看了下,很少有客户有 X-Forwarded-For 信息,于是把这个给放弃了,就用remote address了。 如果要获得真实ip必须要把服务器布多,我想,算了吧,呵呵。除非谁服务器很多的,然后有提供这种服务,帮你去获得客户端的最真实ip。 [/quote] 嗯,淘宝ip地址库提供这样的api,不单单是查询ip对应的城市,也可以准确获取到我的地址,虽然没有公布这个接口,但看他的网页源码还是得到了这个地址http://ip.taobao.com/service/getIpInfo.php?ip=myip,可惜不能在别的网站调用,给自己打开玩玩还是可以得。 X-Forwarded-For随随便便就可以伪造,和真正的使用代理的用户混在一起,弄个ip好复杂
高坚果兄弟 2014-03-23
  • 打赏
  • 举报
回复
还有没有人啊,没人回复就明晚结贴了
比特灵 2014-03-21
  • 打赏
  • 举报
回复
同意32楼的说法。
高坚果兄弟 2014-03-20
  • 打赏
  • 举报
回复
引用 46 楼 lt5225262 的回复:
这个讨论有意义,值得继续
嗯,比如通过IP来限制用户访问频率,首先得正确获取到用户IP,极端情况下,好多人无缘无故变成同一个IP,又同时访问网站,nginx的连接限制,limit_conn_zone $binary_remote_addr这种配置就有点显得不太友好,然而ip138确实获取到了正确IP就不用担心这种情况了,好奇他们是怎么实现的
lt5225262 2014-03-20
  • 打赏
  • 举报
回复
这个讨论有意义,值得继续
BinaryCSharp 2014-03-20
  • 打赏
  • 举报
回复
围观MARK等馅饼
浪里花 2014-03-18
  • 打赏
  • 举报
回复
mark下,有时要用
raedon 2014-03-18
  • 打赏
  • 举报
回复
mark,有时会蛋疼这个问题
网络科技 2014-03-18
  • 打赏
  • 举报
回复
路过,看看。。。也做过获取IP地址的程序,都是简单的,没想那么复杂
  • 打赏
  • 举报
回复
lentoo 2014-03-18
  • 打赏
  • 举报
回复
高坚果兄弟 2014-03-17
  • 打赏
  • 举报
回复
有人研究过这样的问题么,出来分享一下
xusir98 2014-03-17
  • 打赏
  • 举报
回复
xusir98 2014-03-17
  • 打赏
  • 举报
回复
高坚果兄弟 2014-03-16
  • 打赏
  • 举报
回复
还有木有人呀
nettman 2014-03-16
  • 打赏
  • 举报
回复
感谢楼主分享
  • 打赏
  • 举报
回复
通过楼主的实验可知,ip138支持从X-Forwarded-For判断ip来源,而“百度加速IP归属地”获取到了“错误”的ip来源。 那么情况很有可能是这样的,你的代理服务器添加了X-Forwarded-For头,如果你的包本来就有X-Forwarded-For头,那么代理服务器不覆盖你的配置。 仅仅抓包是看不出来这一点的,因为你只能抓到你发出的包,无法查看ip138收到的包。 可以另找一人有外网ip的,让他开一个http服务,然后你访问一下,在对方处抓一下包,一切就都真相大白了。 真相可能是:你的WAN口ip是A,运营商的代理服务器ip是B,那么对方收到的包的来源地址是B,包中某个地方标识出了真正的来源地址是A 这可能是运营商应对ip地址资源不足的策略
加载更多回复(32)

81,120

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧