trueNetLab logo
ZH
Shadowsocks 和 Xray:当 VPN 被封锁时

Shadowsocks 和 Xray:当 VPN 被封锁时

3 min read
Network Security

我经常在工作中处理 VPN。不是把它当作理论话题,而是很实际地连接办公室、让客户访问公司网络、保持服务器可达、配置防火墙、更新证书、稳定 IPsec 隧道、排查 SSL VPN 客户端,并弄清楚为什么某个站点突然无法连通。

通常这只是扎实而有点无聊的网络工作。它本来就应该这样。

但有些情况下,一个技术上正确的 VPN 仍然不够。对于来自互联网管制较强国家的客户,例如中国或俄罗斯,传统 VPN 协议被阻断、干扰或有针对性识别的情况并不少见。因为我在迪拜面对非常国际化的客户群,这不是抽象话题。真正的运营问题是:当连接在途中被过滤时,如何保持对自己基础设施的合法访问?

这时就会出现 Shadowsocks、ShadowsocksR、V2Ray、Xray-core、VLESS、Trojan、REALITY、XHTTP 等名字。刚开始看起来像项目、分支和缩写的大杂烩。坦白说,其中一部分确实如此。

如果 VPN 不是在登录时失败,而是在穿过网络的路上就失败,那么讨论的不只是加密,还必须讨论可识别性。

Shadowsocks 为什么会出现

Shadowsocks 并不是来自传统企业 VPN 世界。它不是为了做一个更漂亮的 site-to-site 方案,也不是因为 IPsec 太复杂。它的起点更直接:2012 年,使用 clowwindy 这个化名的开发者想要一个轻量方式,从强过滤网络访问开放互联网。

这解释了它的设计。Shadowsocks 要轻、快、实用。它不是笨重的 VPN 客户端,不是大型网关产品,也不是带身份管理和合规报表的远程访问套件。它的核心是一个本地 SOCKS5 代理,把流量加密后发送到封锁之外的服务器。

需求不是“给企业更多安全功能”,而是“我需要从过滤某些协议和目标的网络中找到一条可用出口”。所以 Shadowsocks 至今仍然有价值,也很容易被误解。它是很好的轻量传输组件,但并不自动等于完整企业 VPN。

2015 年,故事变得更政治化:clowwindy 在 GitHub 写到警方找过他,他必须停止相关工作。之后开发通过分支和其他实现继续。这类工具常常从非常具体的技术痛点诞生,随后进入用户、开发者与过滤基础设施之间的长期攻防。

VPN 为什么会显眼

很多人谈到 VPN 首先想到加密。这是对的,但只是故事的一部分。

审查系统、运营商或大型国家级防火墙不一定需要读取加密内容才能干扰连接。很多时候,识别外壳就够了。IPsec、SSL VPN、WireGuard 和 OpenVPN 都有典型特征:端口、包大小、握手模式、证书行为、时序、UDP 行为、重试、错误信息,或者已知服务器 IP。

可以把它想成信封,而不是信的内容。信件被加密了,但信封有固定大小、颜色、邮戳和重复出现的寄件人。只按信封分类的人不需要读正文,也能说:这种信封我认识,送去特别检查。

网络流量也是如此。Deep Packet Inspection 和 Traffic Classification 不只看端口,还分析模式。TLS 中的 Client Hello fingerprint、SNI、证书链或 ALPN 可能很显眼。对于完全加密的协议,早期包看起来过于随机本身也可能成为信号。关于 Great Firewall 的研究显示,早期包的长度、熵以及可打印 ASCII 字符也很重要。

令人不舒服的一点是:“一切看起来随机”并不等于“不显眼”。有时随机本身就是可疑点。

研究说明了什么

关键不只是审查系统可以“识别 VPN”。这一点大体上早就知道。真正有意思的是,很多识别技术的起点其实并不神秘。

一个很好的入口是 GFW Report 在 2020 年 ACM Internet Measurement Conference 上发表的测量研究。GFW Report 不是产品或厂商,而是围绕 Great Firewall 的研究和测量项目。

重点是:这不是神奇的解密攻击。Great Firewall 结合了被动观察和主动探测。首先,连接会因为第一个数据包的长度和熵等特征变得可疑。然后出现 active probes:审查方主动连接疑似服务器,重放旧包或修改后的包,观察对方是否像 Shadowsocks 服务器那样响应。

