From 7d80639f6f5be1668063131c54b77f1649233124 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E3=81=A1=E3=81=8B?=
<88967758+chika0801@users.noreply.github.com>
Date: Mon, 8 Jan 2024 03:19:56 +0800
Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E4=B8=80=E4=BA=9B=E5=86=85?=
=?UTF-8?q?=E5=AE=B9=E5=92=8C=E4=BF=AE=E6=AD=A3=20(#447)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Update routing.md
* Update vmess.md
* Update README.md
* Create metrics.md
* Update inbound.md
* Update wireguard.md
* Update freedom.md
* Update api.md
* Update routing.md
* Update grpc.md
* Update grpc.md
* Update transport.md
补充 tcpWindowClamp 参数,参数介绍是谷歌搜索的。
* Update transport.md
---
docs/config/README.md | 7 +-
docs/config/api.md | 11 ++
docs/config/inbound.md | 4 +-
docs/config/metrics.md | 275 +++++++++++++++++++++++++++++
docs/config/outbounds/freedom.md | 57 +-----
docs/config/outbounds/vmess.md | 15 +-
docs/config/outbounds/wireguard.md | 11 --
docs/config/routing.md | 1 +
docs/config/transport.md | 6 +
docs/config/transports/grpc.md | 5 +
10 files changed, 322 insertions(+), 70 deletions(-)
create mode 100644 docs/config/metrics.md
diff --git a/docs/config/README.md b/docs/config/README.md
index 772cad8..bebc166 100644
--- a/docs/config/README.md
+++ b/docs/config/README.md
@@ -22,7 +22,8 @@ Xray 的配置文件为 json 格式, 客户端和服务端的配置格式没有
"transport": {},
"stats": {},
"reverse": {},
- "fakedns": {}
+ "fakedns": {},
+ "metrics": {}
}
```
@@ -75,3 +76,7 @@ Xray 的配置文件为 json 格式, 客户端和服务端的配置格式没有
> fakedns: [FakeDnsObject](./fakedns.md)
FakeDNS 配置。可配合透明代理使用,以获取实际域名。
+
+> metrics: [metricsObject](./metrics.md)
+
+metrics 配置。更直接(希望更好)的统计导出方式。
diff --git a/docs/config/api.md b/docs/config/api.md
index 12723f7..ed1916f 100644
--- a/docs/config/api.md
+++ b/docs/config/api.md
@@ -65,6 +65,17 @@ API 接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
}
```
+在基础配置中增加 api
+
+```json
+"api": {
+ "tag": "api",
+ "services": [
+ "StatsService"
+ ]
+}
+```
+
## 支持的 API 列表
### HandlerService
diff --git a/docs/config/inbound.md b/docs/config/inbound.md
index 67243e4..37367be 100644
--- a/docs/config/inbound.md
+++ b/docs/config/inbound.md
@@ -111,11 +111,11 @@
其中 `["fakedns+others"]` 相当于 `["http", "tls", "quic", "fakedns"]`,当 IP 地址处于 FakeIP 区间内但没有命中域名记录时会使用 `http`、`tls` 和 `quic` 进行匹配。此项仅在 `metadataOnly` 为 `false` 时有效。
-::: tip 1
+::: tip
Xray只会嗅探 `destOverride` 中协议的域名用作路由,如果只想进行嗅探用作路由而不想重置目标地址,请在这里添加对应的协议并启用 `routeOnly` 。
:::
-::: tip 2
+::: tip
当使用 Tor 浏览器,设置使用代理访问互联网(HTTP / SOCKS),地址为本地 IP 127.0.0.1,需要关闭 `"sniffing"` 才能正常使用。
:::
diff --git a/docs/config/metrics.md b/docs/config/metrics.md
new file mode 100644
index 0000000..8759250
--- /dev/null
+++ b/docs/config/metrics.md
@@ -0,0 +1,275 @@
+# metrics
+
+更直接(希望更好)的统计导出方式。
+
+## 相关配置
+
+可以在 inbounds 配置中增加一个 metrics 的 inbound
+
+```json
+ "inbounds": [
+ {
+ "listen": "127.0.0.1",
+ "port": 11111,
+ "protocol": "dokodemo-door",
+ "settings": {
+ "address": "127.0.0.1"
+ },
+ "tag": "metrics_in"
+ }
+ ]
+```
+
+在路由配置中增加针对 metrics inbound 的路由规则
+
+```json
+ "routing": {
+ "rules": [
+ {
+ "type": "field",
+ "inboundTag": [
+ "metrics_in"
+ ],
+ "outboundTag": "metrics_out"
+ }
+ ]
+ }
+```
+
+在基础配置中增加 metrics
+
+```json
+ "metrics": {
+ "tag": "metrics_out"
+ }
+```
+
+## 使用方法
+
+### pprof
+
+Access `http://127.0.0.1:11111/debug/pprof/` or use go tool pprof to start profiling or inspect running goroutines.
+
+### expvars
+
+Access `http://127.0.0.1:11111/debug/vars`
+
+Variables exported include:
+* `stats` includes statistics about inbounds, outbounds and users
+* `observatory` includes observatory results
+
+for example with [luci-app-xray](https://github.com/yichya/luci-app-xray) you are likely to get a result like this (standard expvar things like `cmdline` and `memstats` are omitted)
+
+点击查看
+
+```json
+{
+ "observatory": {
+ "tcp_outbound": {
+ "alive": true,
+ "delay": 782,
+ "outbound_tag": "tcp_outbound",
+ "last_seen_time": 1648477189,
+ "last_try_time": 1648477189
+ },
+ "udp_outbound": {
+ "alive": true,
+ "delay": 779,
+ "outbound_tag": "udp_outbound",
+ "last_seen_time": 1648477191,
+ "last_try_time": 1648477191
+ }
+ },
+ "stats": {
+ "inbound": {
+ "api": {
+ "downlink": 0,
+ "uplink": 0
+ },
+ "dns_server_inbound_5300": {
+ "downlink": 14286,
+ "uplink": 5857
+ },
+ "http_inbound": {
+ "downlink": 74460,
+ "uplink": 10231
+ },
+ "https_inbound": {
+ "downlink": 0,
+ "uplink": 0
+ },
+ "metrics": {
+ "downlink": 6327,
+ "uplink": 1347
+ },
+ "socks_inbound": {
+ "downlink": 19925615,
+ "uplink": 5512
+ },
+ "tproxy_tcp_inbound": {
+ "downlink": 4739161,
+ "uplink": 1568869
+ },
+ "tproxy_udp_inbound": {
+ "downlink": 0,
+ "uplink": 2608142
+ }
+ },
+ "outbound": {
+ "blackhole_outbound": {
+ "downlink": 0,
+ "uplink": 0
+ },
+ "direct": {
+ "downlink": 97714548,
+ "uplink": 3234617
+ },
+ "dns_server_outbound": {
+ "downlink": 7116,
+ "uplink": 2229
+ },
+ "manual_tproxy_outbound_tcp_1": {
+ "downlink": 0,
+ "uplink": 0
+ },
+ "manual_tproxy_outbound_udp_1": {
+ "downlink": 0,
+ "uplink": 0
+ },
+ "tcp_outbound": {
+ "downlink": 23873238,
+ "uplink": 1049595
+ },
+ "udp_outbound": {
+ "downlink": 639282,
+ "uplink": 74634
+ }
+ },
+ "user": {}
+ }
+}
+```
+
+
+To get a better view of these numbers, [Netdata](https://github.com/netdata/netdata) (with python.d plugin) is a great option:
+
+1. Edit related configuration file (`sudo /etc/netdata/edit-config python.d/go_expvar.conf`)
+2. Take the following configuration file as an example:
+
+点击查看
+
+```
+xray:
+ name: 'xray'
+ update_every: 2
+ url: 'http://127.0.0.1:11111/debug/vars'
+ collect_memstats: false
+ extra_charts:
+ - id: 'inbounds'
+ options:
+ name: 'inbounds'
+ title: 'Xray System Inbounds'
+ units: bytes
+ family: xray
+ context: xray.inbounds
+ chart_type: line
+ lines:
+ - expvar_key: stats.inbound.tproxy_tcp_inbound.downlink
+ id: 'tcp.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.tproxy_udp_inbound.downlink
+ id: 'udp.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.http_inbound.downlink
+ id: 'http.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.https_inbound.downlink
+ id: 'https.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.socks_inbound.downlink
+ id: 'socks.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.tproxy_tcp_inbound.uplink
+ id: 'tcp.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.tproxy_udp_inbound.uplink
+ id: 'udp.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.http_inbound.uplink
+ id: 'http.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.https_inbound.uplink
+ id: 'https.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.inbound.socks_inbound.uplink
+ id: 'socks.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - id: 'outbounds'
+ options:
+ name: 'outbounds'
+ title: 'Xray System Outbounds'
+ units: bytes
+ family: xray
+ context: xray.outbounds
+ chart_type: line
+ lines:
+ - expvar_key: stats.outbound.tcp_outbound.downlink
+ id: 'tcp.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.outbound.udp_outbound.downlink
+ id: 'udp.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.outbound.direct.downlink
+ id: 'direct.downlink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.outbound.tcp_outbound.uplink
+ id: 'tcp.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.outbound.udp_outbound.uplink
+ id: 'udp.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - expvar_key: stats.outbound.direct.uplink
+ id: 'direct.uplink'
+ algorithm: incremental
+ expvar_type: int
+ - id: 'observatory'
+ options:
+ name: 'observatory'
+ title: 'Xray Observatory Metrics'
+ units: milliseconds
+ family: xray
+ context: xray.observatory
+ chart_type: line
+ lines:
+ - expvar_key: observatory.tcp_outbound.delay
+ id: tcp
+ expvar_type: int
+ - expvar_key: observatory.udp_outbound.delay
+ id: udp
+ expvar_type: int
+```
+
+
+And you will get a nice plot like this:
+
+![160428235-2988bf69-5d6c-41ec-8267-1bd512508aa8](https://github.com/chika0801/Xray-docs-next/assets/88967758/455e88ce-ced2-4593-a9fa-425bb293215b)
+
+### Additional
+Maybe reusing the empty object `stats` in config file is better than adding `metrics` here?
+
+**Edit:** removed prometheus related things and added usage about expvars
diff --git a/docs/config/outbounds/freedom.md b/docs/config/outbounds/freedom.md
index d773c3f..1e772cc 100644
--- a/docs/config/outbounds/freedom.md
+++ b/docs/config/outbounds/freedom.md
@@ -30,60 +30,9 @@ Xray-core v1.8.6 新增功能:
当目标地址为域名时,配置相应的值,Freedom 的行为模式如下:
- `"AsIs"`:Freedom 使用系统 DNS 同时查询 A 和 AAAA 记录获取 IP,向此域名发出连接。IPv4 或 IPv6 优先级由系统控制。
-
-| | AsIs |
-| :--- | :---: |
-| 系统有 IPv4 IPv6 | 通常 IPv6 优先 |
-| 系统只有 IPv4 | IPv4 |
-| 系统只有 IPv6 | IPv6 |
-
-- `"UseIP"`、`"UseIPv6v4"`、`"UseIPv6"`、`"UseIPv4v6"`、`"UseIPv4"`:使用 Xray-core [内置 DNS 服务器](../dns.md) 查询获取 IP,向此域名发出连接。IPv4 或 IPv6 优先级详见下方表格。
-
-| 系统有 IPv4 IPv6 | UseIP | UseIPv6v4 | UseIPv6 | UseIPv4v6 | UseIPv4 |
-| :--- | :---: | :---: | :---: | :---: | :---: |
-| `"queryStrategy": "UseIP"` | **1** | **2** | IPv6 | **3** | IPv4 |
-| `"queryStrategy": "UseIPv4"` | IPv4 | **4** | **5** | **6** | IPv4 |
-| `"queryStrategy": "UseIPv6"` | IPv6 | **7** | IPv6 | **8** | **9** |
-
-**1:** IPv4 IPv6 地址,随机优先
-**2:** IPv4 IPv6 地址,IPv6 优先
-**3:** IPv4 IPv6 地址,IPv4 优先
-**4:** IPv4 IPv6 地址,IPv6 优先,IPv6 地址由系统 DNS 查询
-**5:** IPv6 地址,IPv6 地址由系统 DNS 查询
-**6:** IPv4 IPv6 地址,IPv4 优先,IPv6 地址由系统 DNS 查询
-**7:** IPv4 IPv6 地址,IPv6 优先,IPv4 地址由系统 DNS 查询
-**8:** IPv4 IPv6 地址,IPv4 优先,IPv4 地址由系统 DNS 查询
-**9:** IPv4 地址,IPv4 地址由系统 DNS 查询
-
-- `"ForceIP"`、`"ForceIPv6v4"`、`"ForceIPv6"`、`"ForceIPv4v6"`、`"ForceIPv4"`:使用 Xray-core [内置 DNS 服务器](../dns.md) 查询获取 IP,向此域名发出连接。IPv4 或 IPv6 优先级详见下方表格。
-
-| 系统有 IPv4 IPv6 | ForceIP | ForceIPv6v4 | ForceIPv6 | ForceIPv4v6 | ForceIPv4 |
-| :--- | :---: | :---: | :---: | :---: | :---: |
-| `"queryStrategy": "UseIP"` | **1** | **2** | IPv6 | **3** | IPv4 |
-| `"queryStrategy": "UseIPv4"` | IPv4 | IPv4 | 冲突 | IPv4 | IPv4 |
-| `"queryStrategy": "UseIPv6"` | IPv6 | IPv6 | IPv6 | IPv6 | 冲突 |
-
-**1:** IPv4 IPv6 地址,随机优先
-**2:** IPv4 IPv6 地址,IPv6 优先
-**3:** IPv4 IPv6 地址,IPv4 优先
-
-- 当使用 `"UseIP"` 系列值 或 `"ForceIP"` 系列值时,若没写 `"dns"` 配置,使用系统 DNS 同时查询 A 和 AAAA 记录获取 IP,向此域名发出连接。IPv4 或 IPv6 优先级详见下方表格。
-
-| | UseIP | UseIPv6v4 | UseIPv6 | UseIPv4v6 | UseIPv4 |
-| :--- | :---: | :---: | :---: | :---: | :---: |
-| 系统有 IPv4 IPv6 | **1** | **2** | IPv6 | **3** | IPv4 |
-| 系统只有 IPv4 | IPv4 | 冲突 | 冲突 | IPv4 | IPv4 |
-| 系统只有 IPv6 | IPv6 | IPv6 | IPv6 | 冲突 | 冲突 |
-
-| | ForceIP | ForceIPv6v4 | ForceIPv6 | ForceIPv4v6 | ForceIPv4 |
-| :--- | :---: | :---: | :---: | :---: | :---: |
-| 系统有 IPv4 IPv6 | **1** | **2** | IPv6 | **3** | IPv4 |
-| 系统只有 IPv4 | IPv4 | 冲突 | 冲突 | IPv4 | IPv4 |
-| 系统只有 IPv6 | IPv6 | IPv6 | IPv6 | 冲突 | 冲突 |
-
-**1:** IPv4 IPv6 地址,随机优先
-**2:** IPv4 IPv6 地址,IPv6 优先
-**3:** IPv4 IPv6 地址,IPv4 优先
+- `"UseIP"`、`"UseIPv6v4"`、`"UseIPv6"`、`"UseIPv4v6"`、`"UseIPv4"`:使用 Xray-core [内置 DNS 服务器](../dns.md) 查询获取 IP,向此域名发出连接。
+- `"ForceIP"`、`"ForceIPv6v4"`、`"ForceIPv6"`、`"ForceIPv4v6"`、`"ForceIPv4"`:使用 Xray-core [内置 DNS 服务器](../dns.md) 查询获取 IP,向此域名发出连接。
+- 当使用 `"UseIP"` 系列值 或 `"ForceIP"` 系列值时,若没写 `"dns"` 配置,使用系统 DNS 同时查询 A 和 AAAA 记录获取 IP,向此域名发出连接。
::: tip TIP 1
当使用 `"UseIP"`、`"ForceIP"` 模式时,并且 [出站连接配置](../outbound.md#outboundobject) 中指定了 `sendThrough` 时,Freedom 会根据 `sendThrough` 的值自动判断所需的 IP 类型,IPv4 或 IPv6。
diff --git a/docs/config/outbounds/vmess.md b/docs/config/outbounds/vmess.md
index 0317d2e..9004e85 100644
--- a/docs/config/outbounds/vmess.md
+++ b/docs/config/outbounds/vmess.md
@@ -18,7 +18,8 @@ VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"security": "auto",
- "level": 0
+ "level": 0,
+ "experiments": ""
}
]
}
@@ -62,7 +63,8 @@ VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"security": "auto",
- "level": 0
+ "level": 0,
+ "experiments": ""
}
```
@@ -108,3 +110,12 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。
无论使用哪种加密方式, VMess 的包头都会受到加密和认证的保护。
:::
+
+> `experiments`: string
+
+启用的 VMess 协议实验性功能。(此处的功能为不稳定功能, 可能随时被移除)多个启用的实验之间可以用 | 字符分割,如 "AuthenticatedLength|NoTerminationSignal" 。
+
+"AuthenticatedLength" 启用认证的数据包长度实验。此实验需要同时在客户端与服务器端同时开启,并运行相同版本的程序。
+
+"NoTerminationSignal" 启用不发送断开连接标致实验。此实验可能会影响被代理的连接的稳定性。
+
diff --git a/docs/config/outbounds/wireguard.md b/docs/config/outbounds/wireguard.md
index 0e44224..69a846b 100644
--- a/docs/config/outbounds/wireguard.md
+++ b/docs/config/outbounds/wireguard.md
@@ -86,17 +86,6 @@ Xray-core v1.8.6 新增参数。
若不写此参数,或留空,默认值 `"ForceIP"`。
当目标地址为域名时,使用 Xray-core [内置 DNS 服务器](../dns.md)查询获取 IP(若没写 `"dns"` 配置,使用系统 DNS),将此 IP 通过 wireguard 发出连接。
-| domainStrategy | test-ipv6.com | bgp.he.net | chat.openai.com |
-| :--- | :---: | :---: | :---: |
-| ForceIPv6v4 | IPv6v4地址 | IPv6地址 | IPv6地址 |
-| ForceIPv6 | 网站打不开 | IPv6地址 | IPv6地址 |
-| ForceIPv4v6 | IPv6v4地址 **1** | IPv4地址 | IPv4地址 |
-| ForceIPv4 | IPv4地址 | IPv4地址 | IPv4地址 |
-| ForceIP | IPv6v4地址 **2** | IPv6地址 | IPv6地址 |
-
-**1:** 提示`你已经有 IPv6 地址了,但你的浏览器不太愿意用,这一点比较令人担心。`
-**2:** 有机率提示`你已经有 IPv6 地址了,但你的浏览器不太愿意用,这一点比较令人担心。`
-
::: tip
若 `domainStrategy` 的值与 `"dns"` 配置中 `"queryStrategy"` 的值产生冲突,会造成网站打开失败。
:::
diff --git a/docs/config/routing.md b/docs/config/routing.md
index 90c9a65..6049c9e 100644
--- a/docs/config/routing.md
+++ b/docs/config/routing.md
@@ -113,6 +113,7 @@
- [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing):形如 `"10.0.0.0/8"`。
- 预定义 IP 列表:此列表预置于每一个 Xray 的安装包中,文件名为 `geoip.dat`。使用方式形如 `"geoip:cn"`,必须以 `geoip:`(小写)开头,后面跟双字符国家代码,支持几乎所有可以上网的国家。
- 特殊值:`"geoip:private"`,包含所有私有地址,如 `127.0.0.1`。
+ - 反选(!)功能,`"geoip:!cn"` 表示非 geoip:cn 中的结果。
- 从文件中加载 IP:形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](./features/env.md#资源文件路径) 中,文件格式与 `geoip.dat` 相同标签必须在文件中存在。
> `port`:number | string
diff --git a/docs/config/transport.md b/docs/config/transport.md
index 167cb11..0af6735 100644
--- a/docs/config/transport.md
+++ b/docs/config/transport.md
@@ -88,6 +88,7 @@
"tcpcongestion": "bbr",
"interface": "wg0",
"V6Only": false,
+ "tcpWindowClamp": 600
"tcpMptcp": false,
"tcpNoDelay": false
}
@@ -511,6 +512,7 @@ OCSP 装订更新,与证书热重载的时间间隔。 单位:秒。默认
"tcpcongestion": "bbr",
"interface": "wg0",
"V6Only": false,
+ "tcpWindowClamp": 600
"tcpMptcp": false,
"tcpNoDelay": false
}
@@ -686,6 +688,10 @@ iOS / Mac OS 需要 Xray-core v1.8.6 或更高版本。
填写 `true` 时,监听 `::` 地址仅接受 IPv6 连接。仅支持 Linux。
+> `tcpWindowClamp`: number
+
+绑定通告的 windows 大小为该值。内核会在它与 SOCK_MIN_RCVBUF/2 之间选一个最大值。
+
> `tcpMptcp`: true | false
Xray-core v1.8.6 新增参数。
diff --git a/docs/config/transports/grpc.md b/docs/config/transports/grpc.md
index 17c6ad5..3616902 100644
--- a/docs/config/transports/grpc.md
+++ b/docs/config/transports/grpc.md
@@ -50,6 +50,11 @@ gRPC(HTTP/2)内置多路复用,不建议使用 gRPC 与 HTTP/2 时启用 m
一个字符串,指定服务名称,**类似于** HTTP/2 中的 Path。
客户端会使用此名称进行通信,服务端会验证服务名称是否匹配。
+::: tip
+当 `serviceName` 起始为斜杠时可以自定义 path。
+例如在服务端填写 `"serviceName": "/my/sample/path1|path2"`,客户端可填写 `"serviceName": "/my/sample/path1"` 或 `"/my/sample/path2"`。
+:::
+
> `user_agent`: string
::: tip