Skip to content

手机基站IP查出来不对?试试IPv6二次查询

"为什么我的手机IP归属地查出来总是不对?"这是我在技术群里被问得最多的问题之一。

不是接口坏了,也不是数据错了,问题出在手机基站网络这个特殊的网络环境上。这篇讲清楚原因,以及一个立竿见影的解决办法:IPv6二次查询。

为什么手机IP会"不对"

手机走蜂窝网络(4G/5G)时,你的流量要经过运营商的基站、汇聚节点、再到核心网。而运营商给手机用户分配的IPv4地址,往往是从省级或市级的核心节点统一出口的。

于是就会出现这种情况:

  • 你人在苏州的某个区,但IP归属地显示在"南京"(省会出口);
  • 你手机连着基站,基站可能跨了区,IP就跟着"跳"了;
  • 更极端的情况,同一部手机在不同的时间,IP归属地能显示不同的城市。

这不是"查错了",而是蜂窝网络IPv4的天然特性。 数据源再准也改不了这个事实。

为什么IPv6会好一些

这几年运营商大规模推IPv6,给移动用户分配IPv6地址时,分配机制相对更贴近实际接入的基站/汇聚节点

打个不严谨但好懂的比方:

IPv4像是在"省城邮政总局"统一给你发件,所以从哪儿看都在省会;IPv6更像是"就近的邮局"给你发件,能更接近你所在的位置。

所以同样的手机,用IPv6查归属地,通常比IPv4准一个级别(能到市甚至区)。

具体怎么操作

方案A:优先用IPv6

如果你的应用能同时拿到用户的IPv4和IPv6(比如用户同时通过v4和v6访问),那就优先查IPv6

python
def query_user_location(ipv4, ipv6):
    target = ipv6 or ipv4   # 优先v6
    r = requests.get(f"https://ip9.com.cn/get?ip={target}", timeout=3)
    d = r.json()
    if d.get("ret") == 200:
        return d["data"]
    return None

方案B:IPv6二次确认

如果你已经用IPv4查了一次,结果跟用户实际位置差得离谱,可以再拿IPv6查一次对比:

python
def double_check(ipv4, ipv6):
    info_v4 = query(ipv4)
    info_v6 = query(ipv6) if ipv6 else None
    if info_v6 and info_v6.get("city") != info_v4.get("city"):
        # 以v6为准,更接近真实位置
        return info_v6
    return info_v4

方案C:判断是否蜂窝网络

接口返回里如果能看到运营商信息(isp),再结合"是不是移动网络"判断。不过更实用的做法是:只要用户IP是IPv6,就默认按IPv6查询,不用纠结。

一个重要的提醒

IPv6二次查询不是万能的。以下几种情况,IPv6也救不了:

  • 用户开了VPN/代理:查出来是代理服务器位置,跟用户无关;
  • 用户走的企业WIFI:出口在企业,位置是企业所在地;
  • 运营商IPv6出口也集中在某几个节点:部分场景仍有偏差。

所以我的建议是:IPv6二次查询作为"提升准确率的手段",而不是"绝对正确的保证"

什么时候该用这套

  • 同城推荐本地生活这类对位置敏感的,值得用;
  • 属地展示的,能准一点是一点;
  • 风控的,注意:位置不准会导致误判,IPv6二次查询能减少一部分误伤。

说在最后

手机基站IP的问题,是整个行业的通病,不是你一个人遇到。搞清楚原理,用对方法(IPv6优先),你的"手机用户IP不准"困扰能解决一大半。

剩下的那点误差,就交给时间——等IPv6普及率再高一点,这个问题会越来越小。

IP9 支持IPv4和IPv6查询:https://www.ip9.com.cn