diff --git a/docs/config/dns.md b/docs/config/dns.md
index acbf3fc5..28677005 100644
--- a/docs/config/dns.md
+++ b/docs/config/dns.md
@@ -8,11 +8,12 @@ Xray 内置的 DNS 模块,主要有三大用途:
- "IPIfNonMatch", 请求一个域名时,进行路由里面的 domain 进行匹配,若无法匹配到结果,则对这个域名使用内置 DNS 服务器进行 DNS 查询,并且使用查询返回的 IP 地址再重新进行 IP 路由匹配。
- "IPOnDemand", 当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配。
-- 解析目标地址进行连接:
- - 如 在 `freedom` 出站中,将 `domainStrategy` 设置为 `UseIP`, 由此出站发出的请求, 会先将域名通过内置服务器解析成 IP, 然后进行连接。
- - 如 在 `sockopt` 中,将 `domainStrategy` 设置为 `UseIP`, 此出站发起的系统连接,将先由内置服务器解析为 IP, 然后进行连接。
+- 在出站阶段,解析目标域名,用于连接或发送给远端代理服务器:
+ - 如在 VLESS 出站中,将 `targetStrategy` 设置为 `UseIP`,会先通过本地的内置 DNS 模块解析被代理请求的目标域名,再将解析得到的 IP 发给远端代理服务器。
+ - 如在 VLESS 出站中,将 `sockopt.domainStrategy` 设置为 `UseIP`,会通过内置 DNS 模块解析 VLESS 服务器的域名,再连接解析得到的 IP。
+ - 如在 Freedom 出站中,将 `sockopt.domainStrategy` 设置为 `UseIP`,会通过内置 DNS 模块解析请求的目标域名,再连接解析得到的 IP。
-- TUN/透明代理时通过路由和 DNS 出站组合,以劫持 DNS 流量到此模块;或直接对外暴露 53 端口充当递归 DNS 服务器。
+- TUN/透明代理时通过路由和 DNS 出站组合,以劫持 DNS 流量到此模块;或利用 [Tunnel](./inbounds/tunnel.md) 直接对外暴露 53 端口充当递归 DNS 服务器。
::: tip TIP 1
DNS 服务器默认进入路由系统进行匹配,除非其包含 `+local` 在其中使用域名时,注意可能的回环问题,`hosts` 可能有帮助。
@@ -297,7 +298,7 @@ DNS 回退(failover)默认是串行的,即默认仅在选中的 DNS 服务
local 模式将直接由核心向外连接,这种情况下如果地址是一个域名将交由系统本身进行解析,逻辑较为简单。
-非 local 默认将视为一个从 tag 为 dns.tag(不知道在哪? 浏览器 ctrl+f 搜索 `inboundTag`) 的入站进来的请求,将经过正常的核心处理流程,可能会被路由模块分配去本地 freedom 或者其他远端出站,它将被 freedom 的 domainStrategy 解析(注意可能的回环) 或者直接以域名的形式被传送到远端根据服务端本身的解析方式解析。
+非 local 模式下,DNS 查询会作为内部请求进入路由系统,其 `inboundTag` 由 DNS 配置的 `tag` 指定。若请求被路由到本地 Freedom 出站,DNS 服务器的自身的域名会按该出站的 `sockopt.domainStrategy` 解析(注意可能的回环);若请求被路由到远端代理出站,则可将域名交给远端解析。
由于普通人可能难以理清其中的逻辑,建议(特别是在透明代理的环境下),直接在 DNS 模块的 host 选项中直接为带域名的服务器设置它们对应的 IP 防止出现回环。
diff --git a/docs/config/outbound.md b/docs/config/outbound.md
index f05fb2dd..90981e2d 100644
--- a/docs/config/outbound.md
+++ b/docs/config/outbound.md
@@ -19,10 +19,6 @@
"settings": {},
"tag": "标识",
"streamSettings": {},
- "proxySettings": {
- "tag": "another-outbound-tag",
- "transportLayer": false
- },
"mux": {},
"targetStrategy": "AsIs"
}
@@ -67,48 +63,22 @@
此出站的传输配置。
-> `proxySettings`: [ProxySettingsObject](#proxysettingsobject)
-
-出站代理配置。
-
> `mux`: [MuxObject](#muxobject)
Mux 相关的具体配置。
> `targetStrategy`: "AsIs" | "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4" | "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
-如果此出站尝试发送一个域名请求,控制其是否被解析/如何解析为 IP 并发送。
+适用于 Freedom 以外的出站,控制被代理请求中的目标域名是否在本地解析为 IP,以及使用何种解析策略。
-默认值为 `AsIs` 即保持原样发送到远端服务器。所有参数含义均约等于 [sockopt](./transports/sockopt.md#sockoptobject) 中的 `domainStrategy`。
+默认值为 `AsIs`,即保持目标域名原样发送到远端服务器。各策略的含义与 [sockopt](./transports/sockopt.md#sockoptobject) 中的 `domainStrategy` 基本相同。
::: tip
这里控制的是**被代理的请求**,如果出站代理服务器的地址是域名,并需要为这个域名本身选择解析策略,则应配置 [sockopt](./transports/sockopt.md#sockoptobject) 中的 `domainStrategy`。
+
+Freedom 出站的域名解析策略也应配置 `sockopt.domainStrategy`。
:::
-### ProxySettingsObject
-
-```json
-{
- "tag": "another-outbound-tag",
- "transportLayer": false
-}
-```
-
-> `tag`: string
-
-当指定另一个 outbound 的标识时,此 outbound 发出的数据,将被转发至所指定的 outbound 发出。
-
-::: danger
-此选项与 [Sockopt.dialerProxy](./transports/sockopt.md#sockoptobject) 冲突,根据需要任选其一即可。
-
-默认情况下,这种转发方式**会忽略**此出站自己的 `传输配置` (如有 XHTTP/REALITY/Sockopt...),也就是此 outbound 的 `streamSettings` 将不起作用。
-如果需要使用支持 `streamSettings` 方式的转发,请改用 `Sockopt.dialerProxy` 或者将这里的 `transportLayer` 设为 `true`。
-:::
-
-> `transportLayer`: true | false
-
-`true` 将此设置转化为 `Sockopt.dialerProxy` 来支持此出站的 `streamSettings`,默认为 `false` 即不转化。
-
### MuxObject
Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细节详见 [Mux.Cool](../development/protocols/muxcool.md)。Mux 是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频、下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配。Mux 的第二个用途是分发多个 UDP 连接,即 XUDP。
diff --git a/docs/config/outbounds/freedom.md b/docs/config/outbounds/freedom.md
index 94119054..92befa6c 100644
--- a/docs/config/outbounds/freedom.md
+++ b/docs/config/outbounds/freedom.md
@@ -1,6 +1,6 @@
# Freedom(fragment、noises)
-Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
+Freedom 是一个直连出站协议,通常也是流量的终结点:它接收上游传来的 TCP 或 UDP 流量,并直接向最终目标地址发起连接、收发数据。
::: warning
该出站在服务器端和反向代理端存在默认安全策略,可能会阻止一些目标,放行方式见下文 `finalRules`。
@@ -16,9 +16,8 @@ Freedom 是一个出站协议,可以用来向任意网络发送(正常的)
{
// ...
"protocol": "freedom",
- // [!code focus:29]
+ // [!code focus:28]
"settings": {
- "domainStrategy": "AsIs",
"redirect": "127.0.0.1:3366",
"userLevel": 0,
"fragment": {
@@ -51,17 +50,9 @@ Freedom 是一个出站协议,可以用来向任意网络发送(正常的)
}
```
-> `domainStrategy`: "AsIs"
-> "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
-> "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
-
-默认值 `"AsIs"`。
-
-所有参数含义均约等于 [sockopt](../transports/sockopt.md#sockoptobject) 中的 domainStrategy.
-
-在这里使用 AsIs 才可以把域名交给后面的 sockopt 模块,如果在这里设置非 AsIs 导致域名被解析为具体 IP 会使后续的 sockopt.domainStrategy 以及其相关的 happyEyeballs 失效。(如果不调整这两个设置则没有负面影响)
-
-Freedom 在发送 UDP 时出于一些原因无视 sockopt 中的 domainStrategy 并在默认状态下强制偏好 IPv4.
+::: tip
+Freedom 的目标域名解析由 [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject) 控制。
+:::
> `redirect`: address_port
@@ -119,9 +110,13 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不
按顺序匹配 Freedom 最终出站规则,用于放行或阻止连接目标。
-相比在 `routing` 中封锁,`finalRules` 位于 Freedom 最终出站阶段:在解析出最终 IP 后、拨号前匹配;此外 UDP 在收发时还会逐包匹配,因此更严谨、更彻底;每条规则匹配耗时约 50~150ns。
+相比在 `routing` 中封锁,`finalRules` 在 Freedom 最终出站阶段、拨号前匹配;此外 UDP 在收发时还会逐包匹配。每条规则匹配耗时约 50~150ns。
-注意:只要 Freedom 需要执行 `finalRules`,当 `domainStrategy` 为 `AsIs` 且目标为域名时,Freedom 仍会先通过操作系统 DNS 将目标解析为 IP,再执行规则匹配。此时目标已不再是域名,后续的 `sockopt.domainStrategy` 及其 `happyEyeballs` 不再生效。
+目标为域名且需要执行规则时,Freedom 会按照 `sockopt.domainStrategy` 预先解析,并对返回的所有 IP 分别按规则顺序匹配;只要其中一个 IP 被阻止,就会阻止整个请求。
+
+拨号成功后还会检查实际连接的远端 IP。但预先解析失败或两次解析结果不一致时,仍可能在拦截前发出 TCP 握手报文。
+
+若此出站配置了 `sockopt.dialerProxy`,Freedom 就不再是最终出站,因此不会执行 `finalRules` 或下述默认安全策略。
::: warning
服务器端和反向代理端存在默认兜底安全策略:
@@ -129,8 +124,6 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不
若未命中任何显式规则,则使用内置兜底规则:来自 VLESS 反向代理的流量默认阻止所有目标;来自 `VLESS`、`VMess`、`Trojan`、`Shadowsocks`、`Hysteria` 或 `WireGuard` 入站的流量默认阻止私有及保留 IP;其它流量默认全部放行。
若服务器端需要允许客户端访问某些内网服务,应显式配置 `allow` 规则,并尽量只放行必要的 `network`、`ip` 和 `port`。
-
-若服务器端还需要依赖域名传递给 `sockopt` 的特性(例如 `sockopt.domainStrategy` 或 `happyEyeballs`),则不能继续依赖这套默认安全策略。可将第一条规则配置为不带任何匹配条件的 `allow`,以恢复此前行为;这样也等同于关闭这套默认安全策略,应自行评估安全影响。
:::
### FinalRuleObject
@@ -162,7 +155,7 @@ proxyProtocol 的值为 PROXY protocol 版本号,可选 `1` 或 `2`,如不
目标端口范围,写法与 [路由规则中的 `port`](../routing.md#ruleobject) 一致。省略时匹配所有端口。
-> `ip`: \[string\]
+> `ip`: \[ string \]
一个数组,数组内每一项代表一个 IP 范围。当某一项匹配目标 IP 时,此规则生效。写法与 [路由规则中的 `ip`](../routing.md#ruleobject) 一致。省略时匹配所有 IP。
diff --git a/docs/config/outbounds/loopback.md b/docs/config/outbounds/loopback.md
index 331d8cec..81724fe6 100644
--- a/docs/config/outbounds/loopback.md
+++ b/docs/config/outbounds/loopback.md
@@ -5,7 +5,7 @@ Loopback 是一个环回出站,用于将流量重新送回 routing 处理,
::: tip 用途
- 在只能指定出站、不能直接写 `balancerTag` 的地方,借由 Loopback 间接使用 balancer
- 例如链式代理中的 `proxySettings`、`dialerProxy` 和负载均衡中的 `fallbackTag`
+ 例如链式代理中的 `dialerProxy` 和负载均衡中的 `fallbackTag`
- 流量已经分流过一次后,再按更多条件继续细分
比如由同一组路由规则分流后的 TCP 流量和 UDP 要走不同的出站
diff --git a/docs/config/outbounds/wireguard.md b/docs/config/outbounds/wireguard.md
index 881c1646..d7713802 100644
--- a/docs/config/outbounds/wireguard.md
+++ b/docs/config/outbounds/wireguard.md
@@ -98,9 +98,9 @@ Wireguard 服务器列表,其中每一项是一个服务器配置。
当 Wireguard 服务器地址为域名、被代理流量目标地址是域名时,控制它们的域名解析策略。
-不像绝大多数代理协议,Wireguard 不允许传递域名作为目标,所以如果传入目标为一域名需要解析为 IP 地址后传送,这会经由 Xray 内置DNS处理,此处字段含义见 `Freedom` 出站的 `domainStrategy`,默认值为 `ForceIP`。
+不像绝大多数代理协议,Wireguard 不允许传递域名作为目标,所以如果传入目标为域名,需要先解析为 IP 再传送。此处字段含义与 [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject) 中对应的 `Force` 策略相同,默认值为 `ForceIP`。
-`Freedom` 出站的 `domainStrategy` 包含诸如 `UseIP` 的选项,在这里不提供,因为 Wiregiard 必须获取一个可用的 IP,不能执行 `UseIP` 解析失败后回落为域名的行为。
+`sockopt.domainStrategy` 包含诸如 `UseIP` 的选项,在这里不提供,因为 Wireguard 必须获取一个可用的 IP,不能执行 `UseIP` 解析失败后回落为域名的行为。
注意:作用于被代理流量时,此选项还受 `address` 选项的约束,比如你设置了 ForceIPv6v4 但是 address 中没有设置 IPv6 地址,尽管目标域名有 AAAA 记录也不会解析。
### Peers
diff --git a/docs/config/transports/sockopt.md b/docs/config/transports/sockopt.md
index d52b5858..721874cb 100644
--- a/docs/config/transports/sockopt.md
+++ b/docs/config/transports/sockopt.md
@@ -97,30 +97,36 @@ Sockopt 用于配置底层网络行为。
默认值 `"AsIs"`。
-当目标地址为域名时,配置相应的值,Outbound 连接远端服务器的行为模式如下:
+当出站需要连接的地址为域名时,此选项控制域名的解析方式:
-- 当使用 `"AsIs"` 时, Xray 不对域名进行特殊处理,到最后 Xray 将直接使用 go 自带的 Dial 发起连接,优先级固定为 RFC6724 的默认值(不会遵守 gai.conf 等配置) 通常来说为 IPv6 优先。
-- 当填写其他值时,将使用 Xray-core [内置 DNS 服务器](../dns.md) 服务器进行解析。若不存在DNSObject,则使用系统DNS。若有多个符合条件的IP地址时,核心会随机选择一个IP作为目标IP。
+- 当使用 `"AsIs"` 时,Xray 将域名交给 Go 按操作系统 DNS 设置解析并连接。通常 TCP 优先尝试 IPv6,并在连接不顺利时尝试 IPv4;UDP 则优先使用 IPv4。
+
+ ::: details AsIs 的地址选择与回退细节
+ TCP 使用 Go 内置的 Happy Eyeballs。解析结果中第一个地址所属的地址族为首选地址族:若在 300 ms 后仍未连接成功,则开始尝试另一地址族;若首选地址族的全部连接尝试提前失败,则立即尝试另一地址族。这不受 Xray `sockopt.happyEyeballs` 配置控制。参见 [Go 拨号实现](https://go.dev/src/net/dial.go)。
+
+ 使用纯 Go 解析器时,地址按照 RFC 6724 的精简规则排序,条件相当时通常优先 IPv6,不读取 `/etc/gai.conf`。Xray 官方 release 版大多采用这种方式;部分操作系统或下游项目编译的版本取决于所使用的解析器。参见 [Go 地址排序实现](https://go.dev/src/net/addrselect.go)。
+
+ UDP 优先选择解析结果中的 IPv4 地址,没有 IPv4 时才选择 IPv6;发送失败不会自动切换到另一地址族。`Use` 策略回退到 `AsIs` 时也遵循此行为。参见 [Go UDP 地址选择实现](https://go.dev/src/net/ipsock.go)。
+ :::
+
+- 当填写其他值时,将使用 Xray-core [内置 DNS 模块](../dns.md) 进行解析。若未配置 `DNSObject`,则使用系统 DNS。若有多个符合条件的 IP 地址,默认随机选择一个;TCP 启用 `sockopt.happyEyeballs` 后则通过竞速选择。
- `"IPv4"` 代表只解析 IPv4。`"IPv4v6"` 代表先解析 IPv4,仅当解析报错或没有返回 IP 时再解析 IPv6;如果已经解析出 IPv4,之后连接失败不会回退到 IPv6。`"IPv6"`、`"IPv6v4"` 同理,地址族顺序相反。
-- 当在内置DNS设置了 `"queryStrategy"` 后,实际行为将会与这个选项取并,只有都被包含的IP类型才会被解析,如 `"queryStrategy": "UseIPv4"` `"domainStrategy": "UseIP"`,实际上等同于 `"domainStrategy": "UseIPv4"`。
-- 当使用 `"Use"` 开头的选项时,若解析结果不符合要求(如,域名只有IPv4解析结果但使用了UseIPv6),则会回落回AsIs。
-- 当使用 `"Force"` 开头的选项时,若解析结果不符合要求,则该连接会无法建立。
+- 当在内置 DNS 中设置了 `"queryStrategy"` 后,实际解析的 IP 类型取两个选项的交集,只有两者都允许的 IP 类型才会被解析。例如,`"queryStrategy": "UseIPv4"` 配合 `"domainStrategy": "UseIP"`,实际上等同于 `"domainStrategy": "UseIPv4"`。
+- 当使用 `"Use"` 开头的选项时,若解析失败或结果不符合要求(如域名只有 IPv4 解析结果,但使用了 `UseIPv6`),则会回退到 `AsIs`。
+- 当使用 `"Force"` 开头的选项时,若解析失败或结果不符合要求,则无法建立连接。
-::: tip TIP
-当使用 `"UseIP"`、`"ForceIP"` 模式时,并且 [出站连接配置](../outbound.md#outboundobject) 中指定了 `sendThrough` 时,核心会根据 `sendThrough` 的值自动判断所需的 IP 类型,IPv4 或 IPv6。若手动指定了单种IP类型(如UseIPv4),但与 `sendThrough` 指定的本地地址不匹配,将会导致连接失败。
+::: tip
+当使用 `"UseIP"`、`"ForceIP"` 模式时,并且 [出站连接配置](../outbound.md#outboundobject) 中指定了 `sendThrough` 时,核心会根据 `sendThrough` 的值自动判断所需的 IP 类型,IPv4 或 IPv6。若手动指定了单种 IP 类型(如 UseIPv4),但与 `sendThrough` 指定的本地地址不匹配,将会导致连接失败。
:::
-::: danger
+:::: danger 启用了此功能后,不当的配置可能会导致死循环!
+连接到服务器,需要等待 DNS 查询结果;完成 DNS 查询,需要连接到服务器。
-启用了此功能后,不当的配置可能会导致死循环。
+**不建议** 经验不足的用户擅自使用此功能。
-一句话版本:连接到服务器,需要等待 DNS 查询结果;完成 DNS 查询,需要连接到服务器。
+::: details 详细解释
-> Tony: 先有鸡还是先有蛋?
-
-详细解释:
-
-1. 触发条件:代理服务器(proxy.com)。内置 DNS 服务器,非 Local 模式。
+1. 触发条件:代理服务器地址是域名(proxy.com)。内置 DNS 服务器是非 Local 模式。
2. Xray 尝试向 proxy.com 建立 TCP 连接 **前** ,通过内置 DNS 服务器查询 proxy.com。
3. 内置 DNS 服务器向 dns.com 建立连接,并发送查询,以获取 proxy.com 的 IP。
4. **不当的** 的路由规则,导致 proxy.com 代理了步骤 3 中发出的查询。
@@ -136,17 +142,13 @@ Sockopt 用于配置底层网络行为。
- 用 Hosts。
- ~~如果你还是不知道解决方案,就别用这个功能了。~~
-因此,**不建议** 经验不足的用户擅自使用此功能。
:::
+::::
> `dialerProxy`: ""
一个出站代理的标识。当值不为空时,将使用指定的 outbound 发出连接。可用于支持传输配置的链式转发。
-::: danger
-此选项与 ProxySettingsObject.Tag 不兼容
-:::
-
> `acceptProxyProtocol`: true | false
仅用于 inbound,指示是否接收 PROXY protocol。
@@ -227,9 +229,7 @@ TCP 拥塞控制算法。仅支持 Linux。
`PortOnly` 仅重置端口 `AddressOnly` 仅重置地址 `PortAndAddress` 则重置地址和端口
-该选项生效在 sockopt 里的 domainStrategy 解析之前,地址重置后仍会按 domainStrategy 的规则进行解析(如果有), 但是在 Freedom 的 domainStrategy 之后,如果在其中设置了解析为 IP 则本选项无法生效。
-
-PS: 如果有正常上网的域名流量被 AsIs 的 freedom 出站送过来,那么在此设置后会尝试解析并重置地址和端口,比如核心会尝试查询 google.com 的 SRV 记录并按记录重置目标。
+该选项在 `sockopt.domainStrategy` 解析之前生效,地址重置后仍会按 `domainStrategy` 的规则进行解析。Freedom 出站不支持此选项。
> `customSockopt`: []
@@ -285,8 +285,7 @@ RFC-8305 实现的 happyEyeballs,仅适用于 TCP。当目标为域名时对
注意:`UseIPv4v6` / `ForceIPv4v6` 会使可用的 IP 列表被缩减到仅剩 IPv4,仅当 IPv4 解析报错或没有返回 IP 时才会改为解析 IPv6;IPv4 连接失败不会触发该回退。不推荐这么用。建议使用 UseIP / ForceIP 配合 `HappyEyeballs.interleave`。
::: warning
-使用这个功能时不要使用此出站的 `targetStrategy`,这会导致 `Sockopt` 只能看到被替换完毕的 IP。
-此外也不能与 `dialerProxy` 一起使用,这会导致 `happyEyeballs` 无法生效。
+不能与 `dialerProxy` 一起使用,否则 `happyEyeballs` 无法生效。
:::
### HappyEyeballsObject
diff --git a/docs/document/level-1/routing-with-dns.md b/docs/document/level-1/routing-with-dns.md
index 00804de7..2d9543f6 100644
--- a/docs/document/level-1/routing-with-dns.md
+++ b/docs/document/level-1/routing-with-dns.md
@@ -34,16 +34,16 @@
合理利用 Xray ~~如轮椅般~~强大的内置 DNS 自带的回落、ECS、IP 过滤、打 Tag 等功能,精心调整它们的顺序。如此你便得到了比 geosite cn/!cn 更为精确且实时的 IP 作为分流条件,因为 IP 归属地,特别是 cn 归属地变更频率较低。
在继续阅读本文之前,你需要充分阅读并理解“入门技巧:路由 (routing) 功能简析[上篇](./routing-lv1-part1.md)、[下篇](./routing-lv1-part2.md)”。
-与此同时你已经快要把官方配置指南给翻烂了,因此你完全理解了路由和出站中的 domainStrategy、入站中 sniffing 各选项的作用、以及其不同值的组合下产生的行为。
+与此同时你已经快要把官方配置指南给翻烂了,因此你完全理解了路由和 sockopt 中的 domainStrategy、出站中的 targetStrategy、入站中 sniffing 各选项的作用、以及其不同值的组合下产生的行为。
一切就绪?请试着理解下面这段内容:
-socks、http 入站时,请求的就是域名,到了路由后,路由中非 AsIs 的 domainStrategy 可以利用内置 DNS 解析出 IP 临时用于路由匹配。到了本地 direct 出站时,出站中非 AsIs 的 domainStrategy 可以利用内置 DNS 再次解析出 IP 用于出站。发往 Xray 服务器的请求只有域名,具体访问哪个 IP 取决于服务器的 direct 出站。
+socks、http 入站时,原始请求的就是域名,到了路由模块后,路由中非 AsIs 的 domainStrategy 可以利用内置 DNS 解析出 IP 临时用于路由匹配。若分流到了本地 direct 出站,sockopt 中非 AsIs 的 domainStrategy 可以利用内置 DNS 再次解析出 IP 用于出站。若分流到了远端 Xray 服务器,并且本地此出站的 targetStrategy 为 AsIs,则请求目标仍以域名形式发送,具体访问哪个 IP 取决于服务器的 direct 出站。
透明代理时情况变得更加复杂,入站 sniffing 开启,且 destOverride 有 [http, tls]:
- 若 routeOnly = false 则请求的 IP 将被抹掉,后面的流程跟 socks 入站一样。
-- 若 routeOnly = true 则同时有域名和 IP,到了路由后,可以直接匹配域名和 IP 规则,本地 direct 出站也会用此 IP。发往 Xray 服务器的请求只有 IP,服务器如何处理?再把刚才的流程走一遍。
+- 若 routeOnly = true 则同时有域名和 IP,到了路由模块后,可以直接匹配域名和 IP 规则,本地 direct 出站也会用此 IP。发往 Xray 服务器的请求只有 IP,服务器如何处理?再把刚才的流程走一遍。
遇到困难?你需要继续反复阅读官方指南并尝试理解。否则你很难利用到下面示例中 DNS 模块的解析结果来正确分流。
@@ -261,7 +261,7 @@ realIp 透明代理环境,你甚至可以在保证完全劫持各种渠道的
此场景下由于发给 Xray 服务器的请求全部都是域名,因此没有必要利用 DNS 反复试探最优结果,只需要快速识别域是否被污染,尽可能解析出中国的 CDN 友好的 IP 即可。
-此示例中 DNS 模块解析出的中国 IP 已经是 99% 中国 CDN 友好的,因此你可以在 direct 出站中 `domainStrategy` 设为**非** AsIs 以利用缓存,如果你需要的话;
+此示例中 DNS 模块解析出的中国 IP 已经是 99% 中国 CDN 友好的,因此你可以将 direct 出站的 `sockopt.domainStrategy` 设为**非** AsIs 以利用缓存,如果你需要的话;
如果你追求 100% 的中国 CDN 友好,可设为 AsIs 利用操作系统设置的 DNS 再解析一次,额外耗时约 1 ~ 数百毫秒,建议开启乐观缓存以进一步降低延迟。
## 写在后面
diff --git a/docs/document/level-2/redirect.md b/docs/document/level-2/redirect.md
index 10a0ebb9..6c77f56c 100644
--- a/docs/document/level-2/redirect.md
+++ b/docs/document/level-2/redirect.md
@@ -114,8 +114,10 @@ lsmod | grep wireguard
"outbounds": [
{
"protocol": "freedom",
- "settings": {
- "domainStrategy": "UseIPv4"
+ "streamSettings": {
+ "sockopt": {
+ "domainStrategy": "UseIPv4"
+ }
}
//修改此处,可v4或者v6
},
@@ -125,11 +127,9 @@ lsmod | grep wireguard
"tag": "wg0",
"streamSettings": {
"sockopt": {
- "mark": 255 //
+ "mark": 255, //
+ "domainStrategy": "UseIPv6"
}
- },
- "settings": {
- "domainStrategy": "UseIPv6"
}
}, //设置fwmark为的用户走指定方式”UseIPv6””UseIPv4”
// <--请在不同的方案中选择--> 方案2:sendThrough
@@ -138,8 +138,10 @@ lsmod | grep wireguard
"protocol": "freedom",
"sendThrough": "your wg0 v4 address",
//修改此处,可v4或者v6
- "settings": {
- "domainStrategy": "UseIPv4"
+ "streamSettings": {
+ "sockopt": {
+ "domainStrategy": "UseIPv4"
+ }
}
//修改此处,可v4或者v6
},
@@ -147,12 +149,10 @@ lsmod | grep wireguard
{
"tag": "wg0",
"protocol": "freedom",
- "settings": {
- "domainStrategy": "UseIPv4"
- },
"streamSettings": {
"sockopt": {
- "interface": "wg0"
+ "interface": "wg0",
+ "domainStrategy": "UseIPv4"
}
}
},
@@ -193,7 +193,7 @@ lsmod | grep wireguard
```
::: tip
-可以通过修改 "domainStrategy": "UseIPv6"来控制对应用户的访问方式 实测优先级要高于系统本身的 gai.config
+可以通过修改 `sockopt.domainStrategy` 为 `UseIPv6` 来控制对应用户的访问方式。
:::
## 5、系统设置配置
diff --git a/docs/document/level-2/tproxy.md b/docs/document/level-2/tproxy.md
index f91f5c5b..b3e451f7 100644
--- a/docs/document/level-2/tproxy.md
+++ b/docs/document/level-2/tproxy.md
@@ -52,12 +52,10 @@ sudo curl -oL /usr/local/share/xray/geosite.dat https://github.com/Loyalsoldier/
{
"tag": "direct",
"protocol": "freedom",
- "settings": {
- "domainStrategy": "UseIPv4"
- },
"streamSettings": {
"sockopt": {
- "mark": 2
+ "mark": 2,
+ "domainStrategy": "UseIPv4"
}
}
},
@@ -94,12 +92,10 @@ sudo curl -oL /usr/local/share/xray/geosite.dat https://github.com/Loyalsoldier/
"settings": {
"rewriteAddress": "8.8.8.8"
},
- "proxySettings": {
- "tag": "proxy"
- },
"streamSettings": {
"sockopt": {
- "mark": 2
+ "mark": 2,
+ "dialerProxy": "proxy"
}
}
}
diff --git a/docs/document/level-2/tproxy_ipv4_and_ipv6.md b/docs/document/level-2/tproxy_ipv4_and_ipv6.md
index 31eb9039..82a03d09 100644
--- a/docs/document/level-2/tproxy_ipv4_and_ipv6.md
+++ b/docs/document/level-2/tproxy_ipv4_and_ipv6.md
@@ -91,12 +91,10 @@
{
"tag": "direct",
"protocol": "freedom",
- "settings": {
- "domainStrategy": "UseIP"
- },
"streamSettings": {
"sockopt": {
- "mark": 255
+ "mark": 255,
+ "domainStrategy": "UseIP"
}
}
},