对管理员来说,这说明有两层防御:

  • 流量在被动观察下不能太显眼。
  • 服务器面对主动测试时不能像代理一样回应。

2023 年,另一项 GFW 研究显示,完全加密的流量也可以用简单启发式阻断。简化地说,如果第一个 TCP payload 既不像 TLS,也不像 HTTP,也不像可打印文本,而像随机数据块,这本身就可能是信号。所以“尽可能随机”不一定是最好的伪装目标。

2024 年关于封装 TLS 握手的研究又补了一点:即使外层隧道已加密且伪装良好,内层 TLS 握手仍可能在嵌套协议栈中表现为模式。这对“普通 HTTPS 流量再穿过一个加密代理隧道”的配置尤其重要。随机 padding 只能有限帮助;stream multiplexing 看起来更有希望,但如果最终只有一个应用流可见,也不会自动解决问题。

Timing 和 cross-layer RTT 的研究也很重要。代理会让传输层会话和应用层会话错位。这些时间差可能被测量出来,不管客户端离代理近还是远。它不是换一个 header 就能解决的问题。

结论很朴素:决定性的不是协议标签,而是整个 setup 的行为。

Shadowsocks 不是传统 VPN

Shadowsocks 经常被放进 VPN 这一类。日常表达可以理解,但技术上不准确。

Shadowsocks 是一个加密代理,松散地基于 SOCKS5。本地客户端为应用提供代理,随后加密流量并发送到远程 Shadowsocks 服务器。服务器解密请求,连接真正的目标,再把响应通过加密路径送回。

它比完整 VPN 更轻。Shadowsocks 不会自动把整个操作系统拉进隧道。它更像是把选定流量走另一条路的工具。根据客户端、系统和额外组件,可以做出接近 VPN 的使用体验,但基本思想仍是代理,而不是 site-to-site VPN。

对管理员来说,这能校正预期:

  • Shadowsocks 不替代干净的 site-to-site IPsec。
  • Shadowsocks 不是对抗所有检测的魔法保护。
  • Shadowsocks 在需要从受限网络中快速建立简单加密代理时很有用。

Shadowsocks 也在不断演进。旧的 stream cipher 配置不应再作为标准。现代部署应该属于 AEAD 世界,而 Shadowsocks 2022 进一步使用预共享对称密钥基础、基于 BLAKE3 的派生、重放保护和其他修正。但限制也很重要:规范并不提供 Forward Secrecy。如果密钥泄露,干净的轮换不是可选项。

shadowsocks-rust 是现代实现,也可以通过 Docker 运行。服务器端可用 ssserver,客户端可用 sslocal。中间需要的不只是随便一个密码,而是正确生成的 secrets、可达端口、当前 cipher,以及对 TCP、UDP 或两者的明确选择。

为什么 Xray-core 是另一类

Xray-core 不是“更新版 Shadowsocks”。它更像是代理和隧道场景的框架。

Xray 可以组合多种 inbound 和 outbound 协议:VLESS、VMess、Trojan、Shadowsocks、WireGuard、Hysteria、SOCKS 和 HTTP。上面再叠加 RAW、WebSocket、gRPC、XHTTP、Hysteria 等 transport,并与 TLS、REALITY 或 XTLS Vision 结合。VMess 在很多旧配置中仍会出现,但新部署中更偏 legacy;现代 Xray 配置通常以 VLESS 为中心。

Shadowsocks 是一把快速螺丝刀。Xray 是工具箱。它可以做简单配置,也可以做复杂链路:本地 SOCKS 或 TUN 客户端接收流量,通过带 REALITY 的 VLESS 发到服务器,再由服务器通过 freedom outbound 出口访问互联网。

VLESS 本身不是伪装。它是一个轻量代理协议,使用 UUID 认证。保密性和真正的伪装效果来自下面的 transport/security 层,例如 TLS、REALITY 或 XTLS Vision。

REALITY 更有意思,因为它不是简单地“再做一次 TLS”。服务器对外借用一个真实第三方 HTTPS 网站的 TLS 握手。观察者看到的不是自制代理证书,而是真实网站的真实证书。只有授权客户端通过配置的密钥材料知道自己正在与 Xray 服务器通信。

