VLESS — Xray-core
VLESS 是 Xray 的无状态旗舰协议。协议本身没有对称加密层,机密性与完整 性由外层 TLS / REALITY 提供。握手会携带用户的 UUID 与一小段 "addons" 块(其中最重要的是 flow 算法)。
入站
"protocol": "vless" 入站的 settings:
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
users | []json.RawMessage | — | <user object array> | … | 入站账户列表;对象形状与 `clients` 相同。`users` 是近期 Xray 引入的较新名称,与 `clients` 一并接受。 |
clients | []json.RawMessage | (required) | <user object array> | 可接受的用户列表。每个条目至少携带 `id`(UUID),可选 `email`、`level`、`flow`、`testseed`、`reverse`。入站 client 上设置 `encryption` 会被拒绝。 |
decryption | string | (required) | none | mlkem768x25519plus.<mode>.<seconds>.<keys> | 必须显式设置。`none` 是经典的 VLESS 无加密模式;以 mlkem 开头的字符串启用新的后量子加密 —— 格式见下文「说明」。 |
fallbacks | []*VLessInboundFallback | [] | <VLessInboundFallback array> | TLS-with-VLESS 握手不像 VLESS(例如杂入的 HTTPS 请求)时使用的备用目标。与非 `none` 的 `decryption` 互斥。 |
flow | string | (empty) | | xtls-rprx-vision | 未自行指定 flow 的客户端使用的默认 flow。`xtls-rprx-vision` 启用 XTLS Vision;空值表示不启用 flow。 |
testseed | []uint32 | [] | <uint32 array> | 供加密套件确定性测试模式使用的种子值,几乎总是省略。 |
源码: infra/conf/vless.go:33-40 · 锚定版本 v26.6.1 (94ffd50)
clients[] —— 用户对象
用户对象会被 JSON 解码到 protobuf 背后的 vless.Account 结构体。 常用字段如下:
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
id | string (UUID) | 必填 | <UUID> | 客户端 UUID。规范 8-4-4-4-12 形式或去掉横线的 hex。 |
email | string | "" | <string> | 统计 / 日志输出中使用的标签。 |
level | uint32 | 0 | <level> | 在 policy.levels 中查找。 |
flow | string | 继承 flow | ""、xtls-rprx-vision | 单用户的 flow 覆盖。 |
testseed | []uint32 | 继承 | — | 单用户的测试种子覆盖。 |
encryption | string | 禁止 | — | 入站 client 上 不允许 设置。 |
reverse | {tag,sniffing?} | (未设置) | VLessReverseConfig | 把该用户绑定到反向代理标签。入站 reverse 块内不允许 sniffing。 |
fallbacks[]
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
name | string | (unset) | <TLS server name> | 匹配传入的 TLS SNI;空值匹配任意。 |
alpn | string | (unset) | h2 | http/1.1 | | 匹配协商出的 ALPN;空值匹配任意。 |
path | string | (unset) | /<path> | 代理时使用的 HTTP 路径前缀。非空时必须以 `/` 开头。 |
type | string | (auto) | tcp | unix | serve | 后端协议。省略时由 `dest` 推断:数字端口或 host:port → tcp;绝对路径或 @ 开头 → unix;`serve-ws-none` → serve。 |
dest | json.RawMessage | (required) | <host:port> | <port> | <unix path> | 握手转发的目的地。纯整数会被当作 localhost 上的端口。 |
xver | uint64 | 0 | 0 | 1 | 2 | 转发连接前置的 PROXY 协议版本,0 关闭。 |
源码: infra/conf/vless.go:24-31 · 锚定版本 v26.6.1 (94ffd50)
当传入连接的 首个字节 不像 VLESS 时,会按声明顺序在 fallback 链上 匹配。字段顺序很重要:匹配按 (name, alpn, path) 三元组进行,命中第 一条即停。dest 的解析参见 infra/conf/vless.go:149-200。
出站
"protocol": "vless" 出站的 settings:
| 字段 | 类型 | 默认值 | 允许值 | 描述 |
|---|---|---|---|---|
address | *Address | (unset) | <host> | 简化形式 —— 服务器主机名或 IP。设置后内部自动构造 `vnext`,顶层 `id`、`flow` 等会被直接读取。 |
port | uint16 | (required with address) | <port> | 服务器端口(简化形式)。 |
level | uint32 | 0 | <uint32> | 用户等级(简化形式)—— 用于查找策略表。 |
email | string | (unset) | <string> | 统计中显示的用户标识。 |
id | string | (required with address) | <UUID> | 用户 UUID(简化形式)。规范形式与去横线 hex 都接受。 |
flow | string | (empty) | | xtls-rprx-vision | xtls-rprx-vision-udp443 | flow 算法。 |
seed | string | (unset) | <string> | 加密种子(保留字段)。当前会被解析但不生效 —— 为前向兼容预留。 |
encryption | string | (required) | none | mlkem768x25519plus.<mode>.<rtt>.<keys> | 必须设为 `none` 或 mlkem 加密字符串。其他取值都会被拒绝。 |
reverse | *VLessReverseConfig | (unset) | VLessReverseConfig | 可选:把出站绑定到反向代理标签。 |
testpre | uint32 | 0 | <uint32> | 确定性测试模式的预测试计数。 |
testseed | []uint32 | [] | <uint32 array> | 确定性测试模式的种子值。 |
vnext | []*VLessOutboundVnext | (use simplified shape) | [{address,port,users:[user]}] | 完整形式 —— 必须 **恰好** 一个服务器 **一** 个用户。多端点请使用多个出站加路由负载均衡器。 |
源码: infra/conf/vless.go:245-258 · 锚定版本 v26.6.1 (94ffd50)
简化形式 vs. vnext
出站接受 要么 简化的顶层形式(address、port、id、flow ……),要么 完整的 vnext 形式 —— 二者不能同时存在。简化形式 在内部会被改写成单条 vnext 数组(infra/conf/vless.go:251-259)。 完整形式必须 恰好 包含 一 个服务器 一 个用户;多端点 场景请使用多个 VLESS 出站配合路由负载均衡器。
示例
最小入站,单用户启用 XTLS Vision:
{
"inbounds": [
{
"tag": "vless-in",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{ "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", "flow": "xtls-rprx-vision" }
],
"decryption": "none"
},
"streamSettings": { "network": "tcp", "security": "tls" }
}
]
}简化出站:
{
"outbounds": [
{
"tag": "proxy",
"protocol": "vless",
"settings": {
"address": "example.com",
"port": 443,
"id": "a3482e88-686a-4a58-8126-99c9df64b7bf",
"flow": "xtls-rprx-vision",
"encryption": "none"
},
"streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { /* ... */ } }
}
]
}说明
decryption与encryption必填。缺失会产生错误please add/set "decryption":"none" to every settings(infra/conf/vless.go:140)或对应的出站错误。- 基于 mlkem 的加密字符串由
Build中的内联闭包解析(入站infra/conf/vless.go:95-137,出站321-357)。格式:mlkem768x25519plus.<mode>.<seconds-or-rtt>.<keys-and-padding>, 其中 mode 取native/xorpub/random;seconds 形如<from>或<from>-<to>(入站)或1rtt/0rtt(出站);keys 为 base64-url-safe 的 32 字节或 1184 字节值,短字符串用作 padding。 - 当前源码接受的 flow 值仅有
xtls-rprx-vision,出站额外接受-udp443后缀。 fallbacks不能与非none的decryption并存 (infra/conf/vless.go:145-147)。fallbacks[].xver > 2会被拒绝。只接受 PROXY 协议 v0 / v1 / v2。
跨内核说明
- sing-box 使用
users[].uuid替代 Xray 的clients[].id,并用users[].name替代email。参见 VLESS — sing-box。 - mihomo 的 YAML 只有单一出站形式(不存在入站 / 出站不对称); 用户 UUID 存放在 proxy 对象本身,而不是 clients 数组里。参见 VLESS — mihomo。
源码: infra/conf/vless.go:24-258 · v26.6.1 (94ffd50)
