-
Notifications
You must be signed in to change notification settings - Fork 4k
This issue was moved to a discussion.
You can continue the conversation there. Go to discussion →
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
VMessAEAD / VLESS 分享链接标准提案 #91
Comments
友情提醒:VLESS 的是基于 VLESS 0 的 提案,由于 VLESS 协议还在进化,分享标准也会随时修改,比如改定义、加字段、删字段。 如果客户端无法及时跟进 breaking change(要求不兼容旧行为,直接 breaking,避免行为混乱),请等完全确定后再实现。 |
breaking 不是问题,列明变更、行为确定即可。 最怕的事情不是没有规范,而是后续的实现者要去翻看各个实现的代码,以某一实现所使用的语言/代码的特性作为规范。 Trojan-Go的分享链接规范即是我主导制定的,目前为止看来基本上达到了目的。 最后,希望这份花了4个小时反复推敲斟酌的文档能够帮后续的开发者缩减至少4个小时的开发时间,也希望VMess的悲剧不要再重演。 |
对 VLESS
计划中 XTLS 还会有些合并与优化,VLESS 则至少会有两类 UDP 增强:UDP over TCP 的 MUX 隧道、纯 UDP 多倍发包 + 长度填充 |
很好的提案 |
4.2.1 传输方式 type = tcp时,进行 HTTP 伪装,这个时候如何分享这个type https://www.v2fly.org/config/transport/tcp.html#httpheaderobject |
这个暂时没有想好,因为我记得两个客户端能进行通讯的要求是 Request 和 Response 部分都必须完全一致才可以,这是一个特别强的要求,除了把两坨 JSON 硬编码打进来我没有想到别的优雅的办法了。个人认为这样的节点可能不太适合分享。 如果选择支持 http 伪装,对应的设置的分享方式还需要仔细斟酌。 |
那这样,我们这边暂时引用旧的做法, headerType = "http" , host="",两坨 JSON 硬编码直接内置了先. |
我觉得大概可以这样:
画风大概如此:
|
把request/response base64后看起来好看一点吧 |
那大概会变成: 如果先用 zlib 过一遍,大概会变成: 最后吐槽一次,实在是实在是实在是太丑了…… |
v2rayN现在的做法,分享 如果要分享整个requestHost,那的确不合适 |
This comment has been minimized.
This comment has been minimized.
大佬预计啥时候释出支持此方案的N或NG? |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
省略时复用
省略时的行为没有说。 |
4.3.5 省略时的就是没有那个 Host Header,具体行为由核心负责。 4.3.3 和 4.4.1 省略的时候的效果应该同直接配置文件不写那一项相同,稍后修订,同样具体行为核心负责。 另外,置空和省略是不同的。 |
即: 如sni: |
抱歉是我疏忽了,json文件中websocket host 置空和省略行为确实不同 |
我自定义id "#7544@" 无法用分享链接导入v2rayng。 |
This comment has been minimized.
This comment has been minimized.
vless://#7544@@udhdhjv.xyz:443?security=xtls&encryption=none&headerType=none&type=tcp&flow=xtls-rprx-splice#%F0%9F%87%B8%F0%9F%87%AC%E6%96%B0%E5%8A%A0%E5%9D%A1 |
@Butterflyflower 这个链接我导入不到v2rayng中,是不是要去v2rayng反馈。 |
@Butterflyflower 分享链接只有 uuid,自定义 id 不直接分享 |
This comment has been minimized.
This comment has been minimized.
|
的确,此处应该遵循内核的空值行为 |
[new] 适配 vless 链接规范 XTLS/Xray-core#91
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
请问multiMode这个属性怎么表示,是用multiMode=0|1来代表真假,还是true,false? |
按道理来说,MultiMode 与传统的 gun 完全不兼容,应该作为一种新的传输类型(比如叫 暂时能确定的应该只有 |
我想说一下我个人的想法,这个想法之前就有想过了,与 这个想法是,把分享链接是json文件outbound部分一种映射,即在指定分享链接标准的时候,只需要考虑这个分享链接对应的json文件应该是什么样子的,而不需要考虑上游的行为。 简单点说就是:给出一个分享链接,根据分享链接能且仅能写出一个outbound。 我也不知道我的想法好不好,轻喷 当然有的部分变通也是好的,比如allowInsecure不能写,且对应json文件一定是false。这个我就觉得很好。 所以我想问的是,当json中有键值对的数据是布尔类型时,在分享链接上应该如何表示。不一定是 |
@kirin10000 我的倾向是布尔值有且仅有三种取值,要么未指定,要么是0,要么是1,不能为空。 至于multiMode这种,我认为未来可能还会出来更多种类的互不兼容的模式,出于这样的考虑我不想把他作为布尔型。 |
New Format XTLS/Xray-core#91 For Vmess QRcode https://github.com/2dust/v2rayN/wiki/%E5%88%86%E4%BA%AB%E9%93%BE%E6%8E%A5%E6%A0%BC%E5%BC%8F%E8%AF%B4%E6%98%8E(ver-2) gRPC mode is mapped to "type"
XTLS 的流控方式。可选值为 xtls-rprx-direct、xtls-rprx-splice 等。 但是例子里面又变成了“rprx-xtls-splice”,rprx和xtls的顺序反过来了。规范还是严谨一些好。 |
可能是当时就是写成 @DuckSoft 建议修改一下例子 |
the name |
为什么不直接用 json 呢? vless://base64encode({"host":"11.11.11.11", "port": 443, "uuid": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}) 客户端只需要 json.Unmarshal 一下,就可以了 |
This issue was moved to a discussion.
You can continue the conversation there. Go to discussion →
VMess / VLESS 分享链接提案
0 致谢
1 原则
2 约定
encodeURIComponent
进行转义处理3 概览
特别说明:
$()
代表此处需要encodeURIComponent
。4 详述
4.1 基本信息段
4.1.1 协议名称
protocol
所使用的协议名称。取值必须为
vmess
或vless
。不可省略,不能为空字符串。
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
的值。当前的取值必须为
tcp
、kcp
、ws
、http
、quic
其中之一,分别对应 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)
alterId
、aid
等没有这些字段。旧的 VMess 因协议设计出现致命问题,不再适合使用或分享。
此分享标准仅针对 VMess AEAD 和 VLESS。
4.3 传输层相关段
4.3.1 底层传输安全
security
设定底层传输所使用的 TLS 类型。当前可选值有
none
,tls
和xtls
。省略时默认为
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-direct
、xtls-rprx-splice
等。若使用 XTLS,此项不可省略,否则无此项。此项不可为空字符串。
5 举例
6 补充
6.1 2020/12/21 @RPRX 关于
flow
选项的补充说明-udp443
系列属于客户端选项,不建议服务器下发,是否开启应由客户端决定。splice
的使用场景比较苛刻,目前要求入站“纯粹”、且运行在 Linux / Android 操作系统上。若不满足相关要求,客户端使用direct
模式即可。The text was updated successfully, but these errors were encountered: