From 18f2b24d9f15fbbafd144785d99c4766cdc73756 Mon Sep 17 00:00:00 2001 From: Meow <197331664+Meo597@users.noreply.github.com> Date: Fri, 11 Sep 2026 03:23:42 +0800 Subject: [PATCH] refactor freedom --- docs/config/outbounds/freedom.md | 86 ++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 27 deletions(-) diff --git a/docs/config/outbounds/freedom.md b/docs/config/outbounds/freedom.md index 92befa6c..9547c1a3 100644 --- a/docs/config/outbounds/freedom.md +++ b/docs/config/outbounds/freedom.md @@ -51,14 +51,14 @@ Freedom 是一个直连出站协议,通常也是流量的终结点:它接收 ``` ::: tip -Freedom 的目标域名解析由 [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject) 控制。 +Freedom 的目标域名解析策略由 [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject) 控制。 ::: > `redirect`: address_port -Freedom 会强制将所有数据发送到指定地址(而不是 inbound 指定的地址)。 +Freedom 会将连接的当前目标地址和端口改写为 `redirect` 中指定的地址和端口。 -其值为一个字符串,样例:`"127.0.0.1:80"`,`":1234"`。 +其值为一个字符串,样例:`"127.0.0.1:80"`、`":1234"`。 当地址不指定时,如 `":443"`,Freedom 不会修改原先的目标地址。 当端口为 `0` 时,如 `"xray.com: 0"`,Freedom 不会修改原先的端口。 @@ -69,36 +69,15 @@ Freedom 会强制将所有数据发送到指定地址(而不是 inbound 指定 userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。 -> `fragment`: map +> `fragment`: [FragmentObject](#fragmentobject) 一些键值对配置项,用于控制发出的 TCP 分片,在某些情况下可以欺骗审查系统,比如绕过 SNI 黑名单。 -`"length"`和`"interval"` 均为 [Int32Range](../../development/intro/guide.md#int32range) 类型 - -`"packets"`:支持两种分片方式 "1-3" 是 TCP 的流切片,应用于客户端第 1 至第 3 次写数据。"tlshello" 是 TLS 握手包切片。 - -`"length"`:分片包长 (byte) - -`"interval"`:分片间隔(ms) - -当其为 0 且设置 `"packets": "tlshello"` 时,被分片的 Client Hello 将会在一个TCP包中发送(如果其原始大小未超过MSS或MTU导致被系统自动分片) - -> `noises`: array +> `noises`: \[[NoiseObject](#noiseobject)\] UDP noise, 用于在发出UDP连接前发出一些随机数据作为“噪声”,出现该结构体则视为启用,可能可以欺骗嗅探器,也可能破坏正常连接。Use at your own risk. 出于这个原因,它会绕过53端口因为这会破坏 DNS -为一个数组,可以定义多个要发出的噪声数据包,数组中单个元素定义如下 - -`"type"`: 噪声数据包类型,目前支持`"rand"`(随机数据), `"str"`(用户自定义字符串), `"base64"`(base64编码过的自定义二进制数据) - -`"packet"`: 基于前面的 `type` 要发送的数据包内容 - -- 当 `type` 为 rand 时,这里指定随机数据的长度 可以是固定值 `"100"` 或者浮动值 `"50-150"` -- 当 `type` 为 str 时,这里指定要发送的字符串 -- 当 `type` 为 hex 时,这里指定以 hex 形式表示的的二进制数据 -- 当 `type` 为 base64 时,这里指定 base64 过的二进制数据 - -`"delay"`: 延迟,单位毫秒。发送该噪声包后核心会等待该时间后再发送下一个噪声包或真实数据,默认不等待,为 [Int32Range](../../development/intro/guide.md#int32range) 类型 +为一个数组,可以定义多个要发出的噪声数据包,数组中每个元素为一个 [NoiseObject](#noiseobject)。 > `proxyProtocol`: number @@ -116,7 +95,9 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不 拨号成功后还会检查实际连接的远端 IP。但预先解析失败或两次解析结果不一致时,仍可能在拦截前发出 TCP 握手报文。 +::: tip 若此出站配置了 `sockopt.dialerProxy`,Freedom 就不再是最终出站,因此不会执行 `finalRules` 或下述默认安全策略。 +::: ::: warning 服务器端和反向代理端存在默认兜底安全策略: @@ -126,6 +107,57 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不 若服务器端需要允许客户端访问某些内网服务,应显式配置 `allow` 规则,并尽量只放行必要的 `network`、`ip` 和 `port`。 ::: +### FragmentObject + +```json +{ + "packets": "tlshello", + "length": "100-200", + "interval": "10-20" +} +``` + +> `packets`: string + +支持两种分片方式 "1-3" 是 TCP 的流切片,应用于客户端第 1 至第 3 次写数据。"tlshello" 是 TLS 握手包切片。 + +> `length`: [Int32Range](../../development/intro/guide.md#int32range) + +分片包长 (byte) + +> `interval`: [Int32Range](../../development/intro/guide.md#int32range) + +分片间隔(ms) + +当其为 0 且设置 `"packets": "tlshello"` 时,被分片的 Client Hello 将会在一个TCP包中发送(如果其原始大小未超过MSS或MTU导致被系统自动分片) + +### NoiseObject + +```json +{ + "type": "base64", + "packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=", + "delay": "10-16" +} +``` + +> `type`: string + +噪声数据包类型,目前支持`"rand"`(随机数据), `"str"`(用户自定义字符串), `"base64"`(base64编码过的自定义二进制数据) + +> `packet`: string + +基于前面的 `type` 要发送的数据包内容 + +- 当 `type` 为 rand 时,这里指定随机数据的长度 可以是固定值 `"100"` 或者浮动值 `"50-150"` +- 当 `type` 为 str 时,这里指定要发送的字符串 +- 当 `type` 为 hex 时,这里指定以 hex 形式表示的的二进制数据 +- 当 `type` 为 base64 时,这里指定 base64 过的二进制数据 + +> `delay`: [Int32Range](../../development/intro/guide.md#int32range) + +延迟,单位毫秒。发送该噪声包后核心会等待该时间后再发送下一个噪声包或真实数据,默认不等待。 + ### FinalRuleObject ```json