Skip to content

VMessAEAD / VLESS 分享链接标准提案 #91

@DuckSoft

Description

@DuckSoft

VMess / VLESS 分享链接提案

0 致谢

1 原则

  • 必须是合法的 URL
  • 对机器友好、对人类可读

2 约定

  • URL 字段对出现顺序不敏感,但同一字段禁止重复出现
  • 所有 URL 字段的 Value 都必须使用 encodeURIComponent 进行转义处理
  • 所有参数名和常数字符串均区分大小写

3 概览

protocol://
	$(uuid)
	@
	remote-host
	:
	remote-port
?
	<protocol-specific fields>
	<transport-specific fields>
	<tls-specific fields>
#$(descriptive-text)

特别说明:$() 代表此处需要 encodeURIComponent

4 详述

4.1 基本信息段

4.1.1 协议名称 protocol

所使用的协议名称。取值必须为 vmessvless

不可省略,不能为空字符串。

4.1.2 uuid

UUID。对应配置文件该项出站中 settings.vnext[0].users[0].id 的值。

不可省略,不能为空字符串。

4.1.3 remote-host

服务器的域名或 IP 地址。

不可省略,不能为空字符串。

IPv6 地址必须括上方括号。

IDN 域名(如“百度.cn”)必须使用 xn--xxxxxx 格式。

4.1.4 remote-port

服务器的端口号。

不可省略,必须取 [1,65535] 中的整数。

4.1.5 descriptive-text

服务器的描述信息。

可省略,不推荐为空字符串

必须使用 encodeURIComponent 转义。

4.2 协议相关段

4.2.1 传输方式 type

协议的传输方式。对应配置文件出站中 settings.vnext[0].streamSettings.network 的值。

当前的取值必须为 tcpkcpwshttpquic 其中之一,分别对应 TCP、mKCP、WebSocket、HTTP/2、QUIC 传输方式。

修订:取值还可以是 grpc,代表 gRPC 传输方式。

4.2.2 (VMess/VLESS) encryption

当协议为 VMess 时,对应配置文件出站中 settings.security,可选值为 auto / aes-128-gcm / chacha20-poly1305 / none

省略时默认为 auto,但不可以为空字符串。除非指定为 none,否则建议省略。

当协议为 VLESS 时,对应配置文件出站中 settings.encryption,当前可选值只有 none

省略时默认为 none,但不可以为空字符串。

特殊说明:之所以不使用 security 而使用 encryption,是因为后面还有一个底层传输安全类型 security 与这个冲突。
@huyz 提议,将此字段重命名为 encryption,这样不仅能避免命名冲突,还与 VLESS 保持了一致。

4.2.3 (VMess) alterIdaid

没有这些字段。旧的 VMess 因协议设计出现致命问题,不再适合使用或分享。

此分享标准仅针对 VMess AEAD 和 VLESS。

4.3 传输层相关段

4.3.1 底层传输安全 security

设定底层传输所使用的 TLS 类型。当前可选值有 nonetlsxtls

省略时默认为 none,但不可以为空字符串。

4.3.2 (HTTP/2) path

HTTP/2 的路径。省略时默认为 /,但不可以为空字符串。不推荐省略。

必须使用 encodeURIComponent 转义。

4.3.3 (HTTP/2) host

客户端进行 HTTP/2 通信时所发送的 Host 头部。

省略时复用 remote-host,但不可以为空字符串。

若有多个域名,可使用英文逗号隔开,但中间及前后不可有空格。

必须使用 encodeURIComponent 转义。

4.3.4 (WebSocket) path

WebSocket 的路径。省略时默认为 /,但不可以为空字符串。不推荐省略。

必须使用 encodeURIComponent 转义。

4.3.5 (WebSocket) host

WebSocket 请求时 Host 头的内容。不推荐省略,不推荐设为空字符串。

必须使用 encodeURIComponent 转义。

4.3.6 (mKCP) headerType

mKCP 的伪装头部类型。当前可选值有 none / srtp / utp / wechat-video / dtls / wireguard

省略时默认值为 none,即不使用伪装头部,但不可以为空字符串。

4.3.7 (mKCP) seed

mKCP 种子。省略时不使用种子,但不可以为空字符串。建议 mKCP 用户使用 seed

必须使用 encodeURIComponent 转义。

4.3.8 (QUIC) quicSecurity

QUIC 的加密方式。当前可选值有 none / aes-128-gcm / chacha20-poly1305

省略时默认值为 none

4.3.9 (QUIC) key

当 QUIC 的加密方式不为 none 时的加密密钥。

当 QUIC 的加密方式为 none 时,此项不得出现;否则,此项必须出现,且不可为空字符串。

若出现此项,则必须使用 encodeURIComponent 转义。

4.3.10 (QUIC) headerType

QUIC 的伪装头部类型。其他同 mKCP headerType 字段定义。

