IP归属地为什么不准:地理库原理、手机流量显示外省与多库判断方法

博客 / IP 与隐私

IP归属地为什么不准:地理库原理、手机流量显示外省与多库判断方法

IP归属地为什么不准?因为它根本不是定位。网站拿到的只是你的出口 IP,再去一张“IP 地址段对应哪个地区”的表里查一下,查到什么就显示什么。这张表由不同的数据商各自维护,更新有快有慢;运营商也可能把一段地址挪到别的城市使用,或者让很多用户从同一个出口上网。表和现实对不上,归属地就会偏,偏到外省也不奇怪。

IP归属地到底是怎么查出来的?

服务器看到的是 TCP 连接的源地址,也就是你的出口 IP。它不知道你的 GPS,也不知道你的基站。拿到 IP 后,它去查一个地理定位数据库,库里大致是这样的记录:

地址段国家省份城市运营商
某个 /20 网段中国某省某市某运营商

这些记录的来源通常有几类:

  • 注册信息:地址段由区域互联网注册机构分配给运营商或企业,注册信息里有组织名和登记地址,可以通过 RDAP 或 whois 查到。登记地址往往是公司总部,跟实际使用的城市不一定是一回事。
  • 运营商提供的数据:有的数据商和运营商有合作,这部分地址的标注通常更准。
  • 测量推断:从多个探测点测延迟、看路由,推算地址段大概在哪个区域。
  • 用户侧数据:例如某些应用在用户授权定位后,把“这个 IP 当时在哪”回传给数据商。

每家数据商用的来源和权重不同,更新周期也不同。所以同一个 IP 在不同库里查到不同城市很常见。这部分细节可以看 为什么 11 个 IP 库给出不同位置:地理定位数据从哪来。

为什么会偏到外省?

常见原因有下面几类,一个 IP 可能同时占好几条。

运营商在省之间调配地址池

运营商拿到的地址段并不是永久绑定某个城市。某个省地址紧张时,可能把另一个省闲置的段调过去用。数据库如果还按旧记录走,就会把你显示成原来那个省。宽带用户换了一个新分配的地址后,归属地突然变了,多半是这个原因。

手机流量从集中出口上网

移动网络的数据流量不是在你身边的基站直接出公网,而是先回到运营商的核心网,再从数量有限的网关出去。一个网关可能服务好几个城市甚至一个大区,于是同一片地址段下的用户分布很广,数据库只能标一个城市。

漫游时更明显。数据漫游的流量通常会回到号码归属地的核心网再出公网,所以人在外地出差,手机流量显示的仍是号码所在省。反过来,如果数据库把某个大区网关的地址段标成了邻省,你人在本省也会显示成外省。

CGNAT:很多人共用一个公网 IP

IPv4 地址不够用,运营商会让大量用户共享一个公网地址(运营商级 NAT)。这时“这个 IP 在哪”本来就没有唯一答案,数据库给出的只是一个近似。共享地址还会影响信誉判断,见 共享 IP 与 CGNAT 会影响 IP 信誉吗。

数据库更新滞后

地址段易手、重新分配之后,数据商要过一段时间才会改。各平台用的库版本不同,同一天里一个平台显示新位置、另一个还是旧位置,这种情况很常见。

你走的根本不是本地出口

公司网络常常统一从总部出口上网,异地分支的员工会显示成总部所在城市。开了代理或 VPN,看到的是代理服务器的位置。还有一种容易忽略的情况:代理只接管了 IPv4,IPv6 仍然直连,不同网站走了不同的协议,查到的归属地就互相矛盾。排查方法见 IPv6 代理不生效:双栈网络下 IPv4 与 IPv6 出口不一致的原因与排查。

各平台用的数据源不同

社交平台、查询网站、云服务商的风控,各自接的是不同数据商,有的还叠加了自己的修正规则。所以拿 A 网站的结果去对 B 平台的显示,对不上并不说明哪一边错了。

对照表:现象、原因、怎么验证

你看到的现象最可能的原因怎么验证
家里宽带,归属地突然从本市变成邻省运营商调配了地址池,数据库还是旧记录查 RDAP 看地址段登记的组织;多库对比,看是否只有少数库给了外省
手机流量显示号码所在省,人却在外地漫游流量回到归属地核心网出公网切到当地 Wi-Fi 再查一次;两次出口 IP 和运营商应当不同
手机流量在本省也显示外省移动网关覆盖大区,数据库标注偏差多库对比;看各库给出的城市是否集中在同一大区
公司网络显示成总部城市企业统一出口查出口 IP 的 ASN 和组织名,通常是企业专线或总部所在地
一个网站显示国内,另一个显示国外双栈出口不一致,或分流规则不同分别查 IPv4 和 IPv6 出口;看国内网站读到的 IP
同一 IP 在不同网站城市不同各平台数据源和版本不同多库投票,看多数意见和置信度
显示的是机房或云服务商所在地正在通过代理、VPN 或云主机上网查 IP 类型,机房 IP 和家宽 IP 的判断见下文链接

