跳至正文

INFO

本頁暫以簡體中文顯示,待繁體中文翻譯完成後更新。

节点与分享链接 ​

node { ... } 从分享链接声明可拨号的出站,并为每个节点分配稳定的运行时身份。

node {} 声明 ​

每个非注释行是一个分享链接。标签与链接都可加引号或裸写:

配对引号之外,位于语句开头或紧跟 ASCII 空格、制表符的 # 表示注释开始。

# 的位置处理结果示例
裸链接的空白之后开始注释ss://…#hk1 # note 保留名称 hk1。
紧接裸链接中的文本保留为链接数据ss://…#hk2#note 保留 hk2#note。
紧接链接的结束引号按兼容规则开始注释,并在该字节处产生 legacy-glued-hash 警告'ss://…#hk1'#note 保留 hk1。

注释前应留空白。结束引号后的其他文本使条目被跳过,并产生 trailing-entry-text 诊断。引号错误与块结构规则见方言参考。

dae
node {
    iris: 'socks5://10.10.10.1:2077'
    'hk1': 'ss://[email protected]:8388#fragment-name'
    'trojan://[email protected]:443?sni=example.com#trojan1'
    socks5://10.10.10.2:1080
}

当前解析器同时接受带标签和不带标签的条目。非空 dae 标签会替换链接的 #fragment 名称。不带标签的链接保留解码后的片段;没有片段时使用不含凭据的 {scheme}-{host} 回退名称。

VMess JSON 的 ps 备注缺失或为空时,先使用 vmess-{host} 通过校验,再由非空 dae 标签替换名称。

识别标签与链接的结束引号时,反斜杠会转义下一个字符;解析后的文本保留原始转义序列。

解析器按以下规则处理无效条目:

输入处理结果
协议已识别但格式错误的链接丢弃条目并产生警告。已知无效字段保留具体的安全原因和模式路径;未知解析失败使用 invalid-node-entry。
未知协议或已删除的 VLESS vless_mode拒绝配置。
独立的 mux: 或 mux= 行拒绝配置。VLESS 数据包与承载连接选项须使用链接中的精确查询参数 packetEncoding=、mux= 和 udp=。

诊断保留原始节点条目序号与来源位置,不包含原始链接、值或节点名称。数据接口返回诊断而不记录日志;普通接口只报告一次。

被接受的链接只会产生 legacy-* 代码的警告。节点条目上的其他警告都表示该条目已被丢弃。客户端可用 syntax 模式校验单个 node { name: 'link' } 声明,仅凭诊断代码区分被跳过与被接受的链接。

旧版 ss://base64(method:password@host:port) 格式按字面值读取解码后的凭据,不做 URL 解码:%20 保持为 %20,?、/、#、: 和 @ 仍是密码字符。最后一个 @ 分隔凭据与端点;用户信息本身也可以是 base64(method:password)。解码后的载荷缺少 @,或凭据无法解析为方法与密码时,拒绝解析。URL 用户信息格式仍按百分号解码凭据。端点、路径、查询参数(包括 /?plugin=...)和片段继续按 URL 处理。

节点身份 ​

Node::derive_id() 是唯一的身份派生路径。它对以下材料计算 UUID v5:

text
protocol|host|port|credential-fingerprint|dial-shape

凭据指纹遵循各处理器的字段优先级。拨号形态包含:

  • sni、传输方式和 WebSocket/gRPC 形态;
  • Hysteria2 混淆、REALITY 参数和 flow;
  • 有效的 VLESS TLS 安全配置、UDP 权限、回退编码和多路复用路径。

明文 VLESS 与 TLS 使用不同身份。REALITY 密钥选择认证传输,不受冗余 TLS 标志影响。

结构化 tls_alpn身份派生方式
非空以基础 ID 为命名空间、JSON 元组 ["tls-alpn", <ordered list>] 为名称派生子 UUID v5。这将 ALPN 与任意凭据文本分离。
空值保留基础 ID。

调优参数与显示元数据不参与派生,但改变物理路径的 VLESS 多路复用上限除外。

XHTTP 身份还包含有效的 TLS/明文安全配置,以及全部已接受的规范 XHTTP 参数,包括标头、填充和 POST 间隔。输入别名、标头名称大小写与等价范围表示会在派生前规范化。新增 XHTTP 不改变已有 TCP/WS/gRPC 身份材料。

拼接前,每个原始凭据字段、拨号形态字段和有效的 host 值都会将 \ 转义为 \\,将 | 转义为 \|。拼接后的指纹不再转义。对于通过 Config::validate 的节点,不同的身份字段会产生不同的哈希输入。完整配置校验拒绝的节点不在此保证范围内,即使 Node::from_share_link 能为其派生 ID。

**破坏性升级:**所有成功重新派生身份的 VLESS 节点都会获得新 ID,包括从未填写 vless_mode、关闭 UDP 或设置 ALPN 的节点。以 ID 为键的健康、预热及会话状态会重新建立。其他协议仅在上述以 | 拼接的身份字段中含有 | 或 \ 时变更 ID;ALPN 使用独立的 JSON 子 UUID 步骤,仅 ALPN 含有这些字符不触发该变化。

**逐包带地址的 UDP 分帧:**有效 UDP 路径在 53、443 或 54 端口使用 UoT v2 或 H2MUX 的 VLESS 节点,会再次获得新 ID。这包括 packetEncoding=uot-v2、mux=h2mux,以及到达这两条路径的池回退,因为这些路径现在逐包携带地址。

Auto、native、XUDP、Mux.Cool 与关闭 UDP 的节点 ID 不变。直接选择节点的 Selector 以节点 ID 为键,ID 改变时该选择丢失。结构化 JSON/YAML/TOML 配置若在组的 nodes 中引用旧 ID,加载时会关联到新 ID。

不要为了迁移 ID 而删除缓存。持久化已启用且可读时:

状态节点 ID 变化的影响
直接选择节点的 Selector 固定选择以节点 ID 为键,因此丢失。
选择子组的 Selector 固定选择以组名为键,因此保留。
有效且不超过 24 小时的 TCP-v4 延迟样本启动时按节点名关联到新 ID。样本只用于排名,不恢复存活状态。改名或重复名称不能保证恢复同一个叶节点。

就绪流原本就随所属代次退役。name/subtag 筛选语义不变。

只要可拨号端点和拨号形态不变,身份在改名、重载和订阅刷新后仍保持稳定。配置与运行时组装会拒绝重复的派生 ID。Node::default() 的 ID 为 nil;构造路径会派生 ID,出站运行时注册表会拒绝任何传入的 nil ID。

节点字段 ​

Node 模型包含下列字段。分享链接从协议方案、用户信息、地址部分、片段和查询参数填充面向操作者的字段;明确标为元数据的行由结构化 loader、导入或运行时管理。它们都不是 dae node {} 中的独立键。下表默认值是模型默认值;URL 形分享链接省略端口时使用 443,而 v2rayN VMess 载荷必须包含有效端口。

字段类型默认值含义
idUUID派生上述稳定内容身份;运行时不允许 nil
namestring""dae 标签、解码后的片段、remark 查询参数、VMess ps 或不含凭据的回退名称
protocolenumss从分享链接协议方案派生
addressstring""解析后的链接存储 host:port
hoststring""显式服务端主机;否则 Node::host() 从 address 派生
portu160服务端端口;URL 形链接省略时使用 443
username / passwordstring?null来自用户信息的认证、UUID 或密钥
encryptionstring?nullSS/VMess 加密方式或 VLESS Encryption 客户端字符串;Shadowsocks 省略时拨号阶段回退到 aes-128-gcm
packet_encodingVlessUdpEncodingVLESS 使用 auto结构化 VLESS 回退编码:auto、native、xudp 或 uot-v2;规范 URI 的 packetEncoding=none 映射为 native
multiplexVlessMultiplexVLESS 使用 {"protocol":"off"}结构化 VLESS 承载连接选择:off、h2 或 xray;精确形态见下文
plugin / plugin_optsstring?null解析后的 SIP002 插件元数据;代理插件不受支持,订阅导入会拒绝非空值
transportstring"tcp"流传输:空值/tcp、ws、grpc 或规范 xhttp;输入 splithttp 规范化为 xhttp
tlsboolfalse流 TLS 标志;Trojan/AnyTLS 链接开启,规范 VLESS 链接历史默认开启
snistring?nullTLS 服务端名称;非空的 sni 与 peer 必须一致,未被传输层使用的 host 作为回退值
tls_alpnstring[][]AnyTLS 与 TCP Trojan/VMess/VLESS 的结构化普通裸 TCP TLS ALPN。XHTTP 将省略或 h2 规范化为 ["h2"],包括 REALITY 和显式明文 H2;其他关闭 TLS、REALITY、WS/gRPC、QUIC override 仍不支持。TUIC 保留 tuic_alpn。
skip_cert_verifyboolfalse跳过证书校验;allowInsecure、allow_insecure 与 insecure 的有效声明必须一致,安全影响见下文
ech_enabledboolfalse存在静态 ECH 配置,或 ech=1/true
ech_configstring?null来自 ech_config 或 echconfig 的 Base64 ECHConfigList
ech_config_pathstring?null结构化 loader 中指向 base64 ECHConfigList 的路径;不是分享链接查询参数
reality_public_keystring?null来自 pbk 的 REALITY X25519 公钥
reality_short_idstring?null来自 sid 的 REALITY short ID
reality_spider_xstring?null存储的 spx;REALITY 链接默认设为 /
flowstring?nullVLESS xtls-rprx-vision 或 xtls-rprx-vision-udp443;Shadowrocket xtls=2 选择基础 flow
networkstring?null受支持协议的数据包网络能力;与 VMess JSON net 等流传输字段独立
ws_path / ws_hoststring?nullWebSocket path 与 Host 标头
grpc_servicestring?nullgRPC serviceName 或 service_name
xhttpobject?省略flat 结构化输入/输出中的规范 XHTTP 参数;其他传输携带该对象会被拒绝
hy2_auth / hy2_obfsstring?nullHysteria2 认证与 salamander 密码
hy2_up_mbps / hy2_down_mbpsu32?nullHysteria2 brutal 发送端/接收端带宽提示
hy2_port_hopping / hy2_hop_intervalstring? / u64?nullHysteria2 mport 列表与 mhop 秒数;默认间隔为 30 秒;配置值的下限为 5 秒
hy2_init_stream_recv_window / hy2_init_conn_recv_windowu64?nullHysteria2 QUIC 接收窗口;有效默认值为 8 MiB / 8 MiB,应用读取足够快时 conn 窗口自动增长至最多 32 MiB(conn 窗口同时是每连接内存预算,慢消费者最多缓冲约 3 倍该值)
hy2_disable_mtu_discoverybool?nullHysteria2 disablePathMTUDiscovery
quic_mtuu16?null来自 mtu 的 QUIC UDP 载荷大小。通告的接收大小默认 1252,范围为 1200–65527。发送 MTU 从 1200 开始,通过路径 MTU 发现增长。显式 mtu 同时设置初始发送 MTU 和发现上限。大于 1252 时在常规套接字上启用 GSO,但不包括 Hysteria2 混淆/跳端口套接字。HONK_QUIC_GSO=0 强制关闭 GSO。
tls_pin_sha256string?null来自 pinSHA256 或 pin_sha256 的叶证书 SHA-256 pin
tuic_uuid / tuic_passwordstring?nullTUIC 凭据;扁平字段须与别名 username / password 一致
tuic_congestion / tuic_alpnstring?nullTUIC congestion_control 与逗号分隔的 alpn
tuic_init_stream_recv_window / tuic_init_conn_recv_windowu64?nullTUIC QUIC 接收窗口;有效默认值为 8 MiB / 8 MiB,conn 窗口自动增长至最多 32 MiB
juicity_uuid / juicity_passwordstring?nullJuicity 凭据;扁平字段须与别名 username / password 一致
anytls_passwordstring?null从链接用户信息复制的 AnyTLS 密钥
anytls_min_idle_sessionusize?null来自 min_idle_session 的空闲会话目标下限;有效默认值 0,受八条会话的池上限约束
anytls_idle_session_check_intervalu64?null解析后的 idle_session_check_interval 秒数;当前运行时 janitor 周期仍固定为 30 秒
anytls_idle_session_timeoutu64?null来自 idle_session_timeout 的空闲驱逐;有效默认值 30 秒
marku32?null结构化模型中的出站 SO_MARK;不是 dae 分享链接查询参数
tagsstring[][]分类元数据;不是 dae 分享链接查询参数
subscription_id / group_idUUID?null导入/运行时归属元数据
created_at / updated_atdatetimenow运行时元数据

节点自身校验要求非空名称、有效主机和显式非零 port。address 不会补充缺失的端口;仅提供 IPv6 地址时须显式设置 host。只有身份与注入规则完全一致的 direct/block 内置节点可省略端点。

结构化 loader 兼容性 ​

TOML、YAML 与 JSON 继续使用旧的扁平节点键。加载时只读取所选 protocol 的字段。其他协议遗留的非默认字段会被移除,但不会拒绝节点;一条警告列出所有移除的字段名。例如,ss 节点上的 tls: true 会被忽略并告警,不会开启 TLS。

对 Trojan、VLESS、Hysteria2 与 AnyTLS,username 不是凭据别名。缺少该协议实际凭据字段时,单独提供的 username 会被移除并触发针对性警告,保持旧版行为与 ID。

所选协议使用的值仍会正常解析与校验。honk 自身输出仍可安全地再次导入。启用 store_subscribe 时,原始订阅正文仅在解析成功后持久化。被拒绝的刷新不会覆盖上一份有效正文。

VLESS 扁平输入已移除 vless_mode。只要原始输入中出现该字段,节点就会被拒绝,包括值为 null 或任一旧版已知拼写;请用 network 表示数据包权限、packet_encoding 表示回退、multiplex 表示承载连接选择。唯一保留的 vless_mode: "legacy" 是非 VLESS 扁平格式序列化的兼容占位字段。它不配置 VLESS,非 VLESS 行为与身份保持不变。

扁平凭据别名在移除不兼容字段前比较:

协议必须一致的别名
Hysteria2hy2_auth / password
TUICtuic_uuid / username;tuic_password / password
Juicityjuicity_uuid / username;juicity_password / password
AnyTLSpassword / anytls_password

缺失或 null 表示未提供。已提供的字符串须逐字节一致,空字符串和首尾空格也参与比较。空凭据仍须满足对应协议的要求。扁平凭据字段仍须使用字符串;数字转换仅适用于订阅导入。

新增 tls_alpn 字段不沿用旧字段剥离规则:不支持的协议或 TLS 上下文带有非空值时,会拒绝节点,而不是静默改变握手。

分享链接的证书校验布尔值忽略首尾空白和 ASCII 大小写:

值证书校验
true、yes、1、on关闭
false、f、no、n、0、off、t、y开启
空文本、未知文本或别名冲突拒绝链接

安全行为变更:yes 和 on 以前保持校验开启,现在会关闭校验并产生警告。升级前应检查这些链接,改用明确的 true 或 false。结构化布尔值仍须使用原生布尔类型,不转换字符串或数字。

VMess 加密方式接受 auto 和 aes-128-gcm,忽略大小写并存储为小写;空的可选声明使用默认值。JSON 的 scy/security、编码分享链接的 encryption/scy/表示加密方式的 security,以及订阅支持的加密方式别名,须在赋值前比较。不支持的值或冲突会使节点被拒绝。编码分享链接中的 security=none 和 security=tls 仍控制 TLS,不表示加密方式。记录格式的位置参数仍是低优先级备用值。

TUIC 分享链接和订阅的转发模式只接受未指定、空值或 native。即使存在有效别名,不支持的 udp-relay-mode/udp_relay_mode 仍会使条目被拒绝。

Hysteria2 来源混淆规则
分享链接只接受小写的 obfs=salamander。未指定或空值关闭混淆;未知名称(包括 SALAMANDER)会被拒绝。缺失或空密码关闭 Salamander。重复密码声明与 obfs-password/obfs_password 须一致。
Clash接受不区分大小写的 Salamander,要求非空白密码。
sing-box要求小写类型;拒绝已配置有效字段但缺少类型或密码的混淆对象。

时长转换拒绝负数、非有限值和超出范围的值,不再截为零或上限。结构化订阅的秒数字段将整数毫秒向上取整(500ms 和 1000ms 均为 1,零仍为零),再比较别名。Hy2 分享链接的 mhop 仍只接受无后缀的无符号整数秒数;500ms 和 1s 会被忽略,并产生不含原值的警告。AnyTLS 分享链接保留秒数解析规则;dae 毫秒字段仍只接受裸数值、ms 或 s,并截去不足一毫秒的部分。

sing-box 的 hop_interval、idle_session_timeout 和 idle_session_check_interval 保留原生数字零,缺失或 null 仍表示未提供。Hysteria2 记录会将每个 mhop、hop-interval 和 hop_interval 值转换为秒后比较;即使存在有效别名,冲突或无效值仍会使记录被拒绝。

Hysteria2 端口跳跃集合在拨号前拒绝重复端口和重叠范围,包括 443,443。单端口集合仍然有效。有效配置保留原写法;地址中的端口列表仍拒绝空项。出站构造函数对直接构造的节点使用同一个检查函数。

普通分享链接、VMess JSON、独立扁平 Node 反序列化和订阅导入都在构造完成时校验节点。

  • 使用 UUID 的协议要求有效 UUID。不支持的加密方式、传输类型、数据包能力、flow、ALPN 上下文或端口跳跃集合,会在派生身份前被拒绝。
  • 未启用 VLESS Encryption 时,Vision 要求 TLS 或 REALITY。直接构造的节点也不能使用本应由适配器规范化掉的空 SNI、flow 或 network。
  • 订阅格式特有的非空密码要求仍由对应适配器执行。SOCKS 可选认证及处理器支持的空凭据仍然有效。
  • 无效 dae 节点行和订阅条目仍按原策略跳过,有效条目保留。
  • 仅解析 Config 片段的 API 仍不执行整份配置准入,但片段内的无效节点现在会在构造时被拒绝。
  • 独立反序列化保留传入的 ID;运行时身份准入是另一项检查。

直接调用 Node::validate() 与适配器完成构造时使用相同的固定脱敏错误。校验错误不包含传入的节点名称或凭据值。

详细 Config 加载接口和配置/注册表准入保留节点校验的字段与原因,并补上从 1 开始的原始节点序号,不再替换为笼统的无效节点错误。凭据冲突指向规范别名字段,不输出任一值。独立 NodeSeed 和 Node 反序列化仍返回脱敏的通用 serde 错误。

VMess JSON 使用 net: "ws" 时,缺失或为空的 host 会让 WebSocket 握手使用节点服务器主机;提供非空 host 时仍以它为显式覆盖值。

协议 ​

协议别名TCPUDP说明
ssshadowsocks是是AEAD 与 Shadowsocks 2022
trojan—是是*TLS;TCP/WS/gRPC/XHTTP 传输
vmess—是否AEAD;TCP/WS/gRPC/XHTTP 与 REALITY;handler 需要 rprx
vless—是可配置*原生 UDP、UoT v2、H2MUX、XUDP、Mux.Cool、Encryption、REALITY 与 Vision;handler 需要 rprx
socks5—是是CONNECT 与 UDP ASSOCIATE
hysteria2—是是QUIC/H3、salamander、brutal/BBR 与端口跳跃
tuic—是是QUIC 上的 TUIC v5
juicity—是是QUIC 上的 Juicity
anytls—是是*多路复用 TLS 会话与 UoT v2
direct—是是保留的内置直连出站;没有分享链接协议方案
block—否否保留的内置拒绝出站;没有分享链接协议方案

network 可独立于流传输方式关闭 Trojan、AnyTLS 和 VLESS 的数据包拨号。VMess UDP 尚未实现。

协议UDP 行为
AnyTLS拒绝超过 16 KiB 的载荷,与 anytls-go 0.0.13 的中继缓冲区一致。非连接模式 UoT v2 逐数据报携带目的地和服务端的真实源地址。一条流服务一个客户端源的全部目的地;未经请求的回复也保留真实源地址。
Trojan每个客户端源使用一条关联流承载全部目的地,返回每个回复的真实源地址。配合服务端可获得 EIM/EIF 行为。各目的地共享队头阻塞,且流故障会影响全部目的地。

SOCKS5 UDP ASSOCIATE 为每个客户端源保持一条控制 TCP 连接和一个中继套接字,该源的所有目的地共用它,并返回每个应答头中的真实远端对端。从未联系过的对端能否到达客户端取决于服务器:Dante 默认的 udp.connectdst: yes 仅在只使用过单一目的地期间才会连接其出站套接字。

UDP 全锥形。 以下支持 UDP 的代理协议让一个客户端源的全部目的地共用一条代理关联,并返回每个回复的真实远端地址:

  • Hysteria2、TUIC、Shadowsocks(AEAD 与 2022)、Juicity、SOCKS5;
  • Trojan、AnyTLS;
  • VLESS XUDP/Mux.Cool、UoT v2、H2MUX。

VLESS 原生 UDP 是例外,其流只指定一个目标。这包括显式 native,以及未启用 Vision 时 UDP/53 和 UDP/443 上的 auto。

来自此前未联系过的对端的回复,会保留该对端的源地址。这实现了 RFC 5780 全锥形的客户端部分。服务端还须为每条关联使用一个未连接套接字,并转发任意对端的回复。honk 无法绕过服务端过滤;direct 流量遵循宿主机自身的 NAT。限制如下:

  • 按域名拨号的流为每个原始目的地保留一条 association,其回复投影到该目的地,因此得不到端点无关映射。
  • 一个源的各目的地仅在同一节点上共用 association。组可能把新目的地或 Score 试探流送到另一节点,那里有自己的映射。
  • 协议回退路径不由 H2MUX 或 Xray UDP 池承载。对于未启用 Vision 的节点,packetEncoding=auto 在 53 和 443 端口使用已连接的原生 UDP。流只指定一个目标,因此这两个端口无法实现全锥形。Vision 节点和其他端口使用 Single XUDP。可设置 packetEncoding=xudp,为原生路径显式启用 Single XUDP。
  • Single XUDP 未设为默认值,原因是测得的性能成本。在回环环境中对 sing-box 1.12.4 使用不限速的 1200 字节数据报时,吞吐约为原生路径的一半。每 MB 客户端 CPU 消耗为原生路径的 1.9–3.3 倍,p99.9 尾延迟更高。中位数与冷启动延迟没有可测量差异。XUDP 还会拒绝超过 7,526 字节的数据报。
  • 各端口所选路径不同的 VLESS 源(例如 Xray UDP 池加 UDP/443 skip,443 走协议回退而不是池)即使在同一节点上,也按所选路径各有一条 association。
  • Trojan、Juicity 与 AnyTLS 把一个源的全部目的地放在一条可靠流上,某个目的地停滞会拖慢同流的其他目的地,写失败会终止所有目的地。数据报载体(Hysteria2、TUIC、Shadowsocks、SOCKS5)没有这个问题。
  • 53 端口的流不在数据路径中发布客户端回复 framing,因此对 53 端口流的主动回复依赖宿主机转发。
  • 所有客户端源共用一个进程级外来回复套接字池,每个对端地址使用一个套接字。上限按端点容量计算,每个端点对应七个套接字。达到上限后,新外来对端会淘汰最久未使用的套接字。清理任务关闭超过一个 NAT 超时时间未使用的套接字。
  • 一个源最近关闭的 64 个目的地的回复会被丢弃,不作为外来回复投递。这包括连接关闭和不可用节点清理。重新绑定会将目的地移出列表;第 65 次关闭会移除最早的记录。空闲超时和传输错误不会加入记录,因此只要源仍存在,这些对端仍可发送外来回复。仍绑定的流不受影响。
  • VMess 没有 UDP 后端。

对于支持 network 的协议,扁平结构化输入接受逗号分隔的 tcp/udp,忽略各项首尾空白和 ASCII 大小写。tcp 关闭 UDP;udp 与 tcp,udp 都允许 UDP。空文本或纯空白规范化为未指定,保留协议的默认能力。quic 等未知值,或非空列表中的空项,会使节点被拒绝。该字段只控制 UDP 准入;udp 不会额外禁止 TCP。

未启用 Cargo 特性 rprx 时,VMess 与 VLESS 节点仍能解析,但不会注册处理器,拨号以 No handler for protocol 失败;未启用该特性的正常构建不会分配 VLESS 池或承载连接信号量。honk-core 与 honk-tool 默认启用 rprx。

honk-core 在启动和 reload 时注入具有固定保留 ID 的 direct 与 block。用户节点不得使用这些名称或协议。组不会从节点池中自动纳入它们,只有精确匹配名称的 filter: name(direct) 或 name(block) 才会纳入,见组参考。

协议参数 ​

Shadowsocks 2022 ​

方法Base64 解码后的 PSK 长度
2022-blake3-aes-128-gcm16 字节
2022-blake3-aes-256-gcm32 字节
2022-blake3-chacha20-poly130532 字节

密钥长度错误或不是 base64 时,处理器构造失败。

UDP 重放保护分别保留当前和前一个服务端会话的窗口。前一个会话 连续 60 秒没有活动后才接受第三个会话。只有认证及响应头校验 成功后才修改接收会话状态,无效包不能重置重放历史。

Shadowsocks UDP(传统 AEAD 与 2022)为每个客户端源的所有目的地只保留一个 面向服务端的套接字;2022 在这些目的地之间共用一个会话 ID、一个递增的包计数器 和一组重放窗口。

回包返回服务端报告的真实远端地址,因此服务端转发时,从未联系过的 主机也能到达客户端;声明为非拨号域名的回包会被丢弃。

发送时非拨号域名从不逐包发出:真实服务端(sing-box 1.12.4)由首个目的地决定其 outbound 形态, 之后出现不同名字会终止 association,因此该名字以数值目标发出。

流传输 ​

支持流传输的分享链接通过 type= 或其别名 network= 选择传输方式:

值传输方式字段映射
空文本或 tcp裸 TCP—
wsWebSocketpath → ws_path;host → ws_host
grpcgRPCserviceName 或 service_name → grpc_service
xhttp 或输入别名 splithttpXHTTP见下文的 H2 兼容范围。

所有已提供的别名须在赋值前比较,包括兼容的 obfs 声明和重复查询键。不一致则拒绝链接。h2、kcp 等不支持的名称在解析时被拒绝。sni 独立生效。除 XHTTP 外,分享链接的 alpn 仍只为兼容而接受,不会存储。

WebSocket 路径和 gRPC 服务名中不能直接放进 URI 的字符(如空格和非 ASCII 文字)会进行百分号编码;已有的 %XX 转义和查询分隔符保持不变,查询值中的空格和非 ASCII 文字也会编码(如 ?tag=a b 变为 ?tag=a%20b)。XHTTP 沿用下文的转义规则。

dae
node {
    trojan_ws: 'trojan://[email protected]:443?type=ws&sni=example.com&host=example.com&path=/path#trojan_ws'
    vless_grpc: 'vless://[email protected]:443?security=tls&type=grpc&serviceName=GunService#vless_grpc'
}

VMess 接受 v2rayN Base64 JSON(net、host、path、sni),也接受 Shadowrocket 的 vmess://base64(auto:UUID@host:port)?... 地址部分形式。后者映射 tls、peer/sni、obfs=websocket|grpc、obfsParam、path 和 remark;接受 standard / URL-safe Base64,有无填充均可。编码地址部分的 VMess 要求 AEAD 认证及 auto/aes-128-gcm;不支持的加密方式和 REALITY 参数会被拒绝,不会静默替换。

VMess JSON 的 net 和 Shadowrocket 传输参数只选择流传输方式,不再写入数据包网络能力字段。未指定数据包限制时,对有 UDP 后端的协议保留原有默认 UDP 能力(VMess 没有 UDP 后端);已有的有效空传输字段也保留原始写法。非 XHTTP 传输保留对无关导出字段 mode、extra 的旧有忽略行为;这些字段不会选择 XHTTP。显式冲突的传输声明仍会拒绝节点。

VLESS 支持 TCP+REALITY+Vision、TCP+REALITY、TCP+WS、TCP+WS+TLS、TCP+gRPC 与下述 H2 XHTTP 配置方案。未加密 Vision 的 direct-copy 要求使用 TLS 1.3 或 REALITY 的裸 TCP,不能使用 WS/gRPC/XHTTP;加密 Vision 遵循下文的组合规则。

