VLESS 协议
简介
VLESS(V2Ray Less / Very Less)是 Project X 设计的轻量级无状态代理协议。与 VMess 的核心区别在于:VLESS 自身不提供加密层,依赖底层传输安全(TLS/REALITY)保障通信安全,并引入 XTLS 流控机制消除嵌套隧道的可检测特征。
本文回答
- VLESS 的协议设计、数据包格式和版本差异
- 入站和出站的完整处理流程
- VLESS 如何与 XTLS、REALITY 协作
- 源码实现的关键路径
本文在项目中的位置
VLESS 是 Xray-core 推荐使用的主要入站/出站代理协议,与 REALITY 和 XTLS 紧密配合。
适合读者
需要理解 VLESS 协议实现或修改 VLESS 相关代码的开发者。
前置知识
Xray-core 架构、代理协议基本概念、XTLS 分流原理。
文章理解难度
中等。
重点
- VLESS 的无加密设计动机
- 三种 Flow 模式(无 flow、xtls-rprx-vision)
- Fallback 机制
上级文档和相关文档
主要证据
xray-core/proxy/vless/ 全部源码,transport/internet/reality/ 集成代码,VLESS 协议文档。
前置知识补充
为什么需要"无加密"的代理协议
传统的代理协议(VMess、Shadowsocks)在应用层进行加密。当这些协议与 TLS 传输层组合时,会出现双重加密:
外层:TLS 加密(传输层安全)
└── 内层:VLESS/VMess 加密(应用层安全)
└── 实际数据(可能还是 TLS 加密的 HTTPS 数据)VLESS 的设计哲学是:既然已经有了 TLS/REALITY 提供的传输层安全,应用层的加密就多余了。去除应用层加密:
- 减少计算开销
- XTLS 需要看到内部流量是否是 TLS 才能分流
Flow(流控)
Flow(流控模式)的概念不是传统意义上的"流控"(带宽速率控制),而是决定代理如何处理内部数据的策略。
VLESS 协议格式
请求格式
VLESS 的请求格式非常简单:
[版本 (1 byte)] - 始终为 0x00
[命令 (1 byte)] - 0x01: TCP, 0x02: UDP, 0x03: Mux
[端口 (2 bytes)] - 目标端口,BigEndian
[地址类型 (1 byte)] - 0x01: IPv4, 0x02: 域名, 0x03: IPv6
[地址 (变长)] - 根据地址类型请求之后直接是数据流。
用户认证
VLESS 使用 UUID 进行用户识别。服务端校验客户端发送的 UUID 是否在允许的用户列表中。UUID 在 TLS 握手完成后的第一个数据包中发送。
加密模式
VLESS 配置中的 "encryption": "none" 表示不进行应用层加密。虽然理论上 VLESS 支持加密,但在 PRACTICE 中始终使用 "none",安全由传输层保证。
入站处理流程
源码位置:xray-core/proxy/vless/inbound/inbound.go
出站处理流程
源码位置:xray-core/proxy/vless/outbound/outbound.go
出站的处理相对简单:
- 建立到目标 VLESS 服务端的连接
- 发送协议头(版本 + 命令 + 端口 + 地址)
- 发送用户 UUID
- 进入 Flow 流控模式
- 双向数据中继
Fallback 回落
Fallback 是 VLESS 入站的一个重要特性。当连接不是有效的 VLESS 连接时(首包不包含有效的 UUID),服务端将连接转发到配置的回落目标。
回落配置示例
{
"settings": {
"clients": [{"id": "uuid"}],
"decryption": "none",
"fallbacks": [
{
"alpn": "h2",
"dest": "/path/to/unix.sock",
"xver": 1
},
{
"path": "/ws",
"dest": "8080",
"xver": 1
}
]
}
}Fallback 可以基于 ALPN 或路径进行分流,使得同一个端口可以同时服务 VLESS 连接和普通 Web 应用。
VLESS 验证器
源码位置:xray-core/proxy/vless/validator.go
验证器负责校验用户 UUID:
func (v *Validator) Add(user *protocol.User) error {
account := user.Account.(*Account)
// 解析 UUID
id, err := uuid.ParseString(account.Id)
// 存入用户映射表
v.users = append(v.users, ...)
}与 VMess 不同,VLESS 的验证不需要额外的时间戳检查和随机数防重放——因为 TLS/REALITY 层已经确保了连接的安全性和新鲜性。
VLESS 账户
源码位置:xray-core/proxy/vless/account.go 和 account.pb.go
定义在 protobuf 中:
message Account {
string id = 1; // UUID
string flow = 2; // 流控模式
string encryption = 3; // 加密模式(通常为 "none")
}flow 字段决定流控模式:
- 空字符串或无此字段:无流控(传统模式)
"xtls-rprx-vision":XTLS Vision 流控
encryption 字段在标准用法中始终为 "none"。
源码结构
| 文件 | 作用 |
|---|---|
vless.go | 协议常量和注册 |
account.go | 用户账户定义 |
account.pb.go | 生成的 Protobuf 代码 |
validator.go | 用户 UUID 验证 |
inbound/config.go | 入站配置解析 |
inbound/inbound.go | 入站处理器 |
outbound/config.go | 出站配置解析 |
outbound/outbound.go | 出站处理器 |
encoding/encoding.go | Flow 流控的核心编解码逻辑 |
encoding/addons.go | Flow 的附加功能(如 XUDP) |
encryption/client.go | 加密层客户端(未用) |
encryption/server.go | 加密层服务端(未用) |
encryption/common.go | 加密层公共逻辑 |
encryption/xor.go | XOR 流加密(未用) |
注意:encryption/ 目录虽然存在,但在标准配置(decryption: "none")下不被使用。保留这些文件是为了协议兼容性和潜在的加密扩展。
外部参考资料
资料:VLESS 协议说明 类型:项目官方文档 链接:https://xtls.github.io/ 可信度:A
读者自检
读完本文后应能回答:
- VLESS 为什么去除应用层加密
- VLESS 请求的协议格式
- Flow 流控模式的作用
- Fallback 回落的多种配置方式
下一步阅读
- XTLS Vision 流控:理解 VLESS 的 Flow 流控实现
- VMess 协议:对比 VLESS 的前身协议