这主要处理服务器端 TLS fingerprint 和 active probing。uTLS 也能在客户端侧模拟浏览器 Client Hello。但 Xray 不是隐身斗篷:timing、包大小、ALPN、服务器行为和嵌套 TLS 模式仍可能泄露信号。XTLS Vision 和 XHTTP 是有趣组件,不是保证。若嵌套流量的基本模式仍可见,少量 padding 帮助有限。

基于 UDP 的 Hysteria 或 QUIC 可以很快,但在受限网络中经常被限速、阻断或比出站 TCP/443 更差。因此 Xray 运维上比 Shadowsocks 更需要纪律:固定版本、测试变更、阅读 release notes,不要盲目复制论坛建议。

Fork 和名称造成的混乱

一开始搜索,很快会遇到旧博客、GitHub fork 和维护不完整的客户端。这来自这些工具的历史。

Shadowsocks 既是协议,也是有多个实现的生态。shadowsocks-rust 今天是运行现代服务器的自然选择。shadowsocks-libev 等旧实现仍然知名,但根据项目状态,更像 legacy 或 bugfix-oriented。

ShadowsocksR 是带额外 obfuscation 思路的历史 fork。SSR 在很多旧教程里仍会出现。今天我会谨慎使用它:不是说所有旧安装都坏,而是必须仔细检查客户端、服务器、加密、更新和社区是否可信。

Xray-core 来自 V2Ray 生态,但已经独立发展。因此不能把旧 V2Ray 教程直接搬到 Xray。概念可能相似,但配置、功能和建议已经改变。

V2Fly 作为 V2Ray 社区项目仍然相关,更偏保守。Xray-core 对 REALITY、XTLS Vision、XHTTP 等新功能推进更快。旁边还有 sing-box 这样的现代通用平台。本文聚焦 Xray,但在实验室里我也会看 sing-box。

务实建议:

  • 新的简单配置:评估当前实现的 Shadowsocks。
  • 更困难的网络:评估设计干净、版本较新的 Xray-core。
  • 旧 SSR 或 V2Ray 教程:先检查项目状态和安全性。
  • 客户生产环境:不要复制自己没有理解的配置。

两边需要什么

最小配置总有两端。

远端需要一个位于受限网络之外的服务器:小型 VPS、数据中心里的自有服务器,或客户站点可达区域中的受控基础设施。这个服务器必须加固、打补丁、监控并记录清楚。随便开一个便宜实例然后忘掉,是长期风险。

客户端侧需要合适程序。Shadowsocks 通常是本地 SOCKS 客户端或能设置系统代理的应用。Xray 可以是 Xray 客户端、TUN 模式、路由器配置,或导入 profile 的应用。

中间还需要:

  • 明确用途
  • 干净认证
  • 当前软件版本
  • 受控 DNS 解析
  • 不保存多余客户数据的 logging
  • 可达性 monitoring
  • 服务器、端口和 secrets 的轮换计划
  • 法律与合同检查

最后一点不是装饰。在某些国家,使用这类工具本身可能有法律风险。在企业环境中,还必须明确你是在开放自己的系统、运营客户网络,还是给员工提供普通互联网访问。这些风险不同。

DNS 常被低估。如果浏览器或操作系统仍通过本地运营商解析目标域名,隧道只解决了一半。内容可能走代理,但 DNS 查询仍暴露目的地。因此必须单独测试 DNS 路径、IPv6 处理以及隧道断开后的行为。

Logging 同样敏感。排障需要知道隧道是否活着;隐私和客户保护要求尽量少存。好的 setup 记录技术状态、延迟、错误率和流量指标,而不是完整目标域名连接列表。Debug logs、TLS keylogs 或未脱敏 access logs 不应长期存在于生产系统。

Monitoring 也不能只看容器是否运行。必须测试真实路径、DNS 是否正确、目标区域是否被阻断,以及从受影响国家看到的状态是否不同于办公室。

我会如何运营定位

对我来说,Shadowsocks 或 Xray 不是 firewall architecture、Zero Trust、MFA 或 clean segmentation 的替代品。它是特殊场景中的 transport tool。