Vision 添加上行填充并移除下行填充。上行 Direct 要求在第一个完整的 应用数据记录前已观察到符合条件的 TLS 1.3 ServerHello;出现早期数据, 或检查预算耗尽时仍未决定,都会改用 End 结束填充并保留外层传输。 两个方向各自独立切换。参见 Vision 支持边界。

H2 上的 XHTTP ​

Trojan、VMess 与 VLESS 共用该出站传输。VMess 仍仅支持 TCP。该实现支持 H2 上的 XHTTP,不提供完整的 Xray 或 mihomo 配置兼容性。

安全模式H2 要求
普通 TLS必须协商 h2。
认证后的 REALITY按传输约定选择 H2,即使服务端未返回 ALPN。
显式明文对端必须支持 H2。

不提供 H1/H3 回退。

dae
node {
    xhttp: 'vless://[email protected]:443?security=tls&type=xhttp&mode=stream-up&path=%2Fxhttp%2F&sni=edge.example&alpn=h2#xhttp'
}

mode 默认为 auto:

模式请求形式
auto普通 TLS 或明文选择 packet-up,REALITY 选择 stream-one。
packet-up有序的有限长度 POST 正文,以及同一会话的 GET。
stream-up独立的流式 POST 和 GET。
stream-one单个双向 POST。

VMess JSON 在 net=xhttp|splithttp 时也接受 v2rayN 的 type 作为模式字段。显式 mode 与 type 必须一致。JSON 的 fp、insecure 和 allowInsecure 与旧有 VMess 传输一样,接受但忽略。证书校验保持开启。

URI、VMess JSON 和 Mihomo 导入会去除 ALPN 字符串及列表成员的首尾空白,再忽略空值。未指定时选择 h2。即使请求头伪装为 gRPC/SSE,正文仍是原始代理字节。

XHTTP 请求字段规范化与校验
path默认为 /。在查询部分之前补齐首尾斜杠,不清理点路径段或百分号转义。
HTTP host独立于拨号地址和 SNI。依次回退到 SNI、服务器主机名。
路径部分解码后的字面值。发送时按 Xray 规则将字面 % 转为 %25,并对空格、<、> 和 UTF-8 字节进行百分号编码。
查询部分原样发送,按原始 HTTP URI 语法校验。字面空格须预先进行百分号编码。
路径与查询整体最多 16 KiB。任何位置的控制字节、DEL 和 # 均被拒绝。

URI 分享链接参数在此之前只解码一次。因此,path=%2Fxhttp%2F 发送 /xhttp/;Mihomo 路径使用 YAML 字符串字面值。

直接构造节点时,必须先调用 normalize_stream_transport(),再派生 ID。不可变准入会拒绝非规范 XHTTP 名称、选项和 ALPN。

URI extra 接受百分号编码的 JSON 对象,可含 host、path、mode,其含义、规范化与校验和顶层字段相同,并仅支持下表选项。Extra 请求字段只填充缺失的顶层字段;显式顶层字段即使为空也优先。重复 URI extra 仅在有效规范选项一致时合并。

Xray extra 键flat xhttp 字段默认值支持边界
headersheaders{}最多 64 项,名称和值总共不超过 16 KiB
xPaddingBytesx_padding_bytes100-10001–8192 字节
noGRPCHeaderno_grpc_headerfalse布尔值
scMaxEachPostBytessc_max_each_post_bytes10000001–16777216 字节
scMinPostsIntervalMssc_min_posts_interval_ms300–60000 ms;零关闭最小间隔

结构化范围接受无符号标量、min-max 字符串或 {"min":N,"max":N}。Header 名称规范化为小写,等价别名合并;冲突别名、控制字符与传输层管理的标头(host、content-type、content-length、referer、hop-by-hop 标头、trailers)会被拒绝。URI/VMess extra JSON 在转为 map 前拒绝重复成员。Padding 始终启用。这些范围是本地安全上限,不保证每个对端或 CDN 都接受。

未配置 User-Agent 时,XHTTP 请求使用 Xray 默认的 Chrome fetch() 请求头:

请求头行为
Windows Chrome User-Agent 与 Sec-CH-UA 品牌主版本遵循 Xray 的估算,随机延迟在每个进程内只抽取一次。
Sec-CH-UA-Mobile、Sec-CH-UA-Platform、DNT、Accept-Language、Sec-Fetch-Mode: cors、Sec-Fetch-Dest: empty、Sec-Fetch-Site: same-origin与 Xray 一样,覆盖已配置的同名值。
Accept、Priority、Cache-Control、Pragma仅在未配置时补充。

CDN 的机器人过滤规则可能拒绝不含这些请求头的 XHTTP 请求。配置 User-Agent 后,不再添加这组默认请求头,而是原样发送配置值。Xray 的 chrome、firefox、edge、golang 关键字不会被解释。这些请求头只在运行时添加,不改变节点身份。

存在 extra 时,顶层 host、path 和 mode 仍优先。

兼容输入处理方式
URI fp接受但忽略;指纹由全局 TLS 模式控制。
值为 none 或空值的 headerType / quicSecurity;空 serviceName接受但忽略,因为 XHTTP 自行管理 HTTP 分帧。
headers 查询参数仅接受只有 Referer 成员的 JSON 对象,随后丢弃。Xray 的填充会覆盖该请求头,因此不会发送。
allowInsecure、allow_insecure、insecure保留共用 TLS 语义;别名必须一致。
Extra 中的 noSSEHeader、scMaxBufferedPosts、scStreamUpServerSecs仅作用于 Xray 服务端,检查类型后丢弃。
xmux仅在全为零或恰好等于 Xray 的缺省 XMUX 填充值时接受并丢弃:maxConcurrency 为 1、hMaxRequestTimes 为 600–900、hMaxReusableSecs 为 1800–3000,其余为 0。其他值拒绝。

未知或不支持的参数会使整个节点被拒绝,即使值为 null 或空值也不例外。这包括其他会话、序号或载荷位置、自定义上传方法和填充混淆配置。Mihomo 订阅使用对应的 xhttp-opts 字段。官方 sing-box 和客户端记录格式仍不支持 XHTTP 传输。

Extra 中的 downloadSettings 是 Xray StreamConfig,将 GET 发往独立端点。下载端不继承上传端的任何设置,包括请求头。因此,即使上传端配置了 User-Agent,下载 GET 仍携带默认的 Chrome fetch() 请求头。

下载设置要求或映射
必需字段address、port、network: xhttp、security: tls。
address去除首尾空白并转为小写。必须是主机名或 IPv4 字面量,因为拨号时按文本与端口拼接。
tlsSettings.serverName、xhttpSettings.path、xhttpSettings.host映射到 xhttp.download.server_name、path、host。扁平 xhttp.download 对象还包含 address、port 和默认值为 100-1000 的 x_padding_bytes。
顶层或 tlsSettings 的 ALPN只能缺省或为 h2。
tlsSettings.fingerprint、xhttpSettings.mode检查后忽略。
值为 null 的已知成员视为缺省。
HTTP 主机名依次回退到下载端的服务器名称、地址。

下载端始终校验 TLS。上传端的证书固定、不安全校验、ECH 和 REALITY 设置不作用于下载端。allowInsecure: true、REALITY、sockopt、下载端 headers 或 extra,以及其他任何成员都会使节点被拒绝。下载设置也不能与 stream-one 模式或 REALITY 上传端组合。

每个对端各有独立的承载连接池。因此,Trojan 或 VMess 节点最多可持有四条不占 VLESS 进程许可的可复用承载连接。延迟探测与 honk-tool sub 的地址族列只反映上传端点。

XHTTP 禁止 TCP Mux.Cool,但保留 UDP-only XUDP 承载连接。已有 VLESS UDP 权限、数据包编码与 UDP/443 策略不变。Packet-up 没有上传 EOF 的线协议标记:shutdown 刷新已经接受的上传字节并保留 GET 等待应用最终回复;关闭逻辑流才结束其请求。

Shadowrocket VLESS ​

统一解析器接受 vless://base64(auto:UUID@host:port)?...,以及省略 auto: 的编码地址部分。支持 standard / URL-safe Base64,有无填充均可;IPv6 端点必须使用方括号。编码内容必须包含有效 UUID 和显式非零端口。格式错误的编码地址部分会被拒绝,不再误当作主机名或显示名称。

查询参数映射遵循 Shadowrocket 导出器:

输入含义
tls=0 / tls=1关闭 / 开启 TLS。编码链接没有安全选项时默认明文;规范 UUID@host:port 链接保留默认开启 TLS 的行为。
未指定 security 时的 pbk、sid、spx选择 REALITY,必须提供非空 pbk。仍支持显式 security=reality。
xtls=0 / xtls=2无 flow / xtls-rprx-vision。拒绝已淘汰的 XTLS Direct(xtls=1)及未知值。
remark没有非空片段时用作显示名称,作为查询参数值只解码一次。
peer显式 SNI 别名;非空的 sni 与 peer 必须一致。空值或纯空白名称视为未指定。
obfs=websocket、obfsParam、pathWebSocket 传输、Host 标头回退值和路径。
obfs=grpc、pathgRPC 传输和 service name 回退值。

TLS/REALITY、flow 或传输声明相互冲突时会拒绝链接,不会静默降级。VLESS 的 obfs 仅接受空值/none、websocket 或 grpc,不会把不支持的传输方式当作 TCP。host 和 serviceName/service_name 保留原有回退顺序。显式 SNI 别名在赋值前按原始字节比较:相同值合并,不同值报错,不转换大小写。空值或纯空白的 SNI 和 flow 在派生节点 ID 前规范化为未指定;非空 flow 必须为 xtls-rprx-vision 或 xtls-rprx-vision-udp443。

Clash 导入会比较 servername、server-name 和 sni;记录格式还会比较 tls-name 和 tls-host,并保留较低优先级的 obfs_sni 回退值,包括 Quantumult X 的 WSS Host。记录中的 off 仍为无效值。分享链接和 VMess JSON 的 WebSocket host 仅用作 Host 请求头;非 WebSocket 传输则将其作为较低优先级的 SNI 回退值。TLS 使用方最终仍可回退到节点主机名。

Hysteria2 ​

同时接受 hysteria2:// 和 hy2://。完整的百分号解码后用户信息是认证字符串:字面 user:password 保留两部分及冒号,与百分号编码的 user%3Apassword 等价。

链接输入节点字段 / 行为
用户信息密钥hy2_auth;保留完整 user:password,而不是只取 password
obfs=salamander&obfs-password=...小写 salamander 配合非空密码设置 hy2_obfs。混淆名称缺失或为空,或密码缺失或为空时关闭混淆。未知混淆名称使链接被拒绝。
upmbps / downmbpshy2_up_mbps / hy2_down_mbps;upmbps 为正值时启用 Brutal,否则使用 BBR;下载值按 bytes/s 通告
mport / mhop端口列表/范围与以秒为单位的跳跃间隔;间隔默认 30,并钳制到上游规定的最小值 5。官方客户端把跳跃端口写在地址部分里的形式(:443,5000-6000)与 mport 等价;两者同时指定会被拒绝,非法的内嵌列表在解析期报错
pinSHA256tls_pin_sha256,替代 PKI/主机名校验
initStreamReceiveWindow / initConnReceiveWindowQUIC 接收窗口覆盖值
disablePathMTUDiscovery值为 1/true 时关闭 QUIC PMTU 发现
mtu共用 QUIC UDP-payload 上限;只接受 1200–65527
sni / peer、insecure 别名、ECH 参数共用 TLS 行为;非空的显式 SNI 别名必须一致
dae
node {
    hy2: 'hysteria2://[email protected]:443?sni=example.com&obfs=salamander&obfs-password=obfspw&upmbps=50&downmbps=200&mport=20000-30000&mhop=30#hy2'
}

TUIC 与 Juicity ​

协议链接输入节点字段 / 行为
TUICuuid:password 用户信息通用 username / password;供 tuic_uuid / tuic_password 的 handler 回退使用
TUICcongestion_controlcubic、new_reno 或 bbr(quinn 原有的 BBR 或 BBRv3,由 HONK_QUIC_BBR 选择);省略时为 cubic;未知值告警并回退到 cubic
TUICalpn逗号分隔的 ALPN 覆盖值;分享链接默认 tuic;原始 Clash/Mihomo 导入使用下述来源默认值
TUICinitStreamReceiveWindow / initConnReceiveWindow接收窗口覆盖值
Juicityuuid:password 用户信息通用 username / password;供 juicity_uuid / juicity_password 的 handler 回退使用
Juicity协议默认值ALPN h3、BBR,以及 8 MiB / 8 MiB 的初始接收窗口(共享自适应流控可使其增长)
JuicityUDP每个客户端源一条 QUIC bi 流承载所有目的地;回复返回真实的远端对端,取决于服务端自身的 UDP 套接字与出口策略
两者mtu、sni、insecure 别名、pin、ECH共用 QUIC/TLS 参数

原始 Clash/Mihomo proxies 条目中的 TUIC alpn 缺失或为 null 时,会补为 h3。显式非空列表保留顺序;显式空列表或空白字符串继续使用 honk 既有的 tuic 回退,并不表示不发送 ALPN。该来源默认值不适用于原生分享链接、扁平节点、sing-box outbounds 或文本记录格式。

升级注意: 依赖此前 tuic 回退的导入节点须显式设置 alpn: [tuic] 才能保留旧行为。协议专用 ALPN 不改变节点 UUID,但有效配置变化会为新请求重建运行时;已有流继续遵循正常的代际退休机制。

AnyTLS ​

链接输入节点字段 / 行为
用户信息密钥password 与 anytls_password
min_idle_sessionanytls_min_idle_session;按 u16 解析并用作请求的待机下限,受八条会话的池上限约束
idle_session_check_interval以秒存储的时长;当前不生效,因为清理周期固定为 30 秒
idle_session_timeout以秒存储的时长;默认 30 秒

时长接受裸秒数以及 ms、s、m、h 后缀。

VLESS ​

UDP 与多路复用 ​

VLESS 有三个独立选择。udp=0|1 控制是否允许数据包拨号,packetEncoding=auto|none|xudp|uot-v2 选择回退数据包协议,mux=off|h2mux|xray 选择 TCP/UDP 承载连接路径。这些选择不会协商。

规范 URI 查询参数默认值接受值与作用
udp允许1/true 允许数据包拨号;0/false 关闭 UDP 而不关闭 TCP。文本布尔值不区分 ASCII 大小写;重复声明必须一致。
packetEncodingautoauto、none(原生 VLESS command-UDP)、xudp(Single XUDP)或 uot-v2。mux 不接管 UDP 路径时使用该回退值。
muxoffoff、h2mux 或 xray。
paddingfalse仅对 mux=h2mux 有效的 bool;选择 sing-mux v1 填充。
concurrency0仅对 mux=xray 有效的有符号 i16:负值关闭 TCP mux,零允许每条 TCP 承载连接同时承载 8 个逻辑 child,正值设置该逐承载连接并发且最多 128;它不设置物理承载连接数量。
xudpConcurrency0仅对 mux=xray 有效的有符号 i16:负值使用协议回退;零在 TCP mux 启用时共享 TCP 池及其逐承载连接并发,否则使用协议回退;正值建立独立 UDP 池,每条承载连接的逻辑 child 并发使用该值且最多 128。
xudpProxyUDP443allow仅对 mux=xray 有效的 reject、skip 或 allow;UDP/443 的精确优先级见下文。

packetEncoding、mux 与每个 mux 控制项最多出现一次。重复的 udp 声明仅在所有值一致时接受。

mux 值TCP 与 UDP 路径
off保留普通 VLESS TCP,UDP 使用 packetEncoding。UoT v2 为每个客户端源建立一条非连接模式流,承载全部目的地并返回每个回复的真实源地址。
h2mux逻辑 TCP 与 sing-mux PacketAddr UDP 共用节点所属的 HTTP/2 承载连接池。UDP 每个客户端源使用一条流,逐数据报携带地址。padding=true 选择现有的填充 H2MUX 线协议格式。
xray两个并发设置所启用的连接池分别使用 Xray Mux.Cool。TCP 与 UDP 池化相互独立。

H2MUX 接管两类路径,因此回退编码不会替换其 UDP 路径。H2MUX 保留现有池策略,不采用 Mux.Cool 在每条承载连接分配 128 个逻辑子流后更换连接的行为。

以下是规范示例(使用合成 UUID):

dae
node {
    auto: 'vless://[email protected]:443?security=tls&packetEncoding=auto&mux=off&udp=1#auto'
    h2_padded: 'vless://[email protected]:443?security=tls&packetEncoding=auto&mux=h2mux&padding=true&udp=1#h2-padded'
    xray_shared: 'vless://[email protected]:443?security=tls&packetEncoding=auto&mux=xray&concurrency=0&xudpConcurrency=0&xudpProxyUDP443=skip&udp=1#xray-shared'
    vision_udp_pool: 'vless://[email protected]:443?security=tls&flow=xtls-rprx-vision&packetEncoding=auto&mux=xray&concurrency=-1&xudpConcurrency=8&xudpProxyUDP443=skip&udp=1#vision-udp-pool'
}

结构化 TOML/YAML/JSON 使用以下独立字段:

字段含义
network数据包权限:tcp 关闭 UDP;省略、udp 或 tcp,udp 允许 UDP。
packet_encoding回退编码:auto、native、xudp、uot-v2。
multiplex带类型标记的承载连接选择,具体结构如下。
多路复用协议结构化形式
关闭{"protocol":"off"}
H2{"protocol":"h2","padding":true|false}
Xray{"protocol":"xray","tcp":N|null,"udp":"protocol"|"shared-tcp"|{"separate":N},"udp443":"reject"|"skip"|"allow"}

tcp 和每个 separate 值都是正数,表示每条承载连接的逻辑子流并发上限,最多 128。省略 tcp 或设为 null 会关闭 TCP 多路复用池。

udp: "shared-tcp" 要求非 null 的 tcp 并发值。超出 1..=128 的值或没有 TCP 池的共享 UDP 池会使节点被拒绝,即使配置了 network: "tcp";这些无效值不会被截断或归一化成关闭的池。这与上文有符号 URI 控制项(以及对应的 Clash 控制项)不同,后者会将大于 128 的正值截断为 128。

从 vless_mode 迁移 ​

破坏性配置变更:vless_mode 已删除,不是兼容别名。升级前应迁移静态链接与订阅源内容。静态 node {} 中出现该字段会拒绝候选配置;订阅只丢弃对应条目,保留其他有效节点。全部使用旧模式的订阅缓存无法在离线状态下恢复节点;离线升级前应确保本地已有迁移后的正文,不要删除仍可用的 Selector 或延迟状态。单个订阅源恢复失败本身不导致启动退出,但最终组装的配置仍须通过校验。

每种旧模式都有保留原有能力的替代组合:

已移除的 vless_modepacketEncodingmuxudp额外查询参数
autoautooff1—
nativenoneoff1—
legacyautooff0保留仅 TCP 行为;不保留旧身份。
uot-v2uot-v2off1—
h2muxautoh2mux1padding=false
h2mux-paddedautoh2mux1padding=true
xudpxudpoff1—
mux-coolautoxray1concurrency=0&xudpConcurrency=0&xudpProxyUDP443=skip

最后一行保留 TCP/UDP 可用性;被 skip 的 UDP/443 目标使用协议回退,而不是 pooled XUDP。现在默认允许 UDP/443,包括 Vision;需要阻断 QUIC 时使用路由规则。本次升级中所有接纳的 VLESS 节点都使用新的身份派生规则,见节点身份。

旧版 vless_mode URI 语法会被拒绝。解析器也拒绝 smux、multiplex、udp-over-tcp、packet-encoding、packet_encoding、packet-addr、xudp、only-tcp、Brutal 控制项与 H2 流数量调优等含义不明确的第三方 URI 拼写;只有上表中的精确规范参数会配置这些选择。

目标选择与组合 ​

未启用 Vision 时,packetEncoding=auto 对目标端口 53、443 使用原生 VLESS UDP,其他端口使用 Single XUDP。启用 Vision 时,获准目标使用 Single XUDP。原生 UDP 发送范围为 1–8190 字节,Single XUDP 为 1–7526 字节;空包或超长包是数据包局部拒绝,接收到的零长度 frame 仍是数据报。

默认允许 UDP/443,包括基础 xtls-rprx-vision。需要阻断时,在更宽泛的匹配规则之前配置 l4proto(udp) && dport(443) -> block。

mux=xray 的 UDP/443 策略结果
reject即使两个多路复用池均关闭,仍拒绝 UDP/443。
skip选择 packetEncoding。
allow(默认)使用配置的 UDP 池;没有池时使用协议回退。

xtls-rprx-vision-udp443 规范化为基础 Vision,不再改变权限或身份;线上附加字段仍为基础 flow。策略和容量拒绝会终止本次尝试,且不影响健康状态或 Score。它们不会触发其他节点或 direct 回退,也不会自动重放数据包。

Vision 始终要求 direct TCP 路径:mux=off,或 mux=xray 且关闭 TCP mux。所有 H2MUX TCP 组合都无效,包括使用 Encryption 时。

Vision 可以使用仅 UDP 的 Xray 池;concurrency=-1 时,用正数 xudpConcurrency 建立该池。

未加密 Vision 还要求使用协商 TLS 1.3 或 REALITY 的裸 TCP。加密 Vision 可以保留已选 outer 流传输与 random-XOR 处理,但仍不能启用 TCP mux、H2MUX UDP、原生 UDP 或 UoT v2;XUDP/Xray UDP 或关闭 UDP 均有效。

VLESS 承载连接 slot 来自进程级文件描述符预算,并先于 UDP 端点 slot 划分,因此可复用承载连接容量会与端点数量互相取舍。容量耗尽报告为本地容量问题,而不是远端协议失败。honk 还根据其可复用 source/session 所有权与按目的地路由语义限定 XUDP Global ID 的 scope;这不是 Xray 的仅源身份,也不承诺无冲突 NAT 身份。规范生命周期与 scope 定义见源/session 所有权与容量。

Encryption ​

encryption= 接受的基本客户端字符串形式为:

text
mlkem768x25519plus.<native|xorpub|random>.<1rtt|0rtt>.<base64url-key>

密钥解码后可以是 32 字节 X25519 密钥或 1184 字节 ML-KEM-768 密钥;也接受链式认证密钥。0rtt 使用缓存票据,冷启动时走 1-RTT 路径。VLESS Encryption 位于选定的 outer TCP/TLS/REALITY/WS/gRPC 传输内层。它支持原生或 XUDP 回退以及 Xray UDP 池,但不支持 H2MUX TCP/UDP 或 UoT v2。Encryption 与 Vision 可以在上述 direct-TCP-path 规则下组合。

REALITY 与 Vision ​

对于 VLESS 与 Trojan URL 链接,security=reality 开启 TLS 并映射 REALITY 查询参数字段,不再静默回退到普通 PKI TLS。其他分享链接协议方案拒绝 REALITY 意图;结构化 VMess REALITY 仍受支持。仅 VLESS 使用 flow 选择 Vision。

Query含义
security=reality选择 REALITY 并开启 TLS。选择了 REALITY 却没有 pbk 的节点会在校验时被拒绝,而不是降级成普通 TLS。
pbkBase64url 编码的 32 字节 X25519 服务端公钥;无效输入 fail-closed。
sid偶数长度十六进制 short ID,最多 8 字节;允许为空。
spx存储 spider path;选择 REALITY 时默认为 /。
flow=xtls-rprx-vision按上述 UDP/443 规则启用 Vision。
flow=xtls-rprx-vision-udp443规范化为 xtls-rprx-vision;默认已经允许 UDP/443。
fp接受但忽略;ClientHello 指纹由全局 TLS mode 控制。

VLESS 按以下规则选择 TLS:

输入TLS 行为
显式 security=none关闭 TLS,覆盖历史默认值。
其他显式 security= 值开启 TLS。
无 security,有显式 tls=0|1使用显式 TLS 选择。
普通 VLESS 链接未提供两者默认开启 TLS。
Base64 编码地址的 Shadowrocket 链接未提供两者默认关闭 TLS,除非 REALITY 字段将其开启。

标准 VMess 链接改用其 v2rayN JSON tls 字段。

重复的 security 与已识别的 tls 声明必须一致,包括别名之间的 TLS 开关。后值不能覆盖前面的冲突声明。VLESS 与编码 VMess 只接受 tls=0|1;其他协议方案保留对未识别 tls 文本的处理。Trojan 与 AnyTLS 拒绝显式明文声明,而不是静默保留强制 TLS。

REALITY 仅使用 TLS 1.3,首次尝试依次通告 hybrid X25519MLKEM768 与预设 classic X25519 share。仅当握手完成后收到非 ed25519 叶证书,才向同一对端新建一次仅使用 X25519 的连接;新连接仍须通过配置的 REALITY key/HMAC 认证,之后才能发送代理数据。

两次尝试共享 3 × connect_timeout 的 setup deadline,不增加配置项。该触发结果未经认证,并非服务端版本检测。ed25519 HMAC 错误、TLS/IO 错误及 HRR 仍是最终失败。每条连接只 seal 一次 ClientHello,不复用 key/nonce。参见兼容与认证边界。

裸 TCP 池只接纳握手前保持静默的套接字。任何排队的服务端字节(包括致命 TLS 警报)都会使该裸连接在接纳或取出时被拒绝;没有 SNI/警报特例,也不会重试握手。已经完成协议准备的就绪流即使缓冲了有效应用数据,也不会因此被拒绝。

REALITY 不使用 CA 校验或 skip_cert_verify。目标 TLS 记录的缓冲限制取决于服务端版本。文档中的 sing-box 1.12 / MetaCubeX-uTLS 1.8.0 对端使用 8192 字节缓冲区,包含分帧开销。这不是 honk 统一的证书上限。参见服务端版本约束。REALITY 配置方案还会加入 ed25519;被忽略的 fp 和全局 Chrome-oriented 模式都不承诺精确浏览器身份。

TLS 指纹与 ECH ​

全局 tls_implementation 同时作用于代理 TCP TLS 与 QUIC:

取值行为
tls原生 BoringSSL ClientHello
utlsChrome 形 ClientHello,包含 GREASE、扩展乱序、Chrome 算法/曲线、证书压缩、ALPS 与 ECH GREASE

按节点的 ECH 控制项为:

输入行为
ech_config=<base64> / echconfig=<base64>静态 ECHConfigList;隐含 ech_enabled 且优先
ech_config_path结构化 loader 文件路径;两者同时存在时 ech_config 优先
ech=1 / ech=true没有静态配置时开启 DNS HTTPS-RR 发现

静态配置会提供真实 ECH,ECH 被拒绝时握手 fail-closed。发现是尽力而为且 fail-open:找不到 ECHConfigList 时,握手不带真实 ECH 继续;utls 仍发送 ECH GREASE。发现使用 bootstrap resolver,未配置时使用系统首个 nameserver,并按域名缓存结果。同一组控制项也适用于 QUIC 协议。

分享链接 scheme ​

Scheme格式与映射
ss://SIP002 userinfo/完整地址部分 base64 形式,以及 plugin
vmess://宽松 base64 v2rayN JSON(add、port、id、scy、net、host、path、tls、sni、ps)
vless://URL 用户信息 UUID,加流传输、TLS/REALITY、flow、Encryption 与上文规范 UDP/mux 查询参数
trojan://URL 用户信息密钥,加传输与 TLS 查询参数
anytls://URL 用户信息密钥,加 TLS 与池查询参数
hysteria2://上述 Hysteria2 查询参数映射;也接受 hysteria://
tuic://上述 TUIC 用户信息与 QUIC 调优
juicity://Juicity 用户信息与共用 QUIC/TLS 查询参数
socks5://SOCKS 用户信息;socks4:// 与 socks4a:// 也导入同一种节点协议

对于写成 a -> b 的链,只解析 a。自动名称只来自解码后的 #fragment、VMess ps 或 {scheme}-{host};解析器绝不以原始 URI 或用户信息作为回退,因此生成名称不会泄漏凭据。显式标签、片段与 ps 值仍由用户控制。

相关文档 ​


來源:honk 上游文件,採用 GPL-3.0-only 授權條款。