Add: config (wip)

This commit is contained in:
JimhHan
2021-03-15 23:59:11 +08:00
parent 42a4e8a05b
commit 2211b91c85
49 changed files with 4365 additions and 12 deletions
+45
View File
@@ -0,0 +1,45 @@
---
alwaysopen: false
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
# head: <hr/>
hide:
- toc
# post: "&nbsp;\U0001F44B"
title: 传输方式列表
weight: 7
---
{{% alert theme="warning" %}}**这个章节包含了目前所有的传输方式及相关的具体配置.**{{% /alert %}}
## 传输方式列表
> `tcpSettings`: [TcpObject](./tcp)
针对 TCP 连接的配置。
> `wsSettings`: [WebSocketObject](./websocket)
针对 WebSocket 连接的配置。
> `dsSettings`: [DomainSocketObject](./domainsocket)
针对 Domain Socket 连接的配置。
> `kcpSettings`: [KcpObject](./mkcp)
针对 mKCP 连接的配置。
> `httpSettings`: [HttpObject](./h2)
针对 HTTP/2 连接的配置。
> `quicSettings`: [QuicObject](./quic)
针对 QUIC 连接的配置。
> `grpcSettings`: [GRPCObject](./grpc)
针对 gRPC 连接的配置。
+48
View File
@@ -0,0 +1,48 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Domain Socket
weight: 3
---
::: danger
推荐写到 [inbounds](../../base/inbounds) 的 `listen` 处,传输方式可选 TCP、WebSocket、HTTP/2.
未来这里的 DomainSocket 可能会被弃用。
Domain Socket 使用标准的 Unix domain socket 来传输数据。
它的优势是使用了操作系统内建的传输通道,而不会占用网络缓存。
理论上相比起本地环回网络(local loopback)来说,Domain socket 速度略快一些。
目前仅可用于支持 Unix domain socket 的平台,如 Linux 和 macOS。在 Windows 10 Build 17036 前不可用。
如果指定了 domain socket 作为传输方式,在入站出站代理中配置的端口和 IP 地址将会失效,所有的传输由 domain socket 取代。
## DomainSocketObject
---
`DomainSocketObject` 对应传输配置的 `dsSettings` 项。
```json
{
"path": "/path/to/ds/file",
"abstract": false,
"padding": false
}
```
> `path`: string
一个合法的文件路径。
::: danger
在运行 Xray 之前,这个文件必须不存在。
> `abstract`: true | false
是否为 abstract domain socket,默认值 `false`。
> `padding`: true | false
abstract domain socket 是否带 padding,默认值 `false`。
+29
View File
@@ -0,0 +1,29 @@
---
date: "2021-3-14T00:00:00.000Z"
description: Project X 的文档.
title: gRPC
weight: 7
---
基于 gRPC 的传输方式。
它基于 HTTP/2 协议,可以通过其它的 HTTP 服务器(如 Nginx)进行中转。
## GRPCObject
---
`GRPCObject` 对应传输配置的 `grpcSettings` 项。
```json
{
"serviceName": "name"
}
```
> `serviceName`: string
一个字符串,指定服务路径,相当于 HTTP/2 与 WebSocket 中的 Path。
客户端会使用此名称进行通信,服务器会验证服务名称是否匹配。
+42
View File
@@ -0,0 +1,42 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: HTTP/2
weight: 5
---
基于 HTTP/2 的传输方式。
它完整按照 HTTP/2 标准实现,可以通过其它的 HTTP 服务器(如 Nginx)进行中转。
由 HTTP/2 的建议,客户端和服务器必须同时开启 TLS 才可以正常使用这个传输方式。
::: tip
当前版本的 HTTP/2 的传输方式并不强制要求服务器端有 TLS 配置.
这使得可以在特殊用途的分流部署环境中,由外部网关组件完成 TLS 层对话,Xray 作为后端应用,网关和 Xray 间使用称为 `h2c` 的明文 http/2 进行通讯。
## HttpObject
---
`HttpObject` 对应传输配置的 `httpSettings` 项。
```json
{
"host": ["xray.com"],
"path": "/random/path"
}
```
> `host`: \[string\]
一个字符串数组,每一个元素是一个域名。
客户端会随机从列表中选出一个域名进行通信,服务器会验证域名是否在列表中。
> `path` string
HTTP 路径,由 `/` 开头, 客户端和服务器必须一致。
默认值为 `"/"`。
+172
View File
@@ -0,0 +1,172 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: mKCP
weight: 4
---
mKCP 使用 UDP 来模拟 TCP 连接。
mKCP 牺牲带宽来降低延迟。传输同样的内容,mKCP 一般比 TCP 消耗更多的流量。
::: tip
请确定主机上的防火墙配置正确
## KcpObject
---
`KcpObject` 对应传输配置的 `kcpSettings` 项。
```json
{
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5,
"downlinkCapacity": 20,
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "none"
},
"seed": "Password"
}
```
> `mtu`: number
最大传输单元(maximum transmission unit)
请选择一个介于 `576` - `1460` 之间的值。
默认值为 `1350`。
> `tti`: number
传输时间间隔(transmission time interval),单位毫秒(ms),mKCP 将以这个时间频率发送数据。
请选译一个介于 `10` - `100` 之间的值。
默认值为 `50`。
> `uplinkCapacity`: number
上行链路容量,即主机发出数据所用的最大带宽,单位 MB/s,注意是 Byte 而非 bit。
可以设置为 `0`,表示一个非常小的带宽。
默认值 `5`。
> `downlinkCapacity`: number
下行链路容量,即主机接收数据所用的最大带宽,单位 MB/s,注意是 Byte 而非 bit。
可以设置为 `0`,表示一个非常小的带宽。
默认值 `20`。
::: tip
`uplinkCapacity` 和 `downlinkCapacity` 决定了 mKCP 的传输速度。
以客户端发送数据为例,客户端的 `uplinkCapacity` 指定了发送数据的速度,而服务器端的 `downlinkCapacity` 指定了接收数据的速度。两者的值以较小的一个为准。
推荐把 `downlinkCapacity` 设置为一个较大的值,比如 100,而 `uplinkCapacity` 设为实际的网络速度。当速度不够时,可以逐渐增加 `uplinkCapacity` 的值,直到带宽的两倍左右。
> `congestion`: true | false
是否启用拥塞控制。
开启拥塞控制之后,Xray 会自动监测网络质量,当丢包严重时,会自动降低吞吐量;当网络畅通时,也会适当增加吞吐量。
默认值为 `false`
> `readBufferSize`: number
单个连接的读取缓冲区大小,单位是 MB。
默认值为 `2`。
> `writeBufferSize`: number
单个连接的写入缓冲区大小,单位是 MB。
默认值为 `2`。
::: tip
`readBufferSize` 和 `writeBufferSize` 指定了单个连接所使用的内存大小。
在需要高速传输时,指定较大的 `readBufferSize` 和 `writeBufferSize` 会在一定程度上提高速度,但也会使用更多的内存。
在网速不超过 20MB/s 时,默认值 1MB 可以满足需求;超过之后,可以适当增加 `readBufferSize` 和 `writeBufferSize` 的值,然后手动平衡速度和内存的关系。
> `header`: [HeaderObject](#headerobject)
数据包头部伪装设置
> `seed`: string
可选的混淆密码,使用 AES-128-GCM 算法混淆流量数据,客户端和服务端需要保持一致。
本混淆机制不能用于保证通信内容的安全,但可能可以对抗部分封锁。
::: tip
目前测试环境下开启此设置后没有出现原版未混淆版本的封端口现象
### HeaderObject
---
```json
{
"type": "none"
}
```
> `type`: string
伪装类型,可选的值有:
- `"none"`:默认值,不进行伪装,发送的数据是没有特征的数据包。
- `"srtp"`:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。
- `"utp"`:伪装成 uTP 数据包,会被识别为 BT 下载数据。
- `"wechat-video"`:伪装成微信视频通话的数据包。
- `"dtls"`:伪装成 DTLS 1.2 数据包。
- `"wireguard"`:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
## 鸣谢
---
- [@skywind3000](https://github.com/skywind3000) 发明并实现了 KCP 协议。
- [@xtaci](https://github.com/xtaci) 将 KCP 由 C 语言实现翻译成 Go。
- [@xiaokangwang](https://github.com/xiaokangwang) 测试 KCP 与 Xray 的整合并提交了最初的 PR。
## 对 KCP 协议的改进
---
### 更小的协议头
---
原生 KCP 协议使用了 24 字节的固定头部,而 mKCP 修改为数据包 18 字节,确认(ACK)包 16 字节。更小的头部有助于躲避特征检查,并加快传输速度。
另外,原生 KCP 的单个确认包只能确认一个数据包已收到,也就是说当 KCP 需要确认 100 个数据已收到时,它会发出 24 \* 100 = 2400 字节的数据。其中包含了大量重复的头部数据,造成带宽的浪费。mKCP 会对多个确认包进行压缩,100 个确认包只需要 16 + 2 + 100 \* 4 = 418 字节,相当于原生的六分之一。
### 确认包重传
---
原生 KCP 协议的确认(ACK)包只发送一次,如果确认包丢失,则一定会导致数据重传,造成不必要的带宽浪费。而 mKCP 会以一定的频率重发确认包,直到发送方确认为止。单个确认包的大小为 22 字节,相比起数据包的 1000 字节以上,重传确认包的代价要小得多。
### 连接状态控制
---
mKCP 可以有效地开启和关闭连接。当远程主机主动关闭连接时,连接会在两秒钟之内释放;当远程主机断线时,连接会在最多 30 秒内释放。
原生 KCP 不支持这个场景。
+85
View File
@@ -0,0 +1,85 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: QUIC
weight: 6
---
QUIC 全称 Quick UDP Internet Connection,是由 Google 提出的使用 UDP 进行多路并发传输的协议。其主要优势是:
1. 减少了握手的延迟(1-RTT 或 0-RTT)
2. 多路复用,并且没有 TCP 的阻塞问题
3. 连接迁移,(主要是在客户端)当由 Wifi 转移到 4G 时,连接不会被断开。
QUIC 目前处于实验期,使用了正在标准化过程中的 IETF 实现,不能保证与最终版本的兼容性。
- 默认设定:
- 12 字节的 Connection ID
- 30 秒没有数据通过时自动断开连接 (可能会影响一些长连接的使用)
## QuicObject
---
`QuicObject` 对应传输配置的 `quicSettings` 项。
::: danger
对接的两端的配置必须完全一致,否则连接失败。
QUIC 强制要求开启 TLS,在传输配置中没有开启 TLS 时,Xray 会自行签发一个证书进行 TLS 通讯。
```json
{
"security": "none",
"key": "",
"header": {
"type": "none"
}
}
```
> `security`: "none" | "aes-128-gcm" | "chacha20-poly1305"
加密方式。
此加密是对 QUIC 数据包的加密,加密后数据包无法被探测。
默认值为不加密。
> `key`: string
加密时所用的密钥。
可以是任意字符串。当 `security` 不为 `"none"` 时有效。
> `header`: [HeaderObject](#headerobject)
数据包头部伪装设置
### HeaderObject
---
```json
{
"type": "none"
}
```
> `type`: string
伪装类型,可选的值有:
- `"none"`:默认值,不进行伪装,发送的数据是没有特征的数据包。
- `"srtp"`:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。
- `"utp"`:伪装成 uTP 数据包,会被识别为 BT 下载数据。
- `"wechat-video"`:伪装成微信视频通话的数据包。
- `"dtls"`:伪装成 DTLS 1.2 数据包。
- `"wireguard"`:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
::: tip
当加密和伪装都不启用时,数据包即为原始的 QUIC 数据包,可以与其它的 QUIC 工具对接。
为了避免被探测,建议加密或伪装至少开启一项。
+170
View File
@@ -0,0 +1,170 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: TCP
weight: 1
---
TCP 传输模式是目前推荐使用的传输模式之一.
可以和各种协议有多种组合模式.
## TcpObject
---
`TcpObject` 对应传输配置的 `tcpSettings` 项。
```json
{
"acceptProxyProtocol": false,
"header": {
"type": "none"
}
}
```
> `acceptProxyProtocol`: true | false
仅用于 inbound,指示是否接收 PROXY protocol。
[PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) 专用于传递请求的真实来源 IP 和端口,**若你不了解它,请先忽略该项**。
常见的反代软件(如 HAProxy、Nginx)都可以配置发送它,VLESS fallbacks xver 也可以发送它。
填写 `true` 时,最底层 TCP 连接建立后,请求方必须先发送 PROXY protocol v1 或 v2,否则连接会被关闭。
默认值为 `false`。
> `header`: [NoneHeaderObject](#noneheaderobject) | [HttpHeaderobject](#httpheaderobject)
数据包头部伪装设置,默认值为 `NoneHeaderObject`。
::: tip
HTTP 伪装无法被其它 HTTP 服务器(如 Nginx)分流,但可以被 VLESS fallbacks path 分流。
### NoneHeaderObject
---
不进行伪装
```json
{
"type": "none"
}
```
> `type`: "none"
指定不进行伪装
### HttpHeaderObject
---
HTTP 伪装配置必须在对应的入站出站连接上同时配置,且内容必须一致。
```json
{
"type": "http",
"request": {},
"response": {}
}
```
> `type`: "http"
指定进行 HTTP 伪装
> `request`: [HTTPRequestObject](#httprequestobject)
HTTP 请求
> `response`: [HTTPResponseObject](#httpresponseobject)
HTTP 响应
#### HTTPRequestObject
---
```json
{
"version": "1.1",
"method": "GET",
"path": ["/"],
"headers": {
"Host": ["www.baidu.com", "www.bing.com"],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
],
"Accept-Encoding": ["gzip, deflate"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
```
> `version`: string
HTTP 版本,默认值为 `"1.1"`。
> `method`: string
HTTP 方法,默认值为 `"GET"`。
> `path`: \[ string \]
路径,一个字符串数组。默认值为 `["/"]`。当有多个值时,每次请求随机选择一个值。
> `headers`: map{ string, \[ string \]}
HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。
每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。
#### HTTPResponseObject
---
```json
{
"version": "1.1",
"status": "200",
"reason": "OK",
"headers": {
"Content-Type": ["application/octet-stream", "video/mpeg"],
"Transfer-Encoding": ["chunked"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
```
> `version`: string
HTTP 版本,默认值为 `"1.1"`。
> `status`: string
HTTP 状态,默认值为 `"200"`。
> `reason`: string
HTTP 状态说明,默认值为 `"OK"`。
> `headers`: map {string, \[ string \]}
HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。
每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。
+46
View File
@@ -0,0 +1,46 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: WebSocket
weight: 2
---
使用标准的 WebSocket 来传输数据。
WebSocket 连接可以被其它 HTTP 服务器(如 Nginx)分流,也可以被 VLESS fallbacks path 分流。
::: tip
Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来覆写流量的源地址,优先级高于 PROXY protocol。
## WebSocketObject
`WebSocketObject` 对应传输配置的 `wsSettings` 项。
```json
{
"acceptProxyProtocol": false,
"path": "/",
"headers": {
"Host": "xray.com"
}
}
```
> `acceptProxyProtocol`: true | false
仅用于 inbound,指示是否接收 PROXY protocol。
[PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) 专用于传递请求的真实来源 IP 和端口,**若你不了解它,请先忽略该项**。
常见的反代软件(如 HAProxy、Nginx)都可以配置发送它,VLESS fallbacks xver 也可以发送它。
填写 `true` 时,最底层 TCP 连接建立后,请求方必须先发送 PROXY protocol v1 或 v2,否则连接会被关闭。
> `path` string
WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"`。
> `headers`: map \{string: string\}
自定义 HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是字符串。
默认值为空。