怎样自己查清楚:可以照做的步骤

第一步:确认真实出口 IP,分 IPv4 和 IPv6

在终端执行:

# 只走 IPv4
curl -4 -s https://www.cloudflare.com/cdn-cgi/trace | grep -E '^(ip|loc)='
# 只走 IPv6(没有 IPv6 会报错,属正常)
curl -6 -s https://www.cloudflare.com/cdn-cgi/trace | grep -E '^(ip|loc)='

ip= 是出口地址,loc= 是 Cloudflare 判断的国家。两次结果如果国家不同,先解决双栈不一致,再谈归属地。

第二步:查地址段登记给了谁

whois 你的IP | grep -iE 'netname|descr|country|org'
# 或者用 RDAP(亚太地区的地址可直接查 APNIC)
curl -s https://rdap.apnic.net/ip/你的IP | python3 -m json.tool | grep -E '"name"|"country"|"handle"'

这里能看到地址段的网段范围、登记组织和国家。注意它告诉你的是“谁持有这段地址”,不是“这个 IP 现在在哪个城市”。

第三步:多库对比,而不是只信一个

打开 cdnping 的 IP 与环境检测,“出口 IP 情报”一栏会用 11 个地理库投票给出位置,并附上置信度,同时显示 RDAP 注册信息和 IP 类型(机房、家宽、移动、Tor)。读结果时按下面的顺序看:

  1. 国家是否一致。国家一级通常比城市一级稳定,如果出现分歧,优先怀疑代理、双栈或刚易手的地址段。
  2. 省份是否多数一致。11 个库里多数给同一个省,少数给邻省,可以基本认定多数意见;少数派往往是旧记录。
  3. 城市分散时,看是否集中在一个大区。移动网络和 CGNAT 地址常见这种情况,这时城市级结果本身就不可靠,置信度也会偏低。
  4. 对照 IP 类型。显示为机房 IP,说明你走的是服务器出口,归属地反映的是服务器所在地,和你本人位置无关。区别见 机房 IP 和家宽 IP 有什么区别。

第四步:换一个网络再查一次

手机流量和 Wi-Fi 各查一次,对比出口 IP、运营商和多库结果。如果换网络后归属地正常了,问题出在那条网络的出口,而不是你的设备。

第五步:看国内网站读到的是哪个 IP

开了分流规则时,国内网站和国外网站看到的出口可能不同。cdnping /ip 的“大陆分流检测”会读取多家国内 CDN 回传的客户端 IP,告诉你当前属于“大陆分流 / 全局代理 / 国内直连”中的哪一种。原理见 国内网站如何看到你的真实 IP,分流的概念可以看 分流(split tunneling)是什么。

多个库给出不同城市,到底信哪个?

几条经验:

  • 多数意见通常比单一来源可靠,但不是绝对。地址段刚被调配时,可能大多数库都还没更新,少数更新快的反而是对的。这时可以结合 RDAP 的登记变化和你自己换网络的结果一起判断。
  • 置信度低时,别在城市一级较真。移动网络、CGNAT、企业出口这类地址,城市级结果本来就难以准确,能看的主要是省份。
  • 原生 IP 和广播 IP 要分开看。有些地址段在一个国家注册,却被宣告到另一个地方使用,数据库容易按注册地标注。判断方法见 原生 IP 与广播 IP。
  • 平台显示的属地以平台为准,但不等于你的真实位置。平台展示的是它所用数据源的查询结果,你在第三方工具上查到不同城市,两者都可能“各自正确”。

关于“IP属地显示外省”的几点提醒

  • 开关飞行模式后,手机流量可能会分到一个新的出口地址,归属地有时随之改变,但这只是换了一条地址段,并没有解决数据库本身的偏差,下次还可能再出现。
  • 平台展示 IP 属地有其规则和监管背景,本文只解释技术原因,不讨论如何改变平台显示的属地。请遵守平台的服务条款和当地法规。
  • 如果你只是想知道自己的 IP 暴露了哪些信息(位置精度、运营商、类型、信誉),可以读 你的 IP 地址到底暴露了什么。

相关文章

继续阅读