使用延迟对任意 IP 进行地理定位
Source: Dev.to
TL;DR
我编写了一个 CLI 工具,能够将 IP 地址解析到国家、美国州,甚至城市。
GitHub – geolocation-tool
背景
Ipinfo 最近展示 许多 VPN 提供商通过向 ARIN、RIPE 和 Geo‑DB 提供商提供错误信息来伪造 IP 地理位置数据。它们的高准确性来源于一个庞大的探针网络,该网络对互联网上的大多数 IP 地址进行 ping 和 traceroute,利用延迟和跳数数据(以及高级算法)推断真实的物理位置。
我想看看是否可以使用 Globalping——一个开源、社区驱动的项目,让用户自行托管基于容器的探针——在更小的规模上复现类似的方法。公共网络目前拥有 > 3000 个探针,足以将大多数 IP 定位到国家或美国州级别。
Globalping 的工作原理
Globalping 提供一个公共 API,能够从任意探针运行网络测试(ping、traceroute 等)。通过指定 location 字段,API 会选择一组大致匹配所需地区的探针。

工具设计
CLI 采用三个阶段:
- 大陆检测 – 对每个大陆的若干探针进行 ping,选出最快的。
- 国家检测 – 在获胜大陆的探针上进行大量测量,选出延迟最低的国家。
- 美国州检测 – 如果国家是美国,则在仅限美国的探针上重复该过程。
实现细节
- 库 –
globalping-ts(Globalping API 的 TypeScript 包装器)。 - 测量方式 – 最初使用 ICMP ping(2 包),但许多网络会阻止 ICMP。随后改为基于 TCP 的 ping,最终决定使用
traceroute,因为最后一跳的延迟通常与目标所在国家相同。 - 探针选择 – 使用 Globalping 的
magic字段,让服务挑选符合请求位置和限制的伪随机探针。 - 限制 –
- 大陆阶段:每个大陆 5 个探针(快速且准确)。
- 国家阶段:默认 50 个探针(符合免费层每小时 250 次测试的限制)。
- 美国州阶段:同样 50 个探针。
运行工具
# 示例:解析你自己的家庭 IP
geolocate 203.0.113.42
阶段 1 – 大陆检测
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
工具选择 Europe 为获胜大陆。
阶段 2 – 国家检测(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 17.65 ms
═══════════════════════════════════════════════════
SUMMARY
═══════════════════════════════════════════════════
Location: Poland, EU
Minimum Latency: 7.29 ms
Confidence: Medium
阶段 3 – 美国州检测(示例 IP)
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
观察
- 准确性 – 仅使用每个大陆 5 个探针和最终国家/州步骤的 50 个探针,工具就能可靠地匹配 ipinfo 发布的位置。
- 速度 – 整个过程在几秒内完成,远低于免费层 API 限额(每小时 250 次测试,每次测量 50 个探针)。
- 局限性 –
- 依赖 ICMP/UDP traceroute,可能受到阻止这些数据包的网络影响。
- 只检查最后一跳;使用多跳、TCP/UDP traceroute 或 ASN 数据可以提升置信度。
- 边界 IP(例如跨洲的 IP)可能需要更多探针才能得出决定性结果。
未来改进
- 将延迟数据与 AS‑level WHOIS 信息结合,并使用加权投票系统。
- 为处理被阻止的 ICMP 网络,添加对 TCP/UDP traceroute(不同端口)的支持。
- 将分析范围扩展到最后几跳,而非单一跳。
- 实现一个 “低置信度” 标记,触发使用更多探针的第二轮测量。
入门指南
- 创建一个免费 Globalping 账户 – https://dash.globalping.io/
- 生成 API 令牌(可选) – 可提升至每小时 500 次测试。
- 克隆仓库并安装依赖:
git clone https://github.com/jimaek/geolocation-tool.git
cd geolocation-tool
npm install
- 运行 CLI(如有令牌请替换
YOUR_TOKEN):
export GLOBALPING_TOKEN=YOUR_TOKEN # optional
node dist/index.js 203.0.113.42
如果需要的测试次数超过免费配额,你可以 自行托管探针(产生被动积分)或通过 GitHub Sponsors 支持该项目。
该工具展示了即使只使用少量全球分布的节点,基于延迟的探测也能在不依赖可能被篡改的公共数据库的情况下,提供相当准确的 IP 地理定位。