把匿名网络画成一颗地球:互动区上线,以及我们在开放数据上撞到的墙¶

文档站新增了互动与呈现区,目前放了三件作品,都以 Tor 为题。其中数据量最大的是 Tor 中继地球仪,把全球近万台运作中的中继标到球面上,超过六成集中在美国、德国、荷兰三个国家。
做这颗地球仪的过程中,我们查了二十几份公开数据,最后能用的只有六份。卡住的原因几乎都跟技术无关。API 大多打得通,数据格式也干净,挡下来的是条款不给我们把它再发出去。
为什么要做成画面¶
匿名网络的基础建设很难用文字描述清楚,难在两件事上:顺序,还有规模。
顺序的部分,Tor 是最好的例子。数据包在三个中继之间依序前进,每经过一跳剥除一层加密,到出口才还原成原本的请求。哪一层在哪一跳剥掉、每一站看得到什么,都由这个顺序决定。文字写得再仔细,读者脑中仍然要自行补上动起来的那一段,而每个人补出来的版本未必相同。
规模则更难传达。「近万台中继,高度集中在少数国家」是一句读过即忘的叙述。把每一台实际标记到地球上,北美与西欧连成一片光带,其余地区仅零星数点。同一份数字换成画面,读者不必信任我们的形容词,可以自己看。
地球仪用到的六份数据¶
最后进到画面上的有这几份:
| 数据 | 来源 | 许可 |
|---|---|---|
| 中继分布 | Onionoo | CC0 1.0 |
| 用户与网桥人数 | Tor Metrics | CC0 1.0 |
| 连线受阻的观测 | OONI | CC BY-NC-SA 4.0 |
| 断网事件 | Access Now KeepItOn | CC BY 4.0 |
| 海底电缆 | OpenStreetMap 贡献者 | ODbL 1.0 |
| 国界与海岸线 | Natural Earth | public domain |
Onionoo 的中继快照经过蒸馏,只保留国家层级的聚合,内容不含 fingerprint、nickname、IP 或联络信息。ASN 的登记名称另外过滤过,因为个人申请的 AS 在 RIR 上登记的就是持有人本名。对于在审查严格的地区跑中继的人来说,那等于把「这台中继是谁的」跟身份证上的名字绑在一起公开。
陆地亮度可以切换四种指标。中继台数最直观。共识权重(consensus weight)反映该国实际承担的流量比重,与台数常有明显落差。单一服务商集中度是最大一家托管商占该国的比例,数字愈高代表该国的匿名流量愈依赖同一个机房的存续与配合。用户估计则是需求端的数字,跟前三个供给端指标并列时,落差本身就是信息。
数据的呈现刻意克制¶
OONI 的数据最能说明我们的取舍。它提供各国 Tor 测试的异常率(anomaly rate),数字看起来足以画一张全球审查地图,但中段是测量噪声。实测瑞士 22.2%、加拿大 21.2%、新西兰 41.1%,这些国家没有审查疑虑。把中段画成色阶,等于用噪声指控特定国家。
最后画面只标示异常率达 85% 以上且样本足够的少数国家,中段数值一律不上色,措辞也停在「没有照预期完成」。85% 这个门槛没有推导公式,是看过分布之后订的。噪声最高落在四成上下,拉到 85% 才有足够的距离,宁可漏掉几个真的受阻的国家,也不要把没问题的国家标红。
Access Now 的断网事件则相反,每一笔都经过人工查证,成因清楚,所以可以明确说明此处发生过人为断网。即使如此,武装冲突与族群冲突造成的中断未必出自政府决策,可能是战事破坏了基础设施,画面上与信息管制类分开说明。
同样的理由让我们放弃了 V-Dem 的数字社会指标。那份数据的许可技术上可用,我们仍然决定不碰。它是每个国家每年由约五位专家评分,经统计模型转成连续量表。把专家评分画成地图色块,等于用我们的画面替某个机构的政治判断背书。
撞到的墙¶
海底电缆¶
一开始想用 TeleGeography 的 Submarine Cable Map,那是这个领域最权威的数据集。查下去才发现他们现在把坐标数据当成正式商品在卖,License TeleGeography's Map Data 是年费授权,GeoJSON 经 Amazon S3 或 API 交付,每次更新自动推送。GeoJSON 就是他们的商品本体。
台湾的海缆动态地图的做法值得记下来,也是许可不明朗时最务实的选择:源代码采 MIT 开源,但几何数据放在另一个 repo,对外是 404。主 repo 的 README 直接写「You can leave the folder empty」。
那颗地球仪上的海缆最后取自 OpenStreetMap 贡献者标注的路径,228 段。覆盖以欧洲、地中海与大西洋较完整,太平洋中段几乎是空的。翻出 OSM 社群 2011 年的讨论串,当年有人提议把 TeleGeography 的数据并进 OSM,社群成员的判断是那份许可禁止商业使用与改作,跟 ODbL 不相容,那则提议没有下文。十五年过去,太平洋还是空的。
网络基础建设¶
网络基础建设这一类查了一轮,几乎全军覆没,卡住的理由还很像。
RIPE Atlas 部署在各地的探针(probe)数据很漂亮,2026 年 7 月查询时全球有近六万个探针,含经纬度与 ASN,API 直接回得出来。但服务条款写明商业使用需另外取得 RIPE NCC 许可,没有开放许可声明。PeeringDB 的 API 一样打得通,但可接受使用政策写明不可整批转散布给第三方。Packet Clearing House 的 IXP 目录是 CC BY-NC-SA 3.0,Cloudflare Radar 是 CC BY-NC 4.0,两者的非商业条款都会传染到我们的内容上。
IODA 是这里面最可惜的一份。它以 BGP 路由撤除、主动探测与 darknet 流量异常侦测各国的网络中断,是真测量,主题跟这个站高度吻合。API 回得出数据,但回应本身就带着一行 Copyright (c) 2021-2025 Georgia Tech Research Corporation. All Rights Reserved.。
还有一类更麻烦:条款完全不存在。各 RIR 的 delegated stats 文件下载得到,开头只有免责声明,没有一个字提到许可。root-servers.org 的节点清单有 JSON 端点,整站找不到许可声明。沉默无法解读成允许,比明文禁止更难处理,因为连判断的依据都没有。这一节的每一份都是同样的组合,端点开放、数据拿得到、许可不给再散布。
指数类数据¶
Freedom House 的 Freedom on the Net 与无国界记者的新闻自由指数,这两份最常被引用,也都不能用。RSF 的许可是 CC BY-ND,禁止改作,把它转成 JSON 重新呈现就违反了。Freedom House 官方页面查不到许可声明,取得数据要写信申请。
我们没有写信去问¶
上面几个机构,开放数据圈的常规做法是读完条款之后再去信问一次,通常有机会拿到非营利或研究用途的例外。我们刻意没有这么做。
整个项目想知道的正是一个下游再利用者实际会撞到什么。如果每一份卡住的数据都靠个别协商解决,我们得到的会是几封友善的回信,而不是「这个生态系对想接手的人有多友善」的答案。条款写成什么样子,就是绝大多数人实际会遇到的样子。没有人脉、没有机构背景、只是想做点东西的人,看到的就是那一页条款,所以这篇记录的是条款,不是协商结果。
我们学到的¶
最大的落差是开放 API 不等于开放数据。原本以为困难会在技术面,结果多数端点都打得通、数据格式也干净,卡住的全在条款。RIR、CAIDA、RIPE NCC、PeeringDB 这些机构的预设立场是可以看、可以研究,但不能整批搬走,那跟 Tor Metrics、OONI、Natural Earth 是完全不同的文化。连完全没写许可的沉默状态也算在内,那种数据集实务上等同不可用。业界确实有很多工具在用那些文件,但那是各自承担风险,公开发布的文档站不能比照办理。
我们的架构也不容许「应该没问题」的侥幸。文档站是静态网站,数据文件会直接发出去,而且会推上 IPFS。内容定址意味着发出去就收不回来,镜像可能长期存在。
反过来看,地球仪能做出来,很大程度是因为 Tor Project 把 Onionoo 与 Tor Metrics 都放成 CC0,Natural Earth 放成公有领域。当年那可能只是一行设定,却让十几年后一个不相干的社群能够直接拿去用,不必写信谈许可,也不必担心哪天被要求下架。
有一个技术细节值得另外记下来。OONI 那份是 CC BY-NC-SA 4.0,其中的相同方式分享(ShareAlike)跟站台的 CC BY 4.0 互不相容。处理方式是让 ooni.json 保持独立的一份,不把它的内容并进其他数据文件,画面上也只跟其他来源并列,让整体属于 CC 定义的「集合」,相同方式分享的范围停在那一份文件身上。前提已经写进 NOTICE,否则哪天有人把 OONI 的字段并进中继快照,整份衍生物就落入相同方式分享了。
其他两件作品¶
Tor 路由解谜让你自己挑三个中继组成 guard、middle、exit 路径,过程中要避开被监听的节点、把三跳分散到不同 ASN,遇到封锁改走网桥。看着电路因为三跳挤在同一个 ASN 而失败,比读十次「要分散」有效。
Tor 连线流量用发光粒子呈现两种路径的差异。连线 .onion 服务时双方各建一条三跳电路,在随机挑出的会合点相遇。连线明网网站则走三跳到出口后原路往返。
三件作品都以 three.js 在浏览器中运行,免安装,支持正体中文、简体中文与英文。源代码在 anoni-net/docs 的 docs/zh-TW/games/ 底下,没有构建流程,改完保存刷新就看得到。
有想法或想一起做,欢迎到社群找我们。