Tor技术发展报告
本篇简单梳理Tor的技术变迁,包括Tor本身以及PT协议的变化。
1. 摘要
本文梳理Tor Core与Lyrebird的重大版本变迁,并调研截至2026年7月31日,Tor Browser提供的全部四类可插拔传输协议(Pluggable Transport,PT)的关键变化,包含obfs4、meek、Snowflake和WebTunnel[1]。其中Tor Core负责网桥接入、PT进程管理及Tor网络协议,Lyrebird则是由Tor Core调用、集中实现上述四类PT客户端功能的外部程序,二者构成本文的两条版本主线。Tor Browser则是Tor最终提供给普通用户使用,访问Tor网络的工具,其中集成了Tor Core和Tor Lyrebird。本报告信息主要依据Tor Core与Lyrebird的ChangeLog、Tor官方博客以及团队部分资料整理[2-3]。
2. Tor PT与Bridge的概念界定
在Tor技术体系中,可插拔传输协议是一类以独立子进程实现的模块化抗审查机制,通过转换或转发Tor流量,降低其被审查设备识别和阻断的可能性。因此,PT属于流量混淆层面的机制协议,而不是Tor网络中的核心协议[4],仅用于帮助不能够使用原生Tor网络的用户突破网络封锁。
网桥(Bridge)则是有意不列入公开Tor共识文件、仅作为入口使用的Tor中继节点[5]。网桥充当PT的服务端,因此,“obfs4网桥”和“WebTunnel网桥”通常指部署obfs4或WebTunnel服务端的特殊Tor入口节点[6]。严格来说,obfs4、meek、Snowflake和WebTunnel本身均为PT,而非网桥。不同之处在于,obfs4和WebTunnel通常由志愿者部署服务端PT,供Tor的其它用户使用,任何用户可以自由搭建和部署obfs4和WebTunnel网桥;而meek通过CDN等前置基础设施将流量转发至运行meek-server的后端网桥;Snowflake先由broker撮合客户端与短生命周期志愿代理,再经该代理将流量转发至Snowflake网桥,并进一步接入Tor网络,其中前置CDN、broker和Snowflake志愿代理均不是Tor中继节点[7-9],当然也就不能称之为网桥。meek和Snowflake的网桥数量很少,仅有个位数,大多数由Tor官方维护[10-11]。Tor Browser将这四类PT统一置于网桥配置界面中,属于连接配置层面的产品分类,并不意味着PT与网桥在技术概念上等同[1]。
3. Tor Core版本变迁
Tor Core不直接实现PT的伪装算法,而是负责网桥使用、PT子进程管理及Tor网络协议。为突出与流量特征相关的演进,下表仅保留网桥与PT架构,以及会显著改变TLS握手、连接时序、填充、cell调度或电路流控的关键版本。使用PT时,公网观察者首先看到的是Lyrebird生成的外层传输,而Tor Core的变化主要作用于内层Tor链路,不能直接等同于PT外层指纹[4,6]。
| 版本与日期 | 关键变化 |
|---|---|
| 0.2.0.3-alpha(2007-07-29) | 首次引入网桥机制,包括桥中继、桥客户端及桥目录权威的初步实现。 |
| 0.2.0.20-rc(2008-02-24) | 引入v2 Tor链路握手及链路协议版本协商,TLS握手采用更接近浏览器的密码套件列表,降低静态指纹[12]。 |
| 0.2.3.6-alpha(2011-10-26) | 引入无需TLS重协商的v3链路握手及可变长度VPADDING,客户端和网桥在主动发起的OR连接上不再发送TLS证书链[13-14]。 |
| 0.2.3.9-alpha(2011-12-08) | 实现managed proxy,并随机化网桥TLS证书序列号,形成Tor管理外部PT进程的框架[2,6]。 |
| 0.2.4.11-alpha(2013-03-11) | 随机化TLS链路证书有效期,去除固定证书寿命这一可被审查者利用的静态特征。 |
| 0.2.4.19(2013-12-11) | ntor(基于Curve25519的电路扩展握手)进入Stable系列 |
| 0.2.5.5-alpha(2014-06-18) | 随机化空闲TLS连接的关闭时间并调整连接保留策略,降低连接持续时间的固定模式。 |
| 0.3.1.7(2017-09-18) | 连接级NetFlow填充进入Stable系列,客户端与中继之间的空闲链路按随机间隔双向发送padding cell[15]。 |
| 0.3.2.9(2018-01-09) | 实验性的v3 onion service与KIST/KISTLite调度器进入Stable系列,新调度器决定各电路向OR连接交付cell的先后,其中KIST利用内核TCP反馈避免TCP发送缓冲区过满。 |
| 0.4.1.5(2019-08-20) | 洋葱服务客户端侧INTRODUCE与RENDEZVOUS电路的起始填充进入Stable系列[16]。 |
| 0.4.7.7(2022-04-27) | 基于RTT的电路拥塞控制进入Stable系列,客户端与服务端利用SENDME往返时延估计拥塞并动态调节拥塞窗口[17]。 |
| 0.4.8.4(2023-08-23) | Conflux与可选的洋葱服务PoW进入Stable系列;Conflux可将部分通用出口流量调度到两条电路[18-19]。 |
| 0.4.8.17(2025-06-30) | 使用OpenSSL 3.5.0及以上版本时支持X25519/ML-KEM-768混合后量子TLS握手[20,22]。 |
| 0.4.9.5(2026-02-12) | CGO与Happy Families进入Stable系列;Tor链路的最低TLS版本提高至1.2,并更新TLS 1.2客户端密码套件列表以匹配Firefox[21,23-24]。 |
OpenSSL 3.5.0于2025-04-08发布[25]。Tor 0.4.8.17在运行时使用OpenSSL 3.5.0或更高版本时,支持在Tor链路TLS中使用X25519/ML-KEM-768混合后量子握手[20,22]。Tor 0.4.9.5的OpenSSL最低要求仍为1.1.1,仅强烈建议使用3.0或更高版本,因此最低要求并未提高至3.5[21]。该能力仅作用于Tor链路层TLS,不表示ntor或ntor v3电路握手已经后量子化。
4. Lyrebird版本变迁
在Tor Browser的PT接入体系中,Lyrebird承担客户端侧的统一实现与集成。Tor Core将其作为外部PT进程调用,由它在同一可执行程序中提供obfs4、meek、Snowflake和WebTunnel的客户端功能。不过,meek、Snowflake和WebTunnel各自拥有可独立构建和运行的代码仓库,Tor通过复现或调用这些仓库中的代码,将其功能融合进Lyrebird仓库[26-28],obfs4则因原obfs4proxy项目演变为Lyrebird,由Lyrebird直接维护[29]。
从代码组织方式看,obfs4的客户端与服务端代码位于Lyrebird源码中;meek采用内置的精简客户端meek_lite,其代码大量借鉴meek-client,但不直接调用完整的meek-client[26,29];Snowflake适配层调用独立Snowflake项目的Go客户端库[27,29];WebTunnel适配层复用独立WebTunnel项目的HTTP Upgrade与TLS组件,并由Lyrebird完成参数解析和uTLS适配[28-29]。这种整合主要服务于Tor Browser的客户端接入,独立PT项目中的服务端及配套基础设施仍分别维护,包括meek-server及reflector、Snowflake服务端、broker和志愿代理,以及WebTunnel服务端[26-28],而Lyrebird中的更新通常会慢于PT独立代码仓库。Tor发布的Tor Browser并不会使用独立PT仓库中的客户端,而是直接使用Lyrebird。
| 版本与日期 | 关键变化 |
|---|---|
| obfs4proxy 0.0.1(2014-09-03) | 首次发布,建立obfs4实现基线[30]。 |
| 0.0.6(2016-01-25) | 加入meek_lite客户端。 |
| 0.0.9(2019-02-05) | meek_lite引入uTLS ClientHello伪装,并对默认Azure桥实施证书链公钥固定。 |
| 0.0.10(2019-04-12) | 在meek_lite的uTLS路径中禁用源自Go crypto/tls的特有行为,降低TLS可区分性。 |
| 0.0.11(2019-06-21) | 使obfs4握手失败处理更加一致,降低行为可区分性。 |
| 0.0.12(2021-12-31) | 初步修复Elligator2实现的长期可区分问题,并加入uTLS Chrome 83指纹配置。 |
| 0.0.13(2022-02-04) | meek_lite停用uTLS指纹伪装,并取消对默认网桥的证书链固定[3]。 |
| 0.0.14(2022-09-04) | 补全0.0.12中不完整的Elligator2子群问题修复。 |
| Lyrebird 0.1.0(2023-05-31) | 项目由obfs4proxy更名为Lyrebird,并在主线恢复meek uTLS支持。 |
| 0.2.0(2024-03-27) | 加入WebTunnel客户端;其HTTPS/TLS传输已可显式启用uTLS[31]。 |
| 0.5.0(2024-11-07) | 加入Snowflake客户端支持,至此四类PT的客户端功能均已整合至Lyrebird。 |
| 0.6.1(2025-04-28) | 回移uTLS的TLS版本降级检查修复[32]。 |
| 0.6.2(2025-10-15) | 更新Tor维护的uTLS分支,修复Chrome指纹模仿中GREASE ECH扩展的加密套件选择,降低uTLS可检测性[33]。 |
| 0.7.0(2025-11-19) | WebTunnel默认启用uTLS,并加入证书链哈希固定、多个TLS服务名候选和sni-imitation。 |
| 0.8.0(2025-12-09) | meek支持多组URL/front组合。 |
| 0.8.1(2026-01-14) | 更新uTLS并修复非后量子Chrome 120模仿配置中缺失padding扩展的问题[34]。 |
5. 四类PT的发展变化
5.1 obfs4
obfs4采用基于ntor的认证密钥交换,并利用Elligator2隐藏Curve25519公钥的线上表示;握手建立会话密钥后,数据经过加密、认证和填充,使字节特征接近随机。在未获知Node ID和身份公钥等通过桥接行带外分发的参数时,攻击者难以确认obfs4服务的存在[30]。obfs4proxy 0.0.1于2014-09-03首次发布,Tor Browser 4.5-alpha-1于2014-11-18在alpha渠道加入obfs4[35]。此后的关键安全变化是0.0.11统一握手失败处理,以及0.0.12和0.0.14修复Elligator2实现的可区分性问题,从而降低协议指纹并增强抗主动探测能力[3]。
5.2 meek
meek将Tor流量封装于HTTPS中,并通过域前置隐藏实际流量。Tor Browser 4.0-alpha-1于2014-08-12首次纳入独立的meek 0.10客户端,当时尚未采用后来内置于obfs4proxy和Lyrebird的meek_lite[8,36]。obfs4proxy 0.0.6加入meek_lite,0.0.9为其引入uTLS,0.0.13则停止使用uTLS模拟浏览器式TLS指纹。Tor Browser随后采用恢复uTLS支持的Tor维护版本0.0.14-tor2,Lyrebird 0.1.0再将该支持纳入正式主线[3,37]。Lyrebird 0.8.0加入多组URL/front组合,并可在请求失败时轮换候选组合[3]。uTLS在此主要用于塑造浏览器式ClientHello指纹,并未改变meek基于HTTPS和域前置的基本架构。
5.3 Snowflake
Snowflake的broker仅承担会合与信令功能,负责撮合客户端与动态志愿者池中的可用代理;客户端与代理建立WebRTC数据通道后,代理再通过WebSocket连接Snowflake服务端。志愿代理只是流量转发层,并非Tor中继节点[7]。Tor Browser 7.0a1于2017-01-25首次允许Linux用户测试Snowflake,10.5于2021-07-06将其作为内置网桥选项向Stable版用户开放[38-39]。Lyrebird 0.5.0的意义在于统一集成Snowflake客户端,并非Snowflake协议在2024年才出现[3]。
5.4 WebTunnel
WebTunnel将Tor流量封装为类似WebSocket的HTTPS连接,并可借助反向代理与普通网站共用同一域名、IP地址和端口;Tor Project于2024-03-12宣布其稳定可用[40]。Lyrebird 0.2.0加入WebTunnel客户端时已支持HTTPS/TLS,并可通过utls参数显式选择uTLS[31];0.7.0才将uTLS设为默认路径,同时加入证书链哈希固定、多个TLS服务名候选和sni-imitation[3]。uTLS在启用时主要改变TLS ClientHello的可观测指纹并替代标准Go TLS握手指纹。
参考文献
[1] Tor Project. Unblocking Tor[EB/OL]. [2026-07-31]. https://support.torproject.org/tor-browser/circumvention/unblocking-tor/.
[2] Tor Project. Tor ChangeLog[EB/OL]. [2026-07-31]. https://gitlab.torproject.org/tpo/core/tor/-/blob/main/ChangeLog.
[3] Tor Project. Lyrebird ChangeLog[EB/OL]. [2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/main/ChangeLog.
[4] Tor Project. Pluggable Transport Specification (Version 1)[EB/OL]. [2026-07-31]. https://spec.torproject.org/pt-spec/.
[5] Tor Project. Glossary[EB/OL]. [2026-07-31]. https://spec.torproject.org/glossary.html.
[6] Tor Project. Proposal 180: Pluggable Transports for Circumvention[EB/OL]. (2010-10-15)[2026-07-31]. https://spec.torproject.org/proposals/180-pluggable-transport.html.
[7] BOCOVICH C, BREAULT A, FIFIELD D, et al. Snowflake, a Censorship Circumvention System Using Temporary WebRTC Proxies[C/OL]//33rd USENIX Security Symposium (USENIX Security 24). Philadelphia, PA: USENIX Association, 2024: 2635-2652[2026-07-31]. https://www.usenix.org/conference/usenixsecurity24/presentation/bocovich.
[8] Tor Project. How to Use the “meek” Pluggable Transport[EB/OL]. (2014-08-15)[2026-07-31]. https://blog.torproject.org/how-use-meek-pluggable-transport/.
[9] Tor Project. Snowflake[EB/OL]. [2026-07-31]. https://snowflake.torproject.org/.
[10] Tor Project. Relay Search: transport:snowflake[DB/OL]. [2026-07-31]. https://metrics.torproject.org/rs.html#search/transport:snowflake.
[11] Tor Project. Relay Search: transport:meek[DB/OL]. [2026-07-31]. https://metrics.torproject.org/rs.html#search/transport:meek.
[12] Tor Project. Proposal 130: Version 2 Tor Connection Protocol[EB/OL]. (2007-10-25)[2026-07-31]. https://spec.torproject.org/proposals/130-v2-conn-protocol.html.
[13] Tor Project. Proposal 176: Proposed Version-3 Link Handshake for Tor[EB/OL]. (2011-01-31)[2026-07-31]. https://spec.torproject.org/proposals/176-revising-handshake.html.
[14] Tor Project. Proposal 184: Miscellaneous Changes for a v3 Tor Link Protocol[EB/OL]. (2011-09-19)[2026-07-31]. https://spec.torproject.org/proposals/184-v3-link-protocol.html.
[15] Tor Project. Proposal 251: Padding for NetFlow Record Resolution Reduction[EB/OL]. (2015-08-20)[2026-07-31]. https://spec.torproject.org/proposals/251-netflow-padding.html.
[16] Tor Project. Proposal 302: Hiding Onion Service Clients Using Padding[EB/OL]. (2019-05-16)[2026-07-31]. https://spec.torproject.org/proposals/302-padding-machines-for-onion-clients.html.
[17] Tor Project. Proposal 324: RTT-Based Congestion Control for Tor[EB/OL]. (2020-07-02)[2026-07-31]. https://spec.torproject.org/proposals/324-rtt-congestion-control.html.
[18] Tor Project. Proposal 327: A First Take at PoW Over Introduction Circuits[EB/OL]. (2020-04-02)[2026-07-31]. https://spec.torproject.org/proposals/327-pow-over-intro.html.
[19] Tor Project. Proposal 329: Overcoming Tor's Bottlenecks with Traffic Splitting[EB/OL]. (2020-11-25)[2026-07-31]. https://spec.torproject.org/proposals/329-traffic-splitting.html.
[20] Tor Project. Stable Release 0.4.8.17[EB/OL]. (2025-06-30)[2026-07-31]. https://forum.torproject.org/t/stable-release-0-4-8-17/19681.
[21] Tor Project. Stable Release 0.4.9.5[EB/OL]. (2026-02-12)[2026-07-31]. https://forum.torproject.org/t/stable-release-0-4-9-5/21227.
[22] Tor Project. Post-Quantum Cryptography in Tor's TLS Layer: Help Needed![EB/OL]. (2026-02-27)[2026-07-31]. https://forum.torproject.org/t/tor-relays-post-quantum-cryptography-in-tors-tls-layer-help-needed/21288.
[23] Tor Project. Proposal 359: Counter Galois Onion, Updated[EB/OL]. (2024-04-02)[2026-07-31]. https://spec.torproject.org/proposals/359-cgo-redux.html.
[24] Tor Project. Proposal 321: Better Performance and Usability for the MyFamily Option (v2)[EB/OL]. (2020-05-27)[2026-07-31]. https://spec.torproject.org/proposals/321-happy-families.html.
[25] OpenSSL Project. OpenSSL 3.5 Final Release - Live[EB/OL]. (2025-04-08)[2026-07-31]. https://openssl-library.org/post/2025-04-08-openssl-35-final-release/.
[26] Tor Project. meek Source Repository[CP/OL]. [2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/meek.
[27] Tor Project. Snowflake Source Repository[CP/OL]. [2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake.
[28] Tor Project. WebTunnel Source Repository[CP/OL]. [2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/webtunnel.
[29] Tor Project. Lyrebird 0.8.1 Transport Implementations[CP/OL]. (2026-01-14)[2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/tree/lyrebird-0.8.1/transports.
[30] Tor Project. obfs4-spec.txt[EB/OL]. [2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/main/doc/obfs4-spec.txt.
[31] Tor Project. client.go (Lyrebird 0.2.0)[CP/OL]. (2024-03-27)[2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/blob/lyrebird-0.2.0/transports/webtunnel/client.go.
[32] Refraction Networking. ServerHellos Are Accepted Without Checking TLS 1.3 Downgrade Canaries[EB/OL]. (2025-04-23)[2026-07-31]. https://github.com/refraction-networking/utls/security/advisories/GHSA-pmc3-p9hx-jq96.
[33] Tor Project. Use Updated uTLS Fork with AES GREASE Fix[CP/OL]. (2025-10-15)[2026-07-31]. https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/lyrebird/-/commit/a74149c066d0269326bd49900218744f4d0890fb.
[34] mingyech. fix: add missing padding extension for chrome 120[CP/OL]. (2026-01-13)[2026-07-31]. https://github.com/refraction-networking/utls/commit/8fe0b08.
[35] Tor Project. Tor Browser 4.5-alpha-1 Is Released[EB/OL]. (2014-11-18)[2026-07-31]. https://blog.torproject.org/tor-browser-45-alpha-1-released/.
[36] Tor Project. Tor Browser 3.6.4 and 4.0-alpha-1 Are Released[EB/OL]. (2014-08-12)[2026-07-31]. https://blog.torproject.org/tor-browser-364-and-40-alpha-1-are-released/.
[37] Tor Project. Bug 40622: Update obfs4proxy 0.0.14[CP/OL]. (2022-11-08)[2026-07-31]. https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/02d54d8cb233b34c167d7a246e6e34fafcb604af.
[38] Tor Project. Tor Browser 7.0a1 Is Released[EB/OL]. (2017-01-25)[2026-07-31]. https://blog.torproject.org/tor-browser-70a1-released/.
[39] Tor Project. New Release: Tor Browser 10.5[EB/OL]. (2021-07-06)[2026-07-31]. https://blog.torproject.org/new-release-tor-browser-105/.
[40] Tor Project. Hiding in Plain Sight: Introducing WebTunnel[EB/OL]. (2024-03-12)[2026-07-31]. https://blog.torproject.org/introducing-webtunnel-evading-censorship-by-hiding-in-plain-sight/.