已声明的中继家族:Tor 路径构建为何避开同一运营者的链路
在 Tor 的大部分历史中,运行多台中继都伴随着一小份额外管理工作:在每个 torrc 里写一行 MyFamily,列出同一运营者控制的全部其他中继的指纹。这一机制如今已退出网络,多中继运营者应改用基于密钥的继任机制来声明家族。这个选项当初存在的原因并未改变,对今天正在添加第二台中继的人来说,值得再讲一遍。
家族声明是做什么用的
中继家族是处于同一管理控制之下的一组中继:同一个人、同一个组织,或一台主机上运行的多个 tor 实例。声明是为路径构建而存在的。Tor 客户端会尽量避免把同一家族的两个成员放进同一条链路,因为一条入口和出口都听命于同一方的链路,正是端到端关联攻击所需的全部条件:入口看到客户端,出口看到目的地,而同时掌握两端的单个运营者就能把它们拼在一起。当两个中继都声明属于同一个「家族」时,Tor 客户端不会在同一条链路中使用它们。社区文档对继任选项的描述如出一辙:FamilyID 的作用就是告诉 Tor 客户端哪些 Tor 中继由同一个实体、运营者或组织控制,从而避免同一运营者的中继出现在同一条链路的多个位置。缺少这一信号时,路径选择会把相关的中继当作陌生节点。
当运营者忘记声明时
旧设计完全依赖运营者在每台中继上做登记并保持同步。共享同一运营者却未提交声明的群体对路径选择是不可见的:网络会把它们的中继当作独立参与者统计。这会扭曲用于描述网络的多样性统计,也会削弱客户端实际获得的保护,因为客户端侧的规则恰好止步于已声明内容的边界。 由资深中继研究者 nusenu 运营的 OrNetStats 项目多年来一直在跟踪这一点。它把中继聚合为「有效家族」——即相互配置了 MyFamily 的中继——其长期关注的问题包括哪些中继群体可能存在 MyFamily 配置错误、哪些可能通过端到端关联给 Tor 用户带来风险。它的专项报告只在这种组合现实可行时才列出运营者:guard 和 exit 概率大于零、没有正确配置的家族、且中继分布在不止一个 /16 网络块——换句话说,就是真正可能同时握住一条链路两端的群体。报告指出,家族一旦正确配置,相关中继一两天内就会从页面上消失。 联系信息也属于同一个故事。ContactInfo 是一个未经身份验证的字符串,OrNetStats 指出这让恶意实体得以冒充其他中继运营者,而且据其所述这种冒充已在现实中被利用。因此该项目在可用时会显示经身份验证的中继运营者标识(AROI),它把联系数据绑定到运营者必须实际掌握的 DNS 或网页服务器控制权上。从 MyFamily 到 Happy Families
旧机制的扩展性也很差。每台中继都必须列出所有其他成员,任何变动都要求所有成员更新配置。Nick Mathewson 于 2020 年 5 月撰写的第 321 号提案给这笔开销算了账:按 2025 年 2 月的测量,家族声明占到微描述符内容的 55% 以上,而增删一台服务器都要求所有其他服务器修改 torrc 设置。 2021 年 11 月关于更简便家族声明方式的意见征集得到了包括 nusenu 在内的运营者的回应,最终形成的设计在改变机制的同时保留了安全属性:运营者一次性生成家族签名密钥,把密钥交给家族中的每台中继,并设置 FamilyId 选项。成员关系通过中继描述符中的证书来证明,目录权威则发布紧凑的 family-ids 行,取代平方级增长的指纹列表。社区指南把这个设计称为 Happy Families;它已在 Tor 0.4.9 系列和 Arti 1.4.1 中实现。 过渡于 2026 年收尾。0.4.8 系列——最后一个要求 MyFamily 与新机制并存的系列——已于 6 月 1 日到达生命周期终点,而 9 月 1 日被定为 0.4.8 及更早版本的客户端不再保证能在网络上工作的日期,旧的家族行随之废弃,以节省客户端的目录带宽。社区门户如今明确表示 MyFamily 已被移除,并引导多中继运营者使用 FamilyID 和有效的 ContactInfo。工具生态也已跟进:ansible-relayor 角色在其 2026 年 6 月的版本中放弃了对 MyFamily 的支持,并指出所有受支持的 tor 版本都已支持新设计。面向多中继运营者的实务建议
- 在每台中继上运行受支持的 tor 版本;网络已不再承载旧的家族行。
- 用 tor --keygen-family 生成家族密钥,把密钥文件复制到每台中继的 KeyDir,在 torrc 中加入一行 FamilyId,然后重新加载。
- 分阶段轮换密钥:先让新 FamilyId 与旧配置并存,等待几天完成传播,再移除旧行。
- 设置有效的 ContactInfo——手册一向要求多中继运营者这样做——并考虑发布 AROI,以免你的运营者身份被冒用。
- 检查网络如何看你:OrNetStats 的家族页面及其端到端关联报告会显示你的中继是否被正确分组。










