biancajacobi/robust-ipgeo
GitHub: biancajacobi/robust-ipgeo
该项目研究如何从多个异构且质量未知的 IP 地理定位数据源中,通过稳健的统计算法和校准的置信度度量,聚合出可靠的参考位置估计。
Stars: 0 | Forks: 0
# robust-ipgeo
**从质量未知且高度异构的多个 IP-geolocation 数据源中进行稳健的参考位置估计——包含真值评估、单次估计的置信度度量,以及防篡改的溯源链。**
## 项目简介
免费的 IP-geolocation 数据库在对同一个 IP 地址进行定位时常常会出现分歧——误差往往高达数百公里——并且它们在市级别的准确度也仅属一般。本项目旨在研究如何将多个不可靠的数据源稳健地聚合为一个单一的参考位置,如何通过置信度度量来量化每次估计的结果,以及如何让整个 pipeline 具备取证级别的可记录性。
这是一个自包含、可复现的参考实现,并附带了结果产物。实现中不包含具体的 IP 地址;详情请参阅下文的 *数据与隐私*。
## 实现方法
- **Estimators**(连续二维):坐标平均值、分量中位数、截尾均值、几何中位数(Weiszfeld / L1-median),以及核心的**基于 accuracy-radius 和 provider-line 加权的几何中位数**。
- **Provider-line weighting** 会合并具有相关性的数据源(例如转售相同上游数据的数据库),这样它们既能保留又不会在聚合结果中占据主导地位。
- **置信度度量 `S`**:line-weighted 的 *support concentration*——即在估计点周围 50 公里核心区域内,经过有效的 line-deduplicated 处理后的数据源质量占比;在集外评估中,它被校准为用于衡量聚合失败的风险评分。
- **对比方法**:基于 Brätz 提出的 class-/density-based estimator,本项目对其进行了重新实现与深入评估。
- **Ground truth**:RIPE Atlas anchors(主要数据源)加上探索性的 RIPE Atlas *probe* 压力测试(住宅 / NAT / 移动网络)。误差度量标准:Haversine 距离。
## 仓库结构
```
estimators/ aggregation estimators (baselines + Brätz)
eval/ metrics (Haversine), evaluation pipeline, reporting
eval/out/ result tables (CSV) and figures (PNG) — anchors
eval/out_probes/ result tables/figures — probe stress test
experiments/ studies T1–T6, RIPE-Atlas-probe comparison + sensitivity/edge-case checks
data/ data acquisition (RIPE Atlas, geolocation sources), default detection, provenance store
tests/ unit tests (46, pytest)
notebooks/ results dashboard (reads eval/out, runs without raw data)
docs/ data sources & experiment mapping
```
## 复现步骤
```
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
```
- **经过假名化处理的输入数据集**包含在 `data/cache/` 目录下(`anchors.csv`,`observations.csv`,`probes.csv`,`observations_probes.csv` 等):IP 地址、RIPE 节点 ID 和 hostname 均已被替换或移除(使用稳定的假名 `node_NNNNN`),但保留了坐标信息。因此,`experiments/` 中的实验脚本可以**直接**在这些数据上运行(映射关系见 `docs/experimente.md`)。
- 结果表格和图表也分别提供在 `eval/out/`(针对 anchors)和 `eval/out_probes/`(针对 probe 压力测试)目录中;`notebooks/explore.ipynb` 中的 dashboard 仅依赖于这些产物即可运行。
- 若要从头重新获取原始数据:请将 `.env.example` 复制为 `.env`,填入离线数据库的下载密钥,然后运行 `data/fetch_*.py` 脚本。
- **数据集切换**:设置 `GEOIP_DATASET=probes` 以针对 probe 数据集运行 pipeline(具有独立的缓存/输出),例如:
`GEOIP_DATASET=probes python experiments/run_probes_suite.py`。
## 主要发现
- 基于 accuracy-radius 和 line-weighted 的几何中位数在绝对误差中位数上优于大多数单一数据源,并且性能退化更加平缓;几何中位数在有效污染程度达到约 37.5%(崩溃点介于 37.5% 和 50% 之间)之前均能保持稳健,而简单的均值法则会立刻失效。
- Line-weighted 的 support concentration `S` 将先前基于双轴标签的集外预测技能提高了三倍,并在事前揭示了大部分的聚合失败情况(在 41% 的标记率下,召回率从 72% 提升至 92%)。在协同污染下,被劫持的估计值在 α = 0.5 之前都能保持在标记阈值以下——防护机制自身具有更高的崩溃点(约 0.83 line mass)。
- 敏感性与边缘情况检查已实现脚本化并有产物存档(`docs/experimente.md`):ipapi.co 的纳入(一个单一的 weight-mass knife-edge anchor)、`reallyfreegeoip` 的 line 定义(数据来源相同但数据状态不同)、antimeridian(反子午线)处理以及 Bonferroni 校正后的 bootstrap CIs。
- Brätz 的对比方法表现不及稳健的 estimators,且其置信区间校准严重失准——这是由相关的数据源副本导致的。
- Probe 压力测试证实了接入类型的难度梯度(数据中心 < 家庭/NAT < 移动网络);真正具有挑战性的移动网络/CGNAT 群体超出了本次测试的范畴(详见 `docs/datenquellen.md`)。
## 溯源 / 监管链
数据采集层(`data/store.py`)实现了一个仅追加的、**防篡改的 SHA-256 哈希链**:每次抓取记录都会包含数据源、版本、时间戳和内容哈希,且每条记录都与前一条记录链接在一起(`store.verify_chain()`;CLI 命令为 `python data/fetch_anchors.py --verify`)。这确立了采集记录的内部完整性;但它并不能替代外部的时间戳认证机构。具体的账本文件和原始证据证明了原始(未经脱敏的)语料库,因此**未包含在**这个保护隐私的发布版本中。
## 数据与隐私
- 输入数据衍生自 **RIPE Atlas**,这是一项公共的网络测量基础设施。**本发布版本中不包含任何具体的 IP 地址**——节点标识符已经过假名化处理。数据源的坐标(属于公共基础设施的位置)予以保留,以确保 pipeline 的可复现性。
- 处理过程中仅涉及公共基础设施的 IP;不包含任何个人数据。
## 许可证
代码:MIT(见 [`LICENSE`](LICENSE))。数据衍生自 RIPE Atlas,并受 RIPE Atlas 使用条款的约束。
标签:IP地理定位, Maltego, Python, 安全规则引擎, 数据融合, 无后门, 统计分析, 逆向工具