手动添加 VLESS 与 VMess 节点:字段逐项对照
一句话结论
手动添加 VLESS/VMess,关键字段是地址、端口、UUID、传输方式与 TLS 部分。VMess 的 alterId 现已废弃应填 0;VLESS 要正确填写 flow、SNI 以及 Reality 的公钥与指纹。这类字段填错的表现是直接握手失败,而不是变慢,因此排查方向和速度问题完全不同。
绝大多数时候你不需要手动填 VLESS 或 VMess 节点——从剪贴板导入一条分享链接,v2rayN 会自动把参数拆进各个输入框,又快又准。手动填写的真正价值在别处:当导入后连不上,你得知道那条链接里的哪一段对应界面上的哪一格,才有可能定位到是哪个字段错了。
这类字段错误有一个非常鲜明的特征——它们不会让你"变慢",只会让你"连不上"。UUID 少了一位、SNI 填成了服务器地址、Reality 的公钥被截断,结果都是握手阶段直接失败,延迟测试显示超时。这个特征很有用,因为它把排查方向一刀切开了:测延迟失败往下查字段,测延迟正常但速度差往下查线路。
所以这一篇按"链接的一段 → 界面的一格 → 填错会怎样"这个顺序展开,把两种协议放在一起对照。至于协议本身为什么这样设计,属于原理层面的问题,可以另看 VLESS 与 VMess 的代际差异。
一条 VLESS 分享链接,各段参数对应哪个输入框
先看一条结构完整的链接。以下地址与凭据均为占位示例,不是可用节点:
vless://11111111-2222-3333-4444-555555555555@node.example.invalid:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.example.invalid&fp=chrome&pbk=PUBLICKEYPLACEHOLDER&sid=0123abcd&type=tcp#示例节点
把它按分隔符切开,每一段的归属如下:
| 链接中的位置 | 内容 | v2rayN 中的输入框 |
|---|---|---|
| 协议头 | vless | 决定用哪个添加窗口 |
| @ 之前 | UUID | 用户 ID |
| @ 之后冒号前 | node.example.invalid | 地址 |
| 冒号之后 | 443 | 端口 |
| encryption | none | 加密方式 |
| flow | xtls-rprx-vision | 流控 |
| security | reality | 传输层安全 |
| sni | www.example.invalid | SNI / 伪装域名 |
| fp | chrome | 指纹 |
| pbk | 公钥字符串 | publicKey |
| sid | 0123abcd | shortId |
| type | tcp | 传输协议 |
| # 之后 | 示例节点 | 别名,仅显示用 |
VMess 的分享链接结构不同,它把参数打包成一段编码后的 JSON,肉眼看不出内容,但字段名基本一一对应:add 是地址、port 是端口、id 是 UUID、aid 是 alterId、net 是传输协议、host 与 path 是伪装参数、tls 是传输层安全。
别名(# 之后的部分)不参与连接,只影响列表里的显示。有人以为改了别名会影响连接结果,其实不会;反过来,带中文别名的链接在个别工具间传递时可能被截断,这才是需要注意的地方。
UUID、加密方式和 flow 分别该填什么
这三格挨在一起,出错概率却相差很大。
| 字段 | VLESS | VMess | 常见错误 |
|---|---|---|---|
| UUID | 必填,服务端下发 | 必填,服务端下发 | 手打导致漏字符、多空格 |
| 加密方式 | 固定 none | auto 即可 | 误以为 none 是关掉了加密 |
| flow | 按服务端要求填或留空 | 无此字段 | 自行猜测填一个值 |
UUID 一律用复制粘贴,不要手打。它是三十多个字符加四个连字符,肉眼校对成本极高,而错一位的表现和填错服务器地址一模一样——超时,没有任何提示告诉你是身份不对。粘贴后检查一件事:首尾有没有混进空格,这是从聊天软件复制时的高发问题。
加密方式那一格常引发误解。VLESS 填 none 是协议本身的规定,因为它把加密职责整个交给了外层的 TLS 或 Reality,自身不再做一层。这不等于明文传输。VMess 相反,它自带一层加密,选 auto 让客户端与服务端协商即可。
flow 是 VLESS 特有的流控字段,必须与服务端配置严格一致。服务端开了流控而客户端留空,或者客户端填了服务端没开,都会出现"连接建立后立刻断开"这种比超时更迷惑的现象。不确定时以机场给的链接为准,留空和填错都比猜一个安全。
传输协议选 tcp、ws 还是 grpc
这一格决定数据在 TLS 之下用什么方式承载,选错会导致服务端根本认不出你的请求。
| 传输方式 | 需要额外填什么 | 典型使用场景 |
|---|---|---|
| tcp | 通常无 | 直连节点、Reality 节点 |
| ws | host、path | 走 CDN 中转的节点 |
| grpc | serviceName | 部分对抗性更强的部署 |
| h2 | host、path | 较少见 |
没有"哪个更好"的答案,只有"服务端开了哪个"。这一格属于必须完全对齐的配置项,和后面要说的 SNI 一样,猜是没有意义的。
一个实用的判断线索:如果节点的地址看起来是某个 CDN 服务商的域名而不是一个裸 IP,那多半是 ws 或 grpc,且 host 和 path 不能留空。
伪装域名 host 与路径 path 什么时候必须填
只有传输方式选了 ws、h2 这类基于 HTTP 的承载时,这两格才有意义;选 tcp 时填了也不生效。
它们的作用是让请求在 HTTP 层面看起来像访问某个正常网站的某个路径。服务端会按 path 分流,填错 path 的结果通常是服务端返回 404 之类的响应,客户端表现为握手后立刻断开。
需要特别区分的是 host 和 SNI:
| 参数 | 所在层次 | 作用 | 填错的表现 |
|---|---|---|---|
| SNI | TLS 握手 | 告诉服务端用哪张证书 | 证书错误或握手失败 |
| host | HTTP 头部 | 伪装成访问某站点 | 连接建立后被服务端拒绝 |
两者的值经常相同,于是很多人以为它们是一回事。真正需要分清的时刻是排错——报证书相关错误就去看 SNI,握手过了却马上断就去看 host 和 path。证书类报错的完整对照可以看 TLS 握手失败的报错反查。
Reality 的 publicKey、shortId 和指纹怎么对上
Reality 不是独立协议,它是 VLESS 使用的一种握手伪装方式,因此它的字段是叠加在 VLESS 之上的。原理层面的解释见 Reality 的证书借用机制,这里只说填法。
三个专属字段的对应关系:
- publicKey(pbk)——服务端生成的公钥,整串复制,最容易出错的是被聊天软件自动换行截断,粘贴后确认长度完整。
- shortId(sid)——一段短标识,服务端可能配置了多个,填其中任意一个都行,但必须在服务端的列表里。留空只在服务端允许空值时可用。
- 指纹(fp)——指定客户端模拟哪种浏览器的 TLS 指纹,常见值是 chrome。它必须与服务端预期一致,填一个服务端不接受的值会直接握手失败。
还有一项不属于 Reality 专属但影响巨大的因素:系统时间。TLS 握手对时间敏感,本机时间偏差过大会让证书校验失败。遇到 Reality 节点集体连不上时,先看一眼系统时钟是不是准的,这比检查任何字段都快。
Reality 节点不需要你自己准备域名和证书,SNI 那一格填的是被借用的那个真实站点域名,不是你的服务器地址。把服务器地址填进 SNI 是这一类配置里最常见的错误。
VMess 的 alterId 为什么现在统一填 0
alterId 是 VMess 早期用来生成额外用户 ID 的机制,目的是增加流量特征的随机性。这个设计后来被证明收益有限、开销不小,新版协议改用了另一套方案,alterId 随之废弃。
现在的规则很简单:
| 情形 | alterId 应填 | 说明 |
|---|---|---|
| 新节点、新内核 | 0 | 使用新的认证方式 |
| 链接里写了非 0 值 | 按链接填 | 服务端可能仍是旧配置 |
| 不确定 | 先填 0 试 | 失败再按链接里的值改 |
填了非 0 值而服务端已升级到新方案,或者反过来,表现都是认证失败、连接超时。这也是老配置在新客户端上突然连不上的常见原因之一——不是节点坏了,是这一格的约定变了。
保存后不生效,优先检查哪两处
排查顺序不必从头到尾扫一遍字段,先看两处,命中率最高。
第一处是传输层安全那一组:security 选了 tls 或 reality,但 SNI 留空或填成了服务器 IP。这一组填错的表现是测延迟直接超时,日志里能看到握手相关的失败记录。把日志级别临时调到 info 就能看到具体卡在哪一步。
第二处是复制粘贴的完整性:UUID 和 publicKey 这两串长字符是被截断和混入空格的重灾区。快速验证方法是把界面里的值重新复制出来,和原始链接里的那一段做一次比对。
这两处排除之后,再按下面的顺序看:
- 端口是否正确,特别是从链接里复制时有没有带上冒号。
- 传输方式与 host、path 是否配套,选了 ws 却没填 path 的情况很常见。
- 内核是否支持该协议特性,旧内核对 Reality 的支持不完整,表现同样是握手失败。
- 系统时间是否准确。
# 结构示例:日志级别调到 info 后,握手失败通常呈现为类似这样的记录
[Warning] failed to handshake with node.example.invalid:443
如果这四步都过了仍然不通,问题大概率已经不在字段上,而在节点本身或本地网络,此时该转向连接层的排查思路。
小结
VLESS 与 VMess 的手动配置,关键不在于记住每一格填什么,而在于建立"链接的一段对应界面的一格"这个映射关系。UUID 与 publicKey 一律复制粘贴并检查完整性;VLESS 的加密方式固定 none、flow 必须与服务端一致;VMess 的 alterId 统一填 0,除非链接明确给了别的值。SNI 和 host 分属 TLS 与 HTTP 两层,报错表现不同,不要混为一谈。所有这些字段填错的共同表现都是握手失败而非速度下降,所以测延迟能否通过,就是判断问题在字段还是在线路的分水岭。
常见问题
有分享链接的话,还需要手动一个字段一个字段填吗
不需要,直接从剪贴板导入更快也更不容易出错。手动填写的价值在于看懂字段含义:当导入后连不上时,你需要知道该去检查哪一格,而不是把整条链接删掉重来。
VLESS 的加密方式为什么只能选 none
VLESS 在设计上就没有内层加密,安全性完全交给外层的 TLS 或 Reality 承担。这一格填 none 是协议规定,不是关闭了加密选项,也不代表流量是明文传输。
flow 填与不填有什么区别
flow 指定的是流控方式,必须与服务端配置完全一致。服务端启用了流控而客户端留空,或反过来,都会导致连接建立后立刻断开。不确定时以机场给出的链接参数为准,不要自己猜。
SNI 和伪装域名 host 是同一个东西吗
不是。SNI 属于 TLS 握手阶段,告诉服务端要用哪个证书;host 属于传输层的 HTTP 头部伪装,在 WebSocket 或 HTTP 传输时使用。两者可能填相同的值,但作用层次不同,报错表现也不一样。
Reality 节点保存后提示握手失败,先查什么
先查 publicKey 是否完整复制、指纹是否与服务端要求一致,再查系统时间。这三项里任何一项不对都会在握手阶段失败,而不会表现为速度慢。