合理的公司做法可以是:

  1. 先检查 SSL VPN、IPsec 或 WireGuard 是否稳定。
  2. 若被阻断,测量 DNS、端口、协议、服务器 IP、TLS fingerprint 和 UDP throttling。
  3. 再测试 Shadowsocks 或 Xray-core 等替代 transport。
  4. 隧道只用于必要目标,不要盲目打开整个客户网络。
  5. 服务器侧严格过滤可访问的内部服务。
  6. 建立 monitoring,不要等客户告诉你又被阻断。
  7. 准备 fallback:第二出口、其他 provider、其他 region、其他 protocol。
  8. 按站点或用户分离 secrets 和 profiles。
  9. 设计 logs 和 metrics,让运维可行但不制造不必要痕迹。

当客户无法访问系统时,“先恢复连接”很诱人,也可以理解。但之后必须清理和记录。否则临时 workaround 会变成没人知道的生产路径。

为什么封锁会追上来

使用这些工具时别忘了:对方也会不断调整检测。

如果许多人使用同一个 Docker Compose、同一个端口、同一个 TLS fingerprint、同一个域名策略和同一个 VPS provider,模式迟早会显现。被阻断的不一定是抽象意义上的 “Xray” 或 “Shadowsocks”,而是具体模式:特定 handshakes、包大小、IP ranges、典型客户端、错误 fallback 或可疑错误响应。

所以伪装不只是工具中的一个 feature。伪装也是运营:同样工具,换不同域名、provider、客户端 profile 和 traffic pattern,实际外观可能差很多。

这也是我对某些项目或社区声明保持谨慎的原因。工具声称“不可检测”只是项目声明。论文显示某个特征在真实网络中被识别,则是另一种质量的证据。实践中两者都需要:项目的创新速度,以及研究的冷静。

我的判断

如果需要轻量、快速、相对简单的加密代理,Shadowsocks 很有意义。它适合初步测试、临时访问,以及没有极端激进检测的环境。

当网络更困难、需要多种 transport,或想有意识地使用 VLESS、REALITY、WebSocket、gRPC、XHTTP 时,Xray-core 更有意义。但它需要更多理解,也更容易因为灵活性而配置错误。

在客户环境里,我不会把二者卖成“VPN 替代品”。我会把它描述为合法访问的替代传输路径。听起来不那么刺激,但更诚实。

最重要的区别不是 Shadowsocks 对 Xray,而是我是否理解自己在解决什么问题。如果是普通 remote access,就用普通 VPN。如果问题是国家或 provider 侧的协议识别,就必须讨论可识别性、fingerprints 和运营策略。如果我不能清楚解释,就不应在客户生产环境中运行。

结论

Shadowsocks 和 Xray-core 来自这样一个世界:网络连接不只是“能用”或“不能用”。有时它们会被分类、限速、主动探测或阻断。服务国际客户的人迟早会遇到这种现实。

我觉得这个主题有意思,因为它让网络技术变得非常具体:加密、模式、fingerprints、routing、DNS、operations、law、responsibility,以及一个事实:能工作的隧道并不自动代表好设计。

我的下一步很明确:我想在一个小实验室里复现 Shadowsocks 和 Xray-core。不是为了盲目绕过审查,而是为了更好理解为什么传统 VPN 有时会显眼,以及哪些替代方案可以以技术上严肃的方式运营。

下次见,
Joe

FAQ

Shadowsocks 是 VPN 吗?
不是经典意义上的 VPN。Shadowsocks 主要是加密代理。根据客户端和操作系统,可以做出类似 VPN 的使用方式,但技术上它不是 IPsec、SSL VPN 或 WireGuard。
Xray-core 比 Shadowsocks 更好吗?
不能一概而论。Xray-core 更灵活,可以组合多种协议、transport 和伪装机制。Shadowsocks 更简单、更轻。选择取决于网络、风险和运维成本。
可以直接用 Docker 运行吗?
可以,Shadowsocks 实现和 Xray-core 都能用 Docker 运行。但客户生产环境中,一个容器不够。还需要更新、监控、secret 管理、防火墙规则、日志、DNS 方案和封锁应对计划。
ShadowsocksR 怎么看?
ShadowsocksR 是带额外 obfuscation 思路的历史 fork。今天我不建议新的生产配置选择 SSR,因为维护、标准化和安全状态看起来弱于当前 Shadowsocks 或 Xray 方案。
这能保证隐形吗?
不能。没有工具能保证流量不被检测或阻断。现代过滤系统可以评估协议特征、元数据、包模式、服务器 IP、主动探测和异常行为。
来源