4.3.11 (gRPC) serviceName

对应 gRPC 的 ServiceName。建议仅使用英文字母数字和英文句号、下划线组成。

不建议省略,不可为空字符串。

4.3.12 (gRPC) mode

对应 gRPC 的传输模式,目前有以下三种:

  • gun: 即原始的 gun 传输模式,将单个 []byte 封在 Protobuf 里通过 gRPC 发送(参考资料);
  • multi: 即 Xray-Core 的 multiMode,将多组 []byte 封在一条 Protobuf 里通过 gRPC 发送;
  • guna: 即通过使用自定义 Codec 的方式,直接将数据包封在 gRPC 里发送。(参考资料

省略时默认为 gun,不可以为空字符串。

4.4 TLS 相关段

4.4.1 sni

TLS SNI,对应配置文件中的 serverName 项目。

省略时复用 remote-host,但不可以为空字符串。

4.4.2 alpn

TLS ALPN,对应配置文件中的 alpn 项目。

多个 ALPN 之间用英文逗号隔开,中间无空格。

省略时由内核决定具体行为,但不可以为空字符串。

必须使用 encodeURIComponent 转义。

4.4.3 allowInsecure

没有这个字段。不安全的节点,不适合分享。

4.4.4 (XTLS) flow

XTLS 的流控方式。可选值为 xtls-rprx-directxtls-rprx-splice 等。

若使用 XTLS,此项不可省略,否则无此项。此项不可为空字符串。

5 举例

# VMess + TCP,不加密(仅作示例,不安全)
vmess://99c80931-f3f1-4f84-bffd-6eed6030f53d@qv2ray.net:31415?encryption=none#VMessTCPNaked
# VMess + TCP,自动选择加密。编程人员特别注意不是所有的 URL 都有问号,注意处理边缘情况。
vmess://f08a563a-674d-4ffb-9f02-89d28aec96c9@qv2ray.net:9265#VMessTCPAuto
# VMess + TCP,手动选择加密
vmess://5dc94f3a-ecf0-42d8-ae27-722a68a6456c@qv2ray.net:35897?encryption=aes-128-gcm#VMessTCPAES
# VMess + TCP + TLS,内层不加密
vmess://136ca332-f855-4b53-a7cc-d9b8bff1a8d7@qv2ray.net:9323?encryption=none&security=tls#VMessTCPTLSNaked
# VMess + TCP + TLS,内层也自动选择加密
vmess://be5459d9-2dc8-4f47-bf4d-8b479fc4069d@qv2ray.net:8462?security=tls#VMessTCPTLS
# VMess + TCP + TLS,内层不加密,手动指定 SNI
vmess://c7199cd9-964b-4321-9d33-842b6fcec068@qv2ray.net:64338?encryption=none&security=tls&sni=fastgit.org#VMessTCPTLSSNI
# VLESS + TCP + XTLS
vless://b0dd64e4-0fbd-4038-9139-d1f32a68a0dc@qv2ray.net:3279?security=xtls&flow=rprx-xtls-splice#VLESSTCPXTLSSplice
# VLESS + mKCP + Seed
vless://399ce595-894d-4d40-add1-7d87f1a3bd10@qv2ray.net:50288?type=kcp&seed=69f04be3-d64e-45a3-8550-af3172c63055#VLESSmKCPSeed
# VLESS + mKCP + Seed,伪装成 Wireguard
vless://399ce595-894d-4d40-add1-7d87f1a3bd10@qv2ray.net:41971?type=kcp&headerType=wireguard&seed=69f04be3-d64e-45a3-8550-af3172c63055#VLESSmKCPSeedWG
# VMess + WebSocket + TLS
vmess://44efe52b-e143-46b5-a9e7-aadbfd77eb9c@qv2ray.net:6939?type=ws&security=tls&host=qv2ray.net&path=%2Fsomewhere#VMessWebSocketTLS

6 补充

6.1 2020/12/21 @RPRX 关于 flow 选项的补充说明

#91 (comment)

  1. -udp443 系列属于客户端选项,不建议服务器下发,是否开启应由客户端决定。

  2. splice 的使用场景比较苛刻,目前要求入站“纯粹”、且运行在 Linux / Android 操作系统上。若不满足相关要求,客户端使用 direct 模式即可。

@DuckSoft 的唠叨:

  1. 目前 splice 与否对服务器方面没有要求,服务器使用 direct 即可支持 splicedirect建议服务器下发 direct,开启 splice 与否应由客户端自行决定。
  2. 必须充分认识到,XTLS 仍处于实验性阶段,当前阶段分享链接的主要目标是方便 XTLS 节点的交换与传播,并不适用于机场大规模下发。分享链接标准的更新会紧跟 XTLS 的任何变化,在稳定版之前出现破坏性变更是大概率事件,请知悉。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions