Freedom(fragment、noises)
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
OutboundConfigurationObject
{
"domainStrategy": "AsIs",
"redirect": "127.0.0.1:3366",
"userLevel": 0,
"testpre": 3,
"preConKeep": "25s",
"fragment": {
"packets": "tlshello",
"length": "100-200",
"interval": "10-20", // 单位ms
"maxSplit": "2-4"
},
"noises": [
{
"type": "base64",
"packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
"delay": "10-16",
"applyTo": "ip"
}
],
"proxyProtocol": 0
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
domainStrategy: "AsIs"
"UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
"ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
默认值 "AsIs"。
所有参数含义均约等于 sockopt 中的 domainStrategy.
在这里使用 AsIs 才可以把域名交给后面的 sockopt 模块,如果在这里设置非 AsIs 导致域名被解析为具体 IP 会使后续的 sockopt.domainStrategy 不再生效。(如果不调整这两个设置则没有负面影响)
Freedom 在发送 UDP 时出于一些原因无视 sockopt 中的 domainStrategy 并在默认状态下强制偏好 IPv4.
targetStrategy: "AsIs"
"UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
"ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
与 domainStrategy 含义相同,但优先级更高;当未设置 targetStrategy 时会回落使用 domainStrategy。
TCP 并发拨号(类 Happy Eyeballs)
当 Freedom 负责直连且域名需要由核心解析(如 UseIP / UseIPv6v4 / Force*)时,系统 Happy Eyeballs 机制不会参与。可在 OutboundObject 中启用 tcpConcurrent 让核心对解析得到的多个 IP 并发拨号,选择最快成功的连接;若域名解析策略为带回退的策略(如 UseIPv6v4 / UseIPv4v6 及对应 Force),会先并发尝试首选地址族,超时未成功则回退到另一族。
tcpConcurrentTimeout 为并发拨号“抢跑”超时(毫秒),默认 250。
示例:
{
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIPv6v4"
},
"tcpConcurrent": true,
"tcpConcurrentTimeout": 250
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
redirect: address_port
Freedom 会强制将所有数据发送到指定地址(而不是 inbound 指定的地址)。
其值为一个字符串,样例:"127.0.0.1:80",":1234"。
当地址不指定时,如 ":443",Freedom 不会修改原先的目标地址。 当端口为 0 时,如 "xray.com: 0",Freedom 不会修改原先的端口。
testpre: number
预连接(pre-connect)数量。大于 0 时,Freedom 会尝试预先建立并缓存 testpre 条到目标的连接,以减少真实请求的建连耗时。
WARNING
testpre 仅在 redirect 同时指定了有效的 地址 与 端口 时生效;否则会被跳过并回退为普通拨号。
preConKeep: bool | number | string
预连接连接的 TCP keepalive(仅对 testpre 产生的预连接有意义,默认启用并使用 25s)。
true/0/"0":启用并使用默认值(25s)false/ 负数:禁用- 正数:按秒设置(例如
30表示 30 秒) - duration 字符串:例如
"25s"/"1m"
userLevel: number
用户等级,连接会使用这个用户等级对应的 本地策略。
userLevel 的值, 对应 policy 中 level 的值。 如不指定, 默认为 0。
fragment: map
一些键值对配置项,用于控制发出的 TCP 分片,在某些情况下可以欺骗审查系统,比如绕过 SNI 黑名单。
"length"和"interval" 均为 Int32Range 类型
"packets":支持两种分片方式 "1-3" 是 TCP 的流切片,应用于客户端第 1 至第 3 次写数据。"tlshello" 是 TLS 握手包切片。
"length":分片包长 (byte)
"interval":分片间隔(ms)
"maxSplit":最大分片次数(可选,仅在 "packets": "tlshello" 时生效),为 Int32Range 类型。
当其为 0 且设置 "packets": "tlshello" 时,被分片的 Client Hello 将会在一个TCP包中发送(如果其原始大小未超过MSS或MTU导致被系统自动分片)
noises: array
UDP noise, 用于在发出UDP连接前发出一些随机数据作为“噪声”,出现该结构体则视为启用,可能可以欺骗嗅探器,也可能破坏正常连接。Use at your own risk. 出于这个原因,它会绕过53端口因为这会破坏 DNS
为一个数组,可以定义多个要发出的噪声数据包,数组中单个元素定义如下
"type": 噪声数据包类型,目前支持 "rand"(随机数据)、"str"(用户自定义字符串)、"hex"(hex 编码的自定义二进制数据)、"base64"(base64 编码过的自定义二进制数据)
"packet": 基于前面的 type 要发送的数据包内容
- 当
type为 rand 时,这里指定随机数据的长度 可以是固定值"100"或者浮动值"50-150" - 当
type为 str 时,这里指定要发送的字符串 - 当
type为 hex 时,这里指定以 hex 形式表示的的二进制数据 - 当
type为 base64 时,这里指定 base64 过的二进制数据
"delay": 延迟,单位毫秒。发送该噪声包后核心会等待该时间后再发送下一个噪声包或真实数据,默认不等待,为 Int32Range 类型
"applyTo": 可选,决定该噪声包对哪些 IP 类型生效:"ip"(默认,含 IPv4/IPv6)、"ipv4"、"ipv6"。
proxyProtocol: number
PROXY protocol 通常配合 redirect 重定向到开启了 PROXY protocol 协议的 Nginx 或其他后端服务中。如果后端服务不支持 PROXY protocol 协议,连接将会被断开。
proxyProtocol 的值为 PROXY protocol 版本号,可选 1 或 2,如不指定,默认为 0 不启用。