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