代理和 VPN 协议概述
简介
本文介绍 Xray-core 所涉及的主要代理协议(SOCKS5、HTTP、VLESS、VMess、Trojan、Shadowsocks)和 VPN 协议(WireGuard、IPSec)的基本工作原理。
本文回答
- 代理协议和 VPN 协议的区别
- 各种代理协议的设计思路和安全特性
- 不同协议在反审查场景下的优劣
本文在项目中的位置
本文属于背景知识层。理解各协议的基本原理是阅读协议分析文档的前置条件。
适合读者
所有需要理解不同代理协议差异和适用场景的读者。
前置知识
TCP/UDP 基础,基本的加密概念。
文章理解难度
入门。
重点
- SOCKS5 的三阶段握手机制
- VLESS 的无加密设计哲学
- Trojan 的 TLS 伪装思路
- WireGuard 的 Noise 协议框架
上级文档和相关文档
主要证据
RFC 1928(SOCKS5),VLESS 协议规范,Shadowsocks 协议文档,WireGuard 白皮书。
代理协议 vs VPN 协议
| 特性 | 代理协议 | VPN 协议 |
|---|---|---|
| 工作层级 | 应用层(L7)或传输层(L4) | 网络层(L3)或数据链路层(L2) |
| 粒度 | 可按应用/域名代理 | 通常是全设备或全网段 |
| 配置复杂度 | 需要客户端配置代理 | 通常系统级配置 |
| 典型协议 | SOCKS5, HTTP, Shadowsocks | IPSec, WireGuard, OpenVPN |
| 性能开销 | 较低(仅代理需要的数据) | 较高(所有流量都走隧道) |
SOCKS5 协议
SOCKS5(RFC 1928)是一种通用的代理协议,它工作在会话层(L5),不关心传输的具体应用协议。
握手流程
SOCKS5 的连接建立分为三个阶段:
SOCKS5 在反审查中的作用
- SOCKS5 本身不提供加密,所有数据以明文传输
- 它通常作为本地代理接口使用,在客户端本地运行,将浏览器/应用的连接转发到远程代理
- 在 Xray-core 中,SOCKS5 入站是客户端最常见的入口协议
UDP 支持
SOCKS5 支持 UDP 转发(UDP ASSOCIATE):客户端先通过 TCP 建立关联,然后通过该关联发送封装了目标地址的 UDP 数据报。
HTTP 代理
HTTP 代理通过 HTTP CONNECT 方法建立隧道:
客户端 → 代理:CONNECT example.com:443 HTTP/1.1
代理 → 客户端:HTTP/1.1 200 Connection Established
(之后双向转发原始 TCP 数据)与 SOCKS5 相比:
- HTTP 代理只支持 TCP(不支持 UDP)
- 头部开销更大(HTTP 请求头)
- 但更容易被网络中间件理解(支持标准 HTTP 认证)
Shadowsocks
Shadowsocks 是一种流行的加密代理协议,设计目标是简单高效。
设计特点
- 使用预共享密钥(PSK)进行认证和加密
- 流量看起来像随机数据(没有协议特征头)
- 支持多种加密方式:AEAD(AES-256-GCM, ChaCha20-Poly1305)等
数据包格式
[加密的载荷]
- 加密算法使用 AEAD 模式
- 每个数据块包含加密的目标地址 + 数据
- 没有单独的目标地址解析步骤Shadowsocks 2022 版本对协议进行了现代化改造,使用了独立的加密方法。
VMess
VMess 是 V2Ray 项目原创的加密代理协议,Xray-core 作为 V2Ray 的 fork 继承了完整的 VMess 实现。
核心特征
- 基于 UUID 的用户认证
- 使用 AEAD(AES-128-GCM, ChaCha20-Poly1305 等)进行加密
- 支持多用户和用户等级
- 指令机制:支持 TCP、UDP、Mux 等多种传输模式
- 时间戳和随机数防重放
消息格式
请求头:
[版本(1)] [指令] [端口] [地址类型] [地址] [随机填充长度] [填充]
认证信息:
[时间戳] [随机数] [加密的载荷]VLESS
VLESS(V2Ray Less / Very Less)是 Project X 设计的轻量级代理协议,是 VMess 的简化版。
核心设计
- 无加密:VLESS 本身不提供加密层,依赖底层传输(TLS、REALITY 等)提供安全
- 无状态:服务端不维护连接状态,提升性能
- Flow 流控:通过 XTLS 流控模式消除 TLS-in-TLS 特征
- Fallback 回落:支持将非 VLESS 连接转发到其他服务
为什么去除加密
去除加密层的优点:
- 减少计算开销(不需要双重加密)
- XTLS 需要看到内部 TLS 流量才能分流——如果 VLESS 加密了数据,XTLS 无法识别内部的 TLS 结构
- 安全由传输层(TLS/REALITY)保证,应用层加密是冗余的
Trojan
Trojan 的设计思路是将代理流量完全伪装为 HTTPS 流量。
工作原理
客户端 → 服务端:TLS 连接到 443 端口
- ClientHello 看似正常的 HTTPS 访问
- 在 TLS 隧道建立后,发送 Trojan 认证头:
[密码的 SHA224 哈希(56字节)] + CRLF + [SOCKS5 请求]
- 后续流量通过 TLS 隧道双向转发如果认证头不匹配(即非 Trojan 流量),服务端将连接转发到配置的本地 Web 服务器(如 Nginx),返回正常的网页内容——这被称为"回落"。
与 VLESS + REALITY 的对比
Trojan 的回落依赖有真实的 Web 服务运行。如果回落目标是空服务,审查方能通过抓取网页响应来判断。
REALITY 改进了这一点:回落目标可以是任何外部网站,不依赖本地 Web 服务。审查方进行主动探测时,连接被转发到配置的目标网站(如 microsoft.com),收到的就是真实网站的证书和页面。
WireGuard
WireGuard 是一种现代 VPN 协议,被集成到 Linux 内核中。
核心设计
- 基于 Noise 协议框架进行密钥交换
- 使用 ChaCha20-Poly1305 进行加密
- 基于 UDP 传输
- 使用 Cryptokey Routing 将公钥与允许的 IP 地址关联
- 代码量极小(约 4000 行),易于审计
在 Xray-core 中的角色
源码位置:xray-core/proxy/wireguard/
Xray-core 支持 WireGuard 作为入站和出站协议,可以与其他代理协议配合使用。
IPSec
IPSec(IP Security)是一组在网络层提供安全通信的协议套件。
主要模式
- 传输模式:只加密 IP 载荷,IP 头部保持原样
- 隧道模式:加密整个原始 IP 包,封装在新的 IP 包中
协议组件
- AH(Authentication Header):提供数据完整性验证(不加密)
- ESP(Encapsulating Security Payload):提供加密和完整性
- IKE(Internet Key Exchange):负责密钥协商
IPSec 通常用于站点到站点 VPN,在反审查场景中较少使用,因为其 IKE 握手有明显的协议特征。
外部参考资料
资料:RFC 1928 - SOCKS Protocol Version 5 类型:IETF 标准 可信度:A
资料:Shadowsocks 协议规范 类型:项目文档 链接:https://shadowsocks.org/doc/ 可信度:A
资料:WireGuard 白皮书 类型:学术论文 链接:https://www.wireguard.com/papers/wireguard.pdf 可信度:A
资料:VLESS 协议说明 类型:项目文档 链接:https://xtls.github.io/ 可信度:A
读者自检
读完本文后应能回答:
- 代理协议和 VPN 协议在 OSI 模型中的层次差异
- SOCKS5 的三阶段握手
- VLESS 去除加密层的设计动机
- Trojan 与 VLESS+REALITY 在回落机制上的区别
- WireGuard 的 Noise 协议框架特点
下一步阅读
各协议的源码级分析见 protocols/ 目录。