Skip to content

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 提供的传输层安全,应用层的加密就多余了。去除应用层加密:

  1. 减少计算开销
  2. 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

出站的处理相对简单:

  1. 建立到目标 VLESS 服务端的连接
  2. 发送协议头(版本 + 命令 + 端口 + 地址)
  3. 发送用户 UUID
  4. 进入 Flow 流控模式
  5. 双向数据中继

Fallback 回落

Fallback 是 VLESS 入站的一个重要特性。当连接不是有效的 VLESS 连接时(首包不包含有效的 UUID),服务端将连接转发到配置的回落目标。

回落配置示例

json
{
  "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:

go
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.goaccount.pb.go

定义在 protobuf 中:

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.goFlow 流控的核心编解码逻辑
encoding/addons.goFlow 的附加功能(如 XUDP)
encryption/client.go加密层客户端(未用)
encryption/server.go加密层服务端(未用)
encryption/common.go加密层公共逻辑
encryption/xor.goXOR 流加密(未用)

注意:encryption/ 目录虽然存在,但在标准配置(decryption: "none")下不被使用。保留这些文件是为了协议兼容性和潜在的加密扩展。

外部参考资料

资料:VLESS 协议说明 类型:项目官方文档 链接:https://xtls.github.io/ 可信度:A

读者自检

读完本文后应能回答:

  • VLESS 为什么去除应用层加密
  • VLESS 请求的协议格式
  • Flow 流控模式的作用
  • Fallback 回落的多种配置方式

下一步阅读