我们在家使用 ipinfo,或者如何在 CLI 中通过延迟进行 IP 地理定位
Source: Hacker News
(未提供需要翻译的正文内容。如需翻译,请粘贴完整的文本。)
TL;DR
我制作了一个 CLI 工具,可以将 IP 地址解析为国家、美国州甚至城市。
GitHub – geolocation‑tool
它运行良好,并验证了 ipinfo 的结果。
Background
最近我阅读了ipinfo finally proved所揭示的内容,这正是大多数技术人员所假设的:VPN 提供商并没有在数百个国家维护大量的基础设施。他们只是通过向 ARIN、RIPE 和 Geo‑DB 提供商有意提供错误的位置信息(即 geofeeds),来伪造 IP 地理位置。
与其他 Geo‑IP 提供商相比,他们的结果来源于一种新颖的方法。根据他们的博客以及 Hacker News 的评论,他们构建了一个庞大的探针网络,并利用它追踪并 ping 互联网上的每一个(或大多数)IP 地址。
这些延迟和跳数数据——结合先进的算法和交叉引用——提供了一种可靠的方式来准确检测 IP 地址的物理地理位置,而无需依赖公共来源中被伪造的数据。
这种方法完全合理,我确信他们的客户也非常认可并在很大程度上依赖它。
我的实验
我还不能从数百个地点 ping 每一个 IP 地址,但我可以使用 Globalping 对一个有限的子集进行操作。因此,我决定尝试复现 ipinfo 的结果,并构建一个任何人都可以使用的小工具。
Globalping 是一个开源、社区驱动的项目,允许用户自行托管基于容器的探针。这些探针会成为我们公共网络的一部分,任何人都可以使用它们运行网络测试工具,如 ping 和 traceroute。

目前网络拥有 超过 3 000 台探针,理论上足以将几乎任何 IP 地址定位到国家乃至美国州级别。
为了自动化并简化这一过程,我使用 globalping‑ts 库编写了一个小型 CLI 工具。我的最初想法很简单:
- 接受单个 IP 作为输入。
- 在每个大洲各 ping 几次,以选定目标大洲。
- 从该大洲的众多探针对该 IP 进行 ping。
- 对结果进行分组和排序;延迟最低的国家应为正确答案。
- (加分项) 如果获胜国家是美国,则对美国各州重复相同的过程。
我所要做的只是创建几个测量,并使用 Globalping 的 magic field 传入所需位置,该字段会自动选择一些符合位置和限制的伪随机探针。
Source: …
实现细节
- 首次尝试 – ICMP ping(2 个数据包) – 速度太快,但大多数网络会阻止 ICMP。
- 改用基于 TCP 的 ping – 需要尝试多个常用端口;结果证明既复杂又不可靠。
- 最终方案 – traceroute – 完全可行。即使目标阻止 ICMP,上游网络通常仍然允许,而最后一跳通常位于同一国家。
得到的数据并非 100 % 完美。更稳健的方案应当:
- 使用多种方法(不同端口的 TCP、UDP traceroute)。
- 分析最后几跳,而不是仅仅分析一跳。
- 将 ASN 注册信息和公开 WHOIS 信息以加权“投票”方式结合。
- 将低确定性的 IP 标记为需要使用更多探测重新测试的对象。
这正是商业供应商的工作——而这正是 ipinfo 所做的。
洲检测
我对每个洲使用了 5 次探测。结果非常准确;只有位于洲际“边界”上的 IP 可能需要更多探测。
示例 – 我的家庭 IP(中欧):
Phase 1: Detecting continent...
North America: 137.18 ms
Europe: 32.39 ms
Asia: 174.54 ms
South America:215.08 ms
Oceania: 244.15 ms
Africa: 156.83 ms
国家检测
Phase 2 在获胜的大洲上进行一次测量,使用更高的探针上限。
- 起始使用 250 个探针 – 精度极高。
- 默认降至 50 个探针 – 仍然非常好,并且保持在未认证的 Globalping API 限额范围内(每个 IP 每小时 250 次测试, 每次测量 50 个探针)。
提示: 在 dash.globalping.io 注册免费账户,并使用令牌进行身份验证,可获得每小时最多 500 次测试。
如果需要更多测试,你可以:
- 自行托管探针(可产生被动积分),或
- 通过 GitHub Sponsors 捐助 – 我们会自动为你的账户充值。
示例输出(50‑探针运行):
Phase 2: Detecting country...
Measuring from 50 probes...
[████████████████████████████████████████] 100.0% 50/50 - Best: PL (7.29 ms)
Top 3 Locations:
─────────────────────────────────────────────────
1.. Poland, EU 7.29 ms
2.. Germany, EU 13.42 ms
3.. Lithuania,EU 15.87 ms
结束语
使用分布式探针网络的基于延迟的测量方法在地理定位方面出乎意料地有效。虽然我的 CLI 工具只是一个简单的概念验证,但它表明任何人都可以在不依赖(常常被篡改的)公共 Geo‑IP 数据库的情况下实现相当不错的准确性。
欢迎查看源代码,亲自运行,或贡献改进! 🚀
摘要
Location: Poland, EU
Minimum Latency: 7.29 ms
Confidence: Medium
太好了,现在我们有了一个基本的 IP‑到‑国家解析器,只需要几秒钟就能给出响应,而且我甚至不需要理解或编写任何复杂的数学。虽然我确信更聪明的人可以使用公式,以更少的探测次数和更高的准确率来定位 IP。
第 3 阶段 – 检测美国州
Phase 3: Detecting US state...
Measuring from 50 probes...
[████████████████████████████████████████] 100.0% 50/50 - Best: FL (0.45 ms)
Top 3 Locations:
─────────────────────────────────────────────────
1. Florida, USA 0.45 ms
2. South Carolina, USA 12.23 ms
3. Georgia, USA 15.01 ms
═══════════════════════════════════════════════════
SUMMARY
═══════════════════════════════════════════════════
Location: Florida, United States
Minimum Latency: 0.45 ms
Confidence: Very High
═══════════════════════════════════════════════════
工具的结果一致——佛罗里达是正确的位置。但这个系统的准确度到底有多高?我们能否扩展它以显示城市?
第 4 阶段 – 检测城市
Phase 4: Detecting city...
Measuring from 36 probes...
[████████████████████████████████████████] 100.0% 36/36 - Best: Miami (0.00 ms)
Top 3 Locations:
─────────────────────────────────────────────────
1. Miami, Florida, USA 0.00 ms
2. West Palm Beach, Florida, USA 4.36 ms
3. Tampa, Florida, USA 5.85 ms
═══════════════════════════════════════════════════
SUMMARY
═══════════════════════════════════════════════════
Location: Miami, Florida, United States
Minimum Latency: 0.00 ms
Confidence: Very High
═══════════════════════════════════════════════════
当前的结果已经不错,但仍有提升空间。主要问题出在 magic field 的工作方式上:例如将 “Europe” 设为位置时,它会在所有欧洲探针之间分配测试,但 并不 保证每个国家都会被包含。这可能导致与目标 IP 位于同一国家的探针被遗漏,从而使工具误以为该 IP 位于相邻的国家。
建议的修复
- 将选择逻辑更改为手动为每个大洲的每个国家(以及美国的每个州)设置。
- 将完整的国家/州列表传递给 Globalping API,以便在每个位置至少选择一个探针。
- 控制每个位置的探针数量以提高准确性。
北美示例(43个国家/地区):
| 国家 | 推荐探针数 |
|---|---|
| 美国 | ~200 |
| 加拿大 | ~20 |
| 墨西哥 | ~10 |
| …(其他地区) | 每个 1‑5 |
该工具的目标是使用 最少 数量的探针,以便未认证用户能够轻松测试。当前的方法运行良好,实现简单,并且可以通过提高探针限制来调节准确性。
总体而言,基于延迟的地理位置检测是验证 IP 所在位置的可靠方法——前提是拥有足够的观测点。在覆盖极少或没有覆盖的地区,它会表现不佳。
运行工具
geolocate $IP
使用 --limit 标志可以增加每个阶段的探测次数,但请记住它会作用于 所有 阶段,并可能快速消耗你的配额。
完整文档可在 GitHub 仓库中查看。
贡献
欢迎提交改进的拉取请求!
如果您需要免费积分进行实验,请随时发送电子邮件至 。
部署探针
运行探针就像启动容器一样简单:
docker run -d ghcr.io/jsdelivr/globalping-probe