Tor — 用三层洋葱皮让没人知道你在上网
待复核Tor 是一个低延迟的匿名通信系统——你的流量经过三个中继节点(relay,负责转发的志愿机器),每一跳都剥掉一层加密,最后到达目标网站,途中没有任何单个节点能同时知道”谁在发”和”发给谁”。日常类比:你想寄一封匿名信,于是把信装进三层信封,最外层写着中间人 A 的地址,A 拆一层看到中间人 B 的地址转寄,B 再拆一层看到中间人 C 的地址转寄,C 拆掉最后一层取出信投递。每个中间人只知道自己的前后一站,没人能把寄信人和收信人对上。
这篇论文是 2004 年 USENIX Security 的工业级设计文档,在美国海军研究实验室 1990 年代第一代洋葱路由的基础上做了大幅改进:加入前向安全、目录服务器、拥塞控制、隐藏服务等。截至 2020 年代,Tor 网络仍有约 7000 个志愿中继在运行,是目前互联网上部署最广的匿名通信基础设施。
不理解 Tor,下面这些事都没法解释:
- 为什么
.onion域名能让服务端也匿名——不是只保护客户端,服务器 IP 同样隐藏 - 为什么端到端加密(如 HTTPS)保护内容,但不保护”谁和谁在通信”这个元数据——Tor 专门解决的就是元数据泄漏
- 为什么匿名网络选择”低延迟 + 非完美安全”而不是”高延迟 + 理论完美”——这是实际部署的工程取舍
- 为什么全球监控者(能看到所有流量的对手)仍然能通过流量关联攻击破解 Tor——论文自己承认了这个边界
论文的关键贡献可以拆成四块:
-
伸缩式电路构建(telescoping circuit construction):第一代洋葱路由一次性把整条路径的密钥打包成一个”洋葱”交给第一跳。Tor 改成逐跳协商——先跟节点 A 建 TLS 连接并协商密钥,再通过 A 向 B 发 EXTEND 命令协商第二层,再通过 A→B 向 C 协商第三层。类比:不是一次塞好三层信封,而是每到一站再加一层锁。好处:每一跳独立做 Diffie-Hellman(双方各出一半秘密拼出共享钥匙)密钥交换,攻破一个节点不影响其他层。
-
前向安全(perfect forward secrecy):每条电路用临时密钥,电路关闭后密钥销毁。即使将来中继的长期私钥泄漏,过去录到的加密流量也解不开。类比:你每次通话用一次性密码本,通话结束撕碎,事后录音也没法破译。
-
目录服务器 + 出口策略:一组受信任的目录服务器维护”哪些中继在线、带宽多少、出口策略是什么”的签名列表。出口策略让每个中继自己声明”我愿意转发到哪些端口和 IP 段”。类比:黄页只登愿意接单的快递员,且每人可贴纸条写”只送市区、不送快递柜”。
-
隐藏服务(hidden services):通过引入点(introduction point)和会合点(rendezvous point)让服务器端也匿名。服务器不直接暴露 IP,而是在 Tor 网络内设一个”约会地点”,客户端和服务器各自建一条电路到那里碰头。
通信最小单位是单元(cell),固定 512 字节。控制单元在相邻节点间传递(CREATE / DESTROY 等);中继单元沿整条电路传递用户数据(RELAY DATA、RELAY EXTEND、RELAY BEGIN、RELAY SENDME——每收约 100 个数据单元回一个 SENDME,类似 TCP 窗口)。
案例 1:一条 Tor 电路的建立过程
Section titled “案例 1:一条 Tor 电路的建立过程”假设你要访问 example.com,Tor 客户端(OP,onion proxy,本机上的洋葱代理)大致做:
1. 目录 → 选 Guard / Middle / Exit2. OP ↔ Guard: CREATE → 共享密钥 K13. OP → Guard: RELAY EXTEND(Middle) → 协商 K24. OP → … → Exit: RELAY EXTEND(Exit) → 协商 K35. 发送: encrypt(K1, encrypt(K2, encrypt(K3, data)))逐部分解释:
- CREATE:跟下一跳握手要钥匙;EXTEND:请当前电路帮你把握手转给更远的一跳
- 发送时从内到外叠三层加密;Guard 只解 K1,Exit 解到明文再交给
example.com - 关键:Guard 知道你是谁但不知道去哪;Exit 知道目的地但不知道你是谁
案例 2:隐藏服务的”约会”流程
Section titled “案例 2:隐藏服务的”约会”流程”Bob 跑一个 .onion 网站时:
Bob → 选引入点,签名发布到目录Alice → 选会合点,带一次性令牌建电路Alice → 经引入点把「会合点+令牌」转给 BobBob → 另建电路到同一会合点,出示令牌会合点 → 把两条电路接上,双方通信逐部分解释:引入点像前台传话、会合点像双方都不暴露住址的咖啡馆;全程没有人需要知道 Bob 的真实 IP,Alice 的 IP 也被自己的电路盖住。
案例 3:出口策略的工程意义
Section titled “案例 3:出口策略的工程意义”中继管理员可在配置里声明出口范围(示意):
# 只做中间转发,不当出口ExitPolicy reject *:*
# 只允许网页出去ExitPolicy accept *:80ExitPolicy accept *:443ExitPolicy reject *:*逐部分解释:大学机房可设 reject *:* 避免垃圾邮件投诉,仍贡献中间带宽;论文指出出口策略降低志愿者法律风险,是大规模部署的关键设计。
- Tor 不防全局观察者:若对手能同时监控入口和出口,用时间关联(入口发 500 字节、约 50ms 后出口出现同类流量)就能把两端对上——这是威胁模型边界,不是 bug。
- DNS 泄漏是常见失误:应用自己查 DNS 而不走 Tor 的 SOCKS 接口,ISP 仍能看到域名;应走 SOCKS4A/SOCKS5 把域名也交给 Tor。
- 出口节点能看到明文:出口到目标若不是 HTTPS,出口能读内容;Tor 保护身份不保护内容,内容靠 TLS。
- 低延迟换安全性:mix 网络(如 Mixminion)用延迟/重排/填充更抗分析;Tor 为网页交互选低延迟,更容易被流量关联。
适用 vs 不适用场景
Section titled “适用 vs 不适用场景”适用:
- 保护上网者身份不被目标站和本地网络知道(记者、活动人士、隐私用户)
- 隐藏服务:服务器不想暴露 IP(匿名举报、SecureDrop)
- 绕过区域性封锁——目录与网桥(bridge)帮助在审查环境接入
- 安全研究中隐藏来源 IP;典型网页浏览可接受约数百毫秒到数秒的三跳延迟
不适用:
- 抵抗全局被动观察者(控制大量 ISP 的国家级对手)——论文自己划了这条线
- 需要高匿名性的邮件——应选高延迟 mix 网络
- 高带宽应用(视频流、大文件)——三跳 + 志愿带宽,体验差,常不适合 >1–2 Mbps 持续吞吐
- BitTorrent 等 P2P——长连接占满稀缺带宽,且协议易泄漏真实 IP
历史小故事(可跳过)
Section titled “历史小故事(可跳过)”- 1990s 中期:NRL 的 Syverson、Reed、Goldschlag 提出第一代洋葱路由——最初动机是让情报分析师在公开网上搜集信息不暴露身份
- 悖论:若只有情报机构在用,“使用洋葱路由”本身就是标签;匿名系统需要大量普通人一起用才有效
- 2002:Dingledine 与 Mathewson(论文署名为 The Free Haven Project)加入并重写代码,补前向安全、多目录、TCP 流等
- 2004:论文发表时约 30 多个志愿节点;到 2024 年超过 7000。“second-generation”强调这是对第一代的工程重写,不是学术原型
- 匿名 ≠ 加密:加密保护内容,匿名保护身份;Tor 管后者,前者要 TLS/HTTPS。
- 逐跳协商比一次性打包更稳:伸缩式电路让每跳独立协商密钥——最小权限在密码学里的体现。
- 部署需要工程妥协:出口策略、目录服务器、低延迟,都是”理论纯度”让步于”实际可用”;用户基数本身就是匿名性来源(论文所谓 anonymity loves company)。
- 威胁模型要画边界:论文明确”不防全局观察者”;设计安全系统的第一步是说清防谁、不防谁。入口守卫(Guard)是论文之后的部署演进:客户端固定少量入口一段时间,降低长期随机撞上坏入口的概率。
- Tor 项目官网与协议规范:torproject.org / torspec
- 第一代洋葱路由:Goldschlag, Reed, Syverson, “Hiding Routing Information”, Information Hiding 1996
- mix 网络与高延迟匿名:Chaum, “Untraceable Electronic Mail…”, 1981
- 隐藏服务演进:Tor Rendezvous Specification v3(Ed25519 身份密钥等)
- aes —— Tor 使用 AES-128-CTR 作为对称加密
- libsignal —— 端到端加密的工程实现,侧重消息而非网络层
- aes —— Tor 的中继单元加密使用 AES-128-CTR 模式
- libsignal —— Signal 保护消息内容,Tor 保护通信元数据,两者互补
- akamai-2002 —— CDN 把内容推向用户以提速,Tor 把流量推过中继以匿名
- fielding-rest-2000 —— REST 定义 Web 通信架构,Tor 在其上叠加匿名层
- cook-levin —— Tor 的安全性基于计算困难假设(DH),而非信息论完美
- chaum-1981-mix —— 高延迟 mix 是 Tor 低延迟路线的对照系
- autograph-2004 —— Autograph 2004 — 自动给蠕虫写内容签名
- chaum-1981-mix —— Mix Network — 用信封套信封让邮局也不知道谁寄给谁
- danezis-sphinx-2009 —— Danezis-Sphinx 2009 — 把匿名转发包压到可实用的大小
- dingledine-mixminion-2003 —— Mixminion — 用一次性回信票据保护匿名邮件
- kocher-spectre-2019 —— Spectre — CPU 猜错路时也会泄密
- piotrowska-loopix-2017 —— Loopix — 用延迟和假流量保护通信关系
- reed-onion-routing-1998 —— Onion Routing 1998 — Tor 前身把匿名连接做成网络积木
- shadowsocks-libev —— Shadowsocks-libev — 嵌入式设备上的轻量 SOCKS5 加密代理