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
+96
View File
@@ -0,0 +1,96 @@
# API接口
API接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供远程调用。
可以通过api配置模块开启接口. 当api配置开启时,Xray 会自建一个出站代理, 须手动将所有的 API 入站连接通过 [路由规则配置](../routing) 指向这一出站代理。
请参考本节中的[相关配置](#相关配置)
::: warning
大多数用户并不会用到此 API,新手可以直接忽略这一项。
:::
## ApiObject
`ApiObject` 对应配置文件的 `api` 项。
```json
{
"api": {
"tag": "api",
"services": [
"HandlerService",
"LoggerService",
"StatsService"
]
}
}
```
> `tag`: string
出站代理标识。
> `services`: \[string\]
开启的 API 列表,可选的值见 [API 列表](#支持的-api-列表)。
## 相关配置
可以在 inbounds 配置中增加一个 api 的 inbound
```json
"inbounds": [
{
"listen": "127.0.0.1",
"port": 10085,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"tag": "api"
}
]
```
在路由配置中增加针对api inbound的路由规则
```json
"routing": {
"settings": {
"rules": [
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
}
]
},
"strategy": "rules"
}
```
## 支持的 API 列表
### HandlerService
一些对于入站出站代理进行修改的 API,可用的功能如下:
- 添加一个新的入站代理;
- 添加一个新的出站代理;
- 删除一个现有的入站代理;
- 删除一个现有的出站代理;
- 在一个入站代理中添加一个用户(仅支持 VMess、VLESS、Trojan、Shadowsocks(v1.3.0+));
- 在一个入站代理中删除一个用户(仅支持 VMess、VLESS、Trojan、Shadowsocks(v1.3.0+));
### LoggerService
支持对内置 Logger 的重启,可配合 logrotate 进行一些对日志文件的操作。
### StatsService
内置的数据统计服务,详见 [统计信息](./stats)。
+150
View File
@@ -0,0 +1,150 @@
# 内置DNS服务器
## DNS 服务器
如果为 Xray 配置了 DNS 服务器模块,主要有两大用途:
- 在路由阶段, 解析域名为 IP, 并且根据域名解析得到的 IP 进行规则匹配以分流. 是否解析域名及分流和路由配置模块中"domainStrategy"的值有关, 只有在设置以下两种值时,才会使用内置 DNS 服务器进行 DNS 查询:
- "IPIfNonMatch", 请求一个域名时,进行路由里面的 domain 进行匹配,若无法匹配到结果,则对这个域名使用内置 DNS 服务器进行 DNS 查询,并且使用查询返回的 IP 地址再重新进行 IP 路由匹配。
- "IPOnDemand", 当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配。
- 解析目标地址进行连接。
- 如 在 `freedom` 协议的 `outbound` 中,将`domainStrategy` 设置为 `UseIP`, 由此 outbound 发出的请求, 会先将域名通过内置服务器解析成 IP, 然后进行连接
::: tip TIP 1
内置 DNS 服务器所发出的 DNS 查询请求,会自动根据路由配置进行转发。
:::
::: tip TIP 2
只支持最基本的 IP 查询(A 和 AAAA 记录)。
:::
## DNS 处理流程
DNS 服务器配置模块可以配置多个DNS服务器, 并且指定优先匹配列表.
1. 查询的域名与某个 DNS 服务器指定的域名列表匹配时,Xray 会优先使用这个 DNS 服务器进行查询
2. 无匹配时, 按从上往下的顺序进行查询
3. 只返回匹配 expectIPs 的 IP 列表。
DNS 服务器的处理流程示意图如下:
![](./dns_flow.png?classes=border,shadow)
## DnsObject
`DnsObject` 对应配置文件的 `dns` 项。
```json
{
"dns": {
"hosts": {
"baidu.com": "127.0.0.1"
},
"servers": [
"8.8.8.8",
"8.8.4.4",
{
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
"expectIPs": ["geoip:cn"]
},
"localhost"
],
"clientIp": "1.2.3.4",
"tag": "dns_inbound"
}
}
```
>`hosts`: map{string: address}
静态 IP 列表,其值为一系列的 "域名": "地址"。其中地址可以是 IP 或者域名。在解析域名时,如果域名匹配这个列表中的某一项:
- 当该项的地址为 IP 时,则解析结果为该项的 IP
- 当该项的地址为域名时,会使用此域名进行 IP 解析,而不使用原始域名。
域名的格式有以下几种形式:
- 纯字符串:当此字符串完整匹配目标域名时,该规则生效。例如 "xray.com" 匹配"xray.com" 但不匹配"www.xray.com"。
- 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.\*\\\\.com$" 匹配"www.google.com"或 "fonts.googleapis.com",但不匹配 "google.com"。
- 子域名 (推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 “domain:xray.com” 匹配"www.xray.com"、“xray.com”,但不匹配 “wxray.com”。
- 子串:由 `"keyword:"` 开始,余下部分是一个字符串。当此字符串匹配目标域名中任意部分,该规则生效。比如 "keyword:sina.com" 可以匹配"sina.com"、"sina.com.cn" 和"www.sina.com",但不匹配 "sina.cn"。
- 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](../routing/#预定义域名列表)。
>`servers`: \[string | [ServerObject](#serverobject) \]
一个 DNS 服务器列表,支持的类型有两种:DNS 地址(字符串形式)和 [ServerObject](#serverobject) 。
当它的值是一个 DNS IP 地址时,如 `"8.8.8.8"`,Xray 会使用此地址的 53 端口进行 DNS 查询。
当值为 `"localhost"` 时,表示使用本机预设的 DNS 配置。
当值是 `"https://host:port/dns-query"` 的形式,如 `"https://dns.google/dns-query"`,Xray 会使用 `DNS over HTTPS` (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 `https://1.1.1.1/dns-query`。也可使用非标准端口和路径,如 `"https://a.b.c.d:8443/my-dns-query"`
当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`,Xray 会使用 `DOH本地模式` 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。
::: tip TIP 1
当使用 `localhost` 时,本机的 DNS 请求不受 Xray 控制,需要额外的配置才可以使 DNS 请求由 Xray 转发。
:::
::: tip TIP 2
不同规则初始化得到的 DNS 客户端会在 Xray 启动日志中以 `info` 级别体现,比如 `local DOH`、`remote DOH` 和 `udp` 等模式。
:::
>`clientIp`: string
用于 DNS 查询时通知服务器以指定IP位置。不能是私有地址。
>`tag`: string
由内置 DNS 发出的查询流量,除 `localhost` 和 `DOHL_` 模式外,都可以用此标识在路由使用 `inboundTag` 进行匹配。
### ServerObject
```json
{
"address": "1.2.3.4",
"port": 5353,
"domains": [
"domain:xray.com"
],
"expectIPs": [
"geoip:cn"
]
}
```
>`address`: address
一个 DNS 服务器列表,支持的类型有两种:DNS 地址(字符串形式)和 ServerObject 。
当它的值是一个 DNS IP 地址时,如 "8.8.8.8",Xray 会使用此地址的 53 端口进行 DNS 查询。
当值为 "localhost" 时,表示使用本机预设的 DNS 配置。
当值是 "https://host:port/dns-query" 的形式,如 "https://dns.google/dns-query",Xray 会使用 DNS over HTTPS (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 https://1.1.1.1/dns-query。也可使用非标准端口和路径,如 "https://a.b.c.d:8443/my-dns-query"
当值是 "https+local://host:port/dns-query" 的形式,如 "https+local://dns.google/dns-query",Xray 会使用 DOH本地模式 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。
>`port`: number
DNS 服务器端口,如 `53`。此项缺省时默认为 `53`。当使用 DOH 模式该项无效,非标端口应在 URL 中指定。
>`domains`: \[string\]
一个域名列表,此列表包含的域名,将优先使用此服务器进行查询。域名格式和 [路由配置](../routing#ruleobject) 中相同。
>`expectIPs`:\[string\]
一个 IP 范围列表,格式和 [路由配置](../routing#ruleobject) 中相同。
当配置此项时,Xray DNS 会对返回的 IP 的进行校验,只返回包含 expectIPs 列表中的地址。
如果未配置此项,会原样返回 IP 地址。
Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

+133
View File
@@ -0,0 +1,133 @@
# 入站代理
入站连接用于接收发来的数据,可用的协议请见[inbound 可用协议列表](../../inbound-protocols)。
## InboundObject
`InboundObject` 对应配置文件中 `inbounds` 项的一个子元素。
```json
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 1080,
"protocol": "协议名称",
"settings": {},
"streamSettings": {},
"tag": "标识",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
}
]
}
```
>`listen`: address
监听地址,IP 地址或 Unix domain socket,默认值为 `"0.0.0.0"`,表示接收所有网卡上的连接.
可以指定一个系统可用的 IP 地址。
支持填写 Unix domain socket,格式为绝对路径,形如 `"/dev/shm/domain.socket"`,可在开头加 `"@"` 代表 [abstract](https://www.man7.org/linux/man-pages/man7/unix.7.html),`"@@"` 则代表带 padding 的 abstract。
填写 Unix domain socket 时,`port` 和 `allocate` 将被忽略,协议目前可选 VLESS、VMess、Trojan,传输方式可选 TCP、WebSocket、HTTP/2。
>`port`: number | "env:variable" | string
端口。接受的格式如下:
- 整型数值:实际的端口号。
- 环境变量:以 `"env:"` 开头,后面是一个环境变量的名称,如 `"env:PORT"`。Xray 会以字符串形式解析这个环境变量。
- 字符串:可以是一个数值类型的字符串,如 `"1234"`;或者一个数值范围,如 `"5-10"` 表示端口 5 到端口 10,这 6 个端口。
当只有一个端口时,Xray 会在此端口监听入站连接。当指定了一个端口范围时,取决于 `allocate` 设置。
>`protocol`: string
连接协议名称,可选的协议类型见[inbound 可用协议列表](../../inbound-protocols)。
>`settings`: InboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的 `InboundConfigurationObject`。
>`streamSettings`: [StreamSettingsObject](../transport#streamsettingsobject)
底层传输方式(transport)是当前 Xray 节点和其它节点对接的方式
>`tag`: string
此入站连接的标识,用于在其它的配置中定位此连接。
::: danger
当其不为空时,其值必须在所有 `tag` 中 **唯一**。
:::
>`sniffing`: [SniffingObject](#sniffingobject)
流量探测主要作用于在透明代理等用途.
比如一个典型流程如下:
1. 如有一个设备上网,去访问abc.com,首先设备通过DNS查询得到abc.com的IP是1.2.3.4,然后设备会向1.2.3.4去发起连接.
2. 如果不设置嗅探,Xray收到的连接请求是1.2.3.4,并不能用于域名规则的路由分流.
3. 当设置了sniffing中的enable为true,Xray处理此连接的流量时,会从流量的数据中,嗅探出域名,即abc.com
4. Xray会把1.2.3.4重置为abc.com.路由就可以根据域名去进行路由的域名规则的分流
因为变成了一个向abc.com请求的连接, 就可以做更多的事情, 除了路由域名规则分流, 还能重新做DNS解析等其他工作.
当设置了sniffing中的enable为true, 还能嗅探出bittorrent类型的流量, 然后可以在路由中配置"protocol"项来设置规则处理BT流量, 比如服务端用来拦截BT流量, 或客户端固定转发BT流量到某个VPS去等.
>`allocate`: [AllocateObject](#allocateobject)
当设置了多个port时, 端口分配的具体设置
### SniffingObject
```json
{
"enabled": true,
"destOverride": ["http", "tls", "fakedns"],
"metadataOnly": false
}
```
>`enabled`: true | false
是否开启流量探测。
>`destOverride`: \["http" | "tls" | "fakedns" \]
当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。
>`metadataOnly`: true | false
当启用时,将仅使用连接的元数据嗅探目标地址。此时,`http` 与 `tls` 将不能使用。
### AllocateObject
```json
{
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
```
>`strategy`: "always" | "random"
端口分配策略。
- `"always"` 表示总是分配所有已指定的端口,`port` 中指定了多少个端口,Xray 就会监听这些端口。
- `"random"` 表示随机开放端口,每隔 `refresh` 分钟在 `port` 范围中随机选取 `concurrency` 个端口来监听。
>`refresh`: number
随机端口刷新间隔,单位为分钟。最小值为 `2`,建议值为 `5`。这个属性仅当 `strategy` 设置为 `"random"` 时有效。
>`concurrency`: number
随机端口数量。最小值为 `1`,最大值为 `port` 范围的三分之一。建议值为 `3`。
+48
View File
@@ -0,0 +1,48 @@
# 日志配置
日志配置,控制 Xray输出日志的方式.
Xray 有两种日志, 访问日志和错误日志, 你可以分别配置两种日志的输出方式.
## LogObject
LogObject 对应配置文件的 `log` 项。
```json
{
"log": {
"access": "文件地址",
"error": "文件地址",
"loglevel": "warning",
"dnsLog": false
}
}
```
> `access`: string
访问日志的文件地址,其值是一个合法的文件地址,如`"/var/log/Xray/access.log"`(Linux)或者`"C:\\Temp\\Xray\\_access.log"`(Windows)。当此项不指定或为空值时,表示将日志输出至 stdout。
- 特殊值`none`,即关闭 access log。
> `error`: string
错误日志的文件地址,其值是一个合法的文件地址,如`"/var/log/Xray/error.log"`(Linux)或者`"C:\\Temp\\Xray\\_error.log"`(Windows)。当此项不指定或为空值时,表示将日志输出至 stdout。
- 特殊值`none`,即关闭 error log。
> `loglevel`: "debug" | "info" | "warning" | "error" | "none"
error 日志的级别, 指示 error 日志需要记录的信息.
默认值为 `"warning"`。
- `"debug"`:调试程序时用到的输出信息。同时包含所有 `"info"` 内容。
- `"info"`:运行时的状态信息等,不影响正常使用。同时包含所有 `"warning"` 内容。
- `"warning"`:发生了一些并不影响正常运行的问题时输出的信息,但有可能影响用户的体验。同时包含所有 `"error"` 内容。
- `"error"`:Xray 遇到了无法正常运行的问题,需要立即解决。
- `"none"`:不记录任何内容。
> `dnsLog`: bool
是否启用 DNS 查询日志,例如:
`DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms`
+108
View File
@@ -0,0 +1,108 @@
# 出站代理
出站连接用于发送数据,可用的协议请见[outbound 可用协议列表](../../outbound-protocols)。
## OutboundObject
`OutboundObject` 对应配置文件中 `outbounds` 项的一个子元素。
::: tip
列表中的第一个元素作为主outbound。当路由匹配不存在或没有匹配成功时,流量由主outbound发出。
:::
```json
{
"outbounds": [
{
"sendThrough": "0.0.0.0",
"protocol": "协议名称",
"settings": {},
"tag": "标识",
"streamSettings": {},
"proxySettings": {
"tag": "another-outbound-tag"
},
"mux": {}
}
]
}
```
>`sendThrough`: address
用于发送数据的 IP 地址,当主机有多个 IP 地址时有效,默认值为 `"0.0.0.0"`。
>`protocol`: string
连接协议名称,可选的协议类型见[outbound 可用协议列表](../../outbound-protocols)。
>`settings`: OutboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的 `OutboundConfigurationObject`。
>`tag`: string
此出站连接的标识,用于在其它的配置中定位此连接。
::: danger
当其不为空时,其值必须在所有 `tag` 中 **唯一**。
:::
>`streamSettings`: [StreamSettingsObject](../../base/transport#streamsettingsobject)
底层传输方式(transport)是当前 Xray 节点和其它节点对接的方式
>`proxySettings`: [ProxySettingsObject](#proxysettingsobject)
出站代理配置。当出站代理生效时,此outbound的 `streamSettings` 将不起作用。
>`mux`: [MuxObject](#muxobject)
Mux 相关的具体配置。
### ProxySettingsObject
```json
{
"tag": "another-outbound-tag"
}
```
>`tag`: string
当指定另一个outbound的标识时,此outbound发出的数据,将被转发至所指定的outbound发出。
::: danger
这种转发方式**不经过**底层传输方式。如果需要使用支持底层传输方式的转发,请使用 [SockOpt.dialerProxy](../transport/#sockoptobject)。
:::
::: danger
此选项与 SockOpt.dialerProxy 不兼容
:::
::: tip
兼容 v2fly/v2ray-core 的配置 [transportLayer](https://www.v2fly.org/config/outbounds.html#proxysettingsobject)
:::
### MuxObject
Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细节详见 [Mux.Cool](../../../develop/protocols/muxcool)。Mux 是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频、下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配。
`MuxObject` 对应 `OutboundObject` 中的 `mux` 项。
```json
{
"enabled": false,
"concurrency": 8
}
```
>`enabled`: true | false
是否启用 Mux 转发请求,默认值 `false`。
>`concurrency`: number
最大并发连接数。最小值 `1`,最大值 `1024`,默认值 `8`。
这个数值表示了一个 TCP 连接上最多承载的 Mux 连接数量。比如设置 `concurrency=8` 时,当客户端发出了 8 个 TCP 请求,Xray 只会发出一条实际的 TCP 连接,客户端的 8 个请求全部由这个 TCP 连接传输。
::: tip
填负数时,如 `-1`,不加载 mux 模块。
:::
+125
View File
@@ -0,0 +1,125 @@
# 本地策略
本地策略,可以设置不同的用户等级和对应的策略设置,比如连接超时设置。Xray 处理的每一个连接都对应一个用户,按照用户的等级(level)应用不同的策略。
## PolicyObject
`PolicyObject` 对应配置文件的 `policy` 项。
```json
{
"policy": {
"levels": {
"0": {
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5,
"statsUserUplink": false,
"statsUserDownlink": false,
"bufferSize": 4
}
},
"system": {
"statsInboundUplink": false,
"statsInboundDownlink": false,
"statsOutboundUplink": false,
"statsOutboundDownlink": false
}
}
}
```
>`level`: map{string: [LevelPolicyObject](#levelpolicyobject)}
一组键值对,每个键是一个字符串形式的数字(JSON 的要求),比如 `"0"`、`"1"` 等,双引号不能省略,此数字对应用户等级。每一个值是一个 [LevelPolicyObject](#levelpolicyobject).
::: tip
每个入站出站代理现在都可以设置用户等级,Xray 会根据实际的用户等级应用不同的本地策略。
:::
>`system`: [SystemPolicyObject](#systempolicyobject)
Xray系统级别的策略
### LevelPolicyObject
```json
{
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5,
"statsUserUplink": false,
"statsUserDownlink": false,
"bufferSize": 10240
}
```
>`handshake`: number
连接建立时的握手时间限制。单位为秒。默认值为 `4`。在入站代理处理一个新连接时,在握手阶段如果使用的时间超过这个时间,则中断该连接。
>`connIdle`: number
连接空闲的时间限制。单位为秒。默认值为 `300`。inbound/outbound处理一个连接时,如果在 `connIdle` 时间内,没有任何数据被传输(包括上行和下行数据),则中断该连接。
>`uplinkOnly`: number
当连接下行线路关闭后的时间限制。单位为秒。默认值为 `2`。当服务器(如远端网站)关闭下行连接时,出站代理会在等待 `uplinkOnly` 时间后中断连接。
>`downlinkOnly`: number
当连接上行线路关闭后的时间限制。单位为秒。默认值为 `5`。当客户端(如浏览器)关闭上行连接时,入站代理会在等待 `downlinkOnly` 时间后中断连接。
::: tip
在 HTTP 浏览的场景中,可以将 `uplinkOnly` 和 `downlinkOnly` 设为 `0`,以提高连接关闭的效率。
:::
>`statsUserUplink`: true | false
当值为 `true` 时,开启当前等级的所有用户的上行流量统计。
>`statsUserDownlink`: true | false
当值为 `true` 时,开启当前等级的所有用户的下行流量统计。
>`bufferSize`: number
每个连接的内部缓存大小。单位为 kB。当值为 `0` 时,内部缓存被禁用。
默认值:
* 在 ARM、MIPS、MIPSLE 平台上,默认值为 `0`。
* 在 ARM64、MIPS64、MIPS64LE 平台上,默认值为 `4`。
* 在其它平台上,默认值为 `512`。
::: tip
`bufferSize` 选项会覆盖 [环境变量](env.md#每个连接的缓存大小)中 `Xray.ray.buffer.size` 的设定。
:::
### SystemPolicyObject
```json
{
"statsInboundUplink": false,
"statsInboundDownlink": false,
"statsOutboundUplink": false,
"statsOutboundDownlink": false
}
```
>`statsInboundUplink`: true | false
当值为 `true` 时,开启所有入站代理的上行流量统计。
>`statsInboundDownlink`: true | false
当值为 `true` 时,开启所有入站代理的下行流量统计。
>`statsOutboundUplink`: true | false
当值为 `true` 时,开启所有出站代理的上行流量统计。
>`statsOutboundDownlink`: true | false
当值为 `true` 时,开启所有出站代理的下行流量统计。
+246
View File
@@ -0,0 +1,246 @@
# 反向代理
反向代理可以把服务器端的流量向客户端转发,即逆向流量转发。
反向代理的大致工作原理如下:
* 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP,无法在公网上直接访问。另有一台主机 B,它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。
* 在主机 A 中配置 Xray,称为`bridge`,在 B 中也配置 Xray,称为 `portal`。
* `bridge` 会向 `portal` 主动建立连接,此连接的目标地址可以自行设定。`portal` 会收到两种连接,一是由 `bridge` 发来的连接,二是公网用户发来的连接。`portal` 会自动将两类连接合并。于是 `bridge` 就可以收到公网流量了。
* `bridge` 在收到公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由的协作。
* `bridge` 会根据流量的大小进行动态的负载均衡。
::: tip
反向代理默认已开启 [Mux](/develop/protocols/muxcool/),请不要在其用到的outbound上再次开启 Mux。
:::
::: warning
反向代理功能尚处于测试阶段,可能会有一些问题。
:::
## ReverseObject
`ReverseObject` 对应配置文件的 `reverse` 项。
```json
{
"reverse": {
"bridges": [
{
"tag": "bridge",
"domain": "test.xray.com"
}
],
"portals": [
{
"tag": "portal",
"domain": "test.xray.com"
}
]
}
}
```
> `bridges`: \[[BridgeObject](#bridgeobject)\]
数组,每一项表示一个 `bridge`。每个 `bridge` 的配置是一个 [BridgeObject](#bridgeobject)。
> `portals`: \[[PortalObject](#portalobject)\]
数组,每一项表示一个 `portal`。每个 `portal` 的配置是一个 [PortalObject](#bridgeobject)。
### BridgeObject
```json
{
"tag": "bridge",
"domain": "test.xray.com"
}
```
> `tag`: string
所有由 `bridge` 发出的连接,都会带有这个标识。可以在 [路由配置](../routing) 中使用 `inboundTag` 进行识别。
> `domain`: string
指定一个域名,`bridge` 向 `portal` 建立的连接,都会使用这个域名进行发送。
这个域名只作为 `bridge` 和 `portal` 的通信用途,不必真实存在。
### PortalObject
```json
{
"tag": "portal",
"domain": "test.xray.com"
}
```
> `tag`: string
`portal` 的标识。在 [路由配置](../routing) 中使用 `outboundTag` 将流量转发到这个 `portal`。
> `domain`: string
一个域名。当 `portal` 接收到流量时,如果流量的目标域名是此域名,则 `portal` 认为当前连接上 `bridge` 发来的通信连接。而其它流量则会被当成需要转发的流量。`portal` 所做的工作就是把这两类连接进行识别并拼接。
::: tip
一个 Xray 既可以作为 `bridge`,也可以作为 `portal`,也可以同时两者,以适用于不同的场景需要。
:::
## 完整配置样例
::: tip
在运行过程中,建议先启用 `bridge`,再启用 `portal`。
:::
### bridge配置
`bridge` 通常需要两个outbound,一个用于连接 `portal`,另一个用于发送实际的流量。也就是说,你需要用路由区分两种流量。
反向代理配置:
```json
{
"bridges": [
{
"tag": "bridge",
"domain": "test.xray.com"
}
]
}
```
outbound:
```json
{
"tag": "out",
"protocol": "freedom",
"settings": {
"redirect": "127.0.0.1:80" // 将所有流量转发到网页服务器
}
},
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "portal 的 IP 地址",
"port": 1024,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
}
]
}
]
},
"tag": "interconn"
}
```
路由配置:
```json
"routing": {
"rules": [
{
"type": "field",
"inboundTag": [
"bridge"
],
"domain": [
"full:test.xray.com"
],
"outboundTag": "interconn"
},
{
"type": "field",
"inboundTag": [
"bridge"
],
"outboundTag": "out"
}
]
}
```
### portal配置
`portal` 通常需要两个inbound,一个用于接收 `bridge` 的连接,另一个用于接收实际的流量。同时你也需要用路由区分两种流量。
反向代理配置:
```json
{
"portals": [
{
"tag": "portal",
"domain": "test.xray.com" // 必须和 bridge 的配置一样
}
]
}
```
inbound:
```json
{
"tag": "external",
"port": 80, // 开放 80 端口,用于接收外部的 HTTP 访问
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1",
"port": 80,
"network": "tcp"
}
},
{
"port": 1024, // 用于接收 bridge 的连接
"tag": "interconn",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
}
]
}
}
```
路由配置:
```json
"routing": {
"rules": [
{
"type": "field",
"inboundTag": [
"external"
],
"outboundTag": "portal"
},
{
"type": "field",
"inboundTag": [
"interconn"
],
"outboundTag": "portal"
}
]
}
```
+229
View File
@@ -0,0 +1,229 @@
# 路由
路由功能模块可以将入站数据按不同规则由不同的出站连接发出,以达到按需代理的目的。
如常见用法是分流国内外流量,Xray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。
## RoutingObject
`RoutingObject` 对应配置文件的 `routing` 项。
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [],
"balancers": []
}
}
```
>`domainStrategy`: "AsIs" | "IPIfNonMatch" | "IPOnDemand"
域名解析策略,根据不同的设置使用不同的策略。
* `"AsIs"`:只使用域名进行路由选择。默认值。
* `"IPIfNonMatch"`:当域名没有匹配任何规则时,将域名解析成 IP(A 记录或 AAAA 记录)再次进行匹配;
* 当一个域名有多个 A 记录时,会尝试匹配所有的 A 记录,直到其中一个与某个规则匹配为止;
* 解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名;
* `"IPOnDemand"`:当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配;
>`rules`: \[[RuleObject](#ruleobject)\]
对应一个数组,数组中每一项是一个规则。
对于每一个连接,路由将根据这些规则依次进行判断,当一个规则生效时,即将这个连接转发至它所指定的 `outboundTag`或 `balancerTag`。
::: tip
当没有匹配到任何规则时,流量默认由第一个outbound发出。
:::
>`balancers`: \[ [BalancerObject](#balancerobject) \]
一个数组,数组中每一项是一个负载均衡器的配置。
当一个规则指向一个负载均衡器时,Xray 会通过此负载均衡器选出一个outbound, 然后由它转发流量。
### RuleObject
```json
{
"type": "field",
"domain": [
"baidu.com",
"qq.com",
"geosite:cn"
],
"ip": [
"0.0.0.0/8",
"10.0.0.0/8",
"fc00::/7",
"fe80::/10",
"geoip:cn"
],
"port": "53,443,1000-2000",
"sourcePort": "53,443,1000-2000",
"network": "tcp",
"source": [
"10.0.0.1"
],
"user": [
"love@xray.com"
],
"inboundTag": [
"tag-vmess"
],
"protocol": [
"http",
"tls",
"bittorrent"
],
"attrs": "attrs[':method'] == 'GET'",
"outboundTag": "direct",
"balancerTag": "balancer"
}
```
::: danger
当多个属性同时指定时,这些属性需要 **同时** 满足,才可以使当前规则生效。
:::
>`type`: "field"
目前只支持`"field"`这一个选项。
>`domain`: \[string\]
一个数组,数组每一项是一个域名的匹配。有以下几种形式:
* 纯字符串:当此字符串匹配目标域名中任意部分,该规则生效。比如 "sina.com" 可以匹配 "sina.com"、"sina.com.cn" 和"www.sina.com",但不匹配 "sina.cn"。
* 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.*\\\\.com$" 匹配"www.google.com"或 "fonts.googleapis.com",但不匹配 "google.com"。
* 子域名(推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 "domain:xray.com" 匹配"www.xray.com"、"xray.com",但不匹配 "wxray.com"。
* 完整匹配:由 `"full:"` 开始,余下部分是一个域名。当此域名完整匹配目标域名时,该规则生效。例如 "full:xray.com" 匹配 "xray.com" 但不匹配"www.xray.com"。
* 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](#预定义域名列表)。
* 从文件中加载域名:形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](../../env#资源文件路径) 中,文件格式与 `geosite.dat` 相同,标签必须在文件中存在。
::: tip
`"ext:geoip.dat:cn"` 等价于 `"geoip:cn"`
:::
>`ip`: \[string\]
一个数组,数组内每一项代表一个 IP 范围。当某一项匹配目标 IP 时,此规则生效。有以下几种形式:
* IP:形如 `"127.0.0.1"`。
* [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`。
* 从文件中加载 IP:形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](../../env#资源文件路径) 中,文件格式与 `geoip.dat` 相同标签必须在文件中存在。
>`port`:number | string
目标端口范围,有三种形式:
* `"a-b"`:a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间,当目标端口落在此范围内时,此规则生效。
* `a`:a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。
* 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"`。
>`sourcePort`:number | string
来源端口,有三种形式:
* `"a-b"`:a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间,当目标端口落在此范围内时,此规则生效。
* `a`:a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。
* 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"`。
>`network`: "tcp" | "udp" | "tcp,udp"
可选的值有 "tcp"、"udp" 或 "tcp,udp",当连接方式是指定的方式时,此规则生效。
>`source`: \[string\]
一个数组,数组内每一项代表一个 IP 范围,形式有 IP、CIDR、GeoIP 和从文件中加载 IP。当某一项匹配来源 IP 时,此规则生效。
>`user`: \[string\]
一个数组,数组内每一项是一个邮箱地址。当某一项匹配来源用户时,此规则生效。
>`inboundTag`: \[string\]
一个数组,数组内每一项是一个标识。当某一项匹配入站协议的标识时,此规则生效。
>`protocol`: \[ "http" | "tls" | "bittorrent" \]
一个数组,数组内每一项表示一种协议。当某一个协议匹配当前连接的协议类型时,此规则生效。
::: tip
必须开启入站代理中的 `sniffing` 选项, 才能嗅探出连接所使用的协议类型.
:::
>`attrs`: string
一段脚本,用于检测流量的属性值。当此脚本返回真值时,此规则生效。
脚本语言为 [Starlark](https://github.com/bazelbuild/starlark),它的语法是 Python 的子集。脚本接受一个全局变量 `attrs`,其中包含了流量相关的属性。
目前只有 http 入站代理会设置这一属性。
示例:
* 检测 HTTP GET:`"attrs[':method'] == 'GET'"`
* 检测 HTTP Path:`"attrs[':path'].startswith('/test')"`
* 检测 Content Type:`"attrs['accept'].index('text/html') >= 0"`
>`outboundTag`: string
对应一个outbound的标识。
>`balancerTag`: string
对应一个Balancer的标识。
::: tip
`balancerTag` 和 `outboundTag` 须二选一。当同时指定时,`outboundTag` 生效。
:::
### BalancerObject
负载均衡器配置。当一个负载均衡器生效时,它会从指定的outbound中,按配置选出一个最合适的outbound,进行流量转发。
```json
{
"tag": "balancer",
"selector": []
}
```
>`tag`: string
此负载均衡器的标识,用于匹配 `RuleObject` 中的 `balancerTag`。
>`selector`: \[ string \]
一个字符串数组,其中每一个字符串将用于和outbound标识的前缀匹配。在以下几个outbound标识中:`[ "a", "ab", "c", "ba" ]`,`"selector": ["a"]` 将匹配到 `[ "a", "ab" ]`。
如果匹配到多个outbound,负载均衡器目前会从中随机选出一个作为最终的outbound。
### 预定义域名列表
此列表预置于每一个 Xray 的安装包中,文件名为 `geosite.dat`。这个文件包含了一些常见的域名,使用方式:`geosite:filename`,如 `geosite:google` 表示对文件内符合 `google` 内包含的域名,进行路由筛选或 DNS 筛选。
常见的域名有:
* `category-ads`:包含了常见的广告域名。
* `category-ads-all`:包含了常见的广告域名,以及广告提供商的域名。
* `cn`:相当于 `geolocation-cn` 和 `tld-cn` 的合集。
* `apple`:包含了 Apple 旗下绝大部分域名。
* `google`:包含了 Google 旗下绝大部分域名。
* `microsoft`:包含了 Microsoft 旗下绝大部分域名。
* `facebook`:包含了 Facebook 旗下绝大部分域名。
* `twitter`:包含了 Twitter 旗下绝大部分域名。
* `telegram`:包含了 Telegram 旗下绝大部分域名。
* `geolocation-cn`:包含了常见的大陆站点域名。
* `geolocation-!cn`:包含了常见的非大陆站点域名,同时包含了 `tld-!cn`。
* `tld-cn`:包含了 CNNIC 管理的用于中国大陆的顶级域名,如以 `.cn`、`.中国` 结尾的域名。
* `tld-!cn`:包含了非中国大陆使用的顶级域名,如以 `.hk`(香港)、`.tw`(台湾)、`.jp`(日本)、`.sg`(新加坡)、`.us`(美国)`.ca`(加拿大)等结尾的域名。
+57
View File
@@ -0,0 +1,57 @@
# 统计信息
用于配置 Xray 流量数据的统计。
## StatsObject
`StatsObject` 对应配置文件的 `stats` 项。
```json
{
"stats": {}
}
```
目前统计信息不需要任何参数,只要 `StatsObject` 项存在,内部的统计即会开启。
开启了统计以后, 只需在 [Policy](../../base/policy) 中开启对应的项,就可以统计对应的数据。
## 获取统计信息
可以用 `xray api` 的相关命令获取统计信息.
目前已有的统计信息如下:
- 用户数据
- `user>>>[email]>>>traffic>>>uplink`
特定用户的上行流量,单位字节。
- `user>>>[email]>>>traffic>>>downlink`
特定用户的下行流量,单位字节。
::: tip
如果对应用户没有指定 Email,则不会开启统计。
:::
- 全局数据
- `inbound>>>[tag]>>>traffic>>>uplink`
特定inbound的上行流量,单位字节。
- `inbound>>>[tag]>>>traffic>>>downlink`
特定inbound的下行流量,单位字节。
- `outbound>>>[tag]>>>traffic>>>uplink`
特定outbound的上行流量,单位字节。
- `outbound>>>[tag]>>>traffic>>>downlink`
特定outbound的下行流量,单位字节。
+414
View File
@@ -0,0 +1,414 @@
# 传输方式
传输方式(transport)是当前 Xray 节点和其它节点对接的方式。
传输方式指定了稳定的数据传输的方式。通常来说,一个网络连接的两端需要有对称的传输方式。比如一端用了 WebSocket,那么另一个端也必须使用 WebSocket,否则无法建立连接。
传输方式(transport)配置有两部分:
1. 全局设置([TransportObject](#transportobject))
2. 指定inbound/outbound配置([StreamSettingsObject](#streamsettingsobject))。
指定inbound/outbound配置时,可以指定每个单独的inbound/outbound用怎样的方式传输。
通常来说客户端和服务器对应的inbound和outbound需要使用同样的传输方式。当inbound/outbound配置指定了一种传输方式,但没有填写其具体设置时,此传输方式会使用全局配置中的设置。
## TransportObject
`TransportObject` 对应配置文件的 `transport` 项。
```json
{
"transport": {
"tcpSettings": {},
"kcpSettings": {},
"wsSettings": {},
"httpSettings": {},
"quicSettings": {},
"dsSettings": {},
"grpcSettings": {}
}
}
```
> `tcpSettings`: [TcpObject](../../transports/tcp)
针对 TCP 连接的配置。
> `kcpSettings`: [KcpObject](../../transports/mkcp)
针对 mKCP 连接的配置。
> `wsSettings`: [WebSocketObject](../../transports/websocket)
针对 WebSocket 连接的配置。
> `httpSettings`: [HttpObject](../../transports/h2)
针对 HTTP/2 连接的配置。
> `quicSettings`: [QuicObject](../../transports/quic)
针对 QUIC 连接的配置。
> `grpcSettings`: [GRPCObject](../../transports/grpc)
针对 gRPC 连接的配置。
> `dsSettings`: [DomainSocketObject](../../transports/domainsocket)
针对 Domain Socket 连接的配置。
## StreamSettingsObject
`StreamSettingsObject` 对应inbound/outbound中的 `streamSettings` 项。每一个 inbound/outbound 都可以分别配置不同的传输配置,都可以设置 `streamSettings` 来进行一些传输的配置。
```json
{
"network": "tcp",
"security": "none",
"tlsSettings": {},
"xtlsSettings": {},
"tcpSettings": {},
"kcpSettings": {},
"wsSettings": {},
"httpSettings": {},
"quicSettings": {},
"dsSettings": {},
"grpcSettings": {},
"sockopt": {
"mark": 0,
"tcpFastOpen": false,
"tproxy": "off",
"domainStrategy": "AsIs",
"dialerProxy": ""
}
}
```
> `network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"
连接的数据流所使用的传输方式类型,默认值为 `"tcp"`
> `security`: "none" | "tls" | "xtls"
是否启用传输层加密,支持的选项有
- `"none"` 表示不加密(默认值)
- `"tls"` 表示使用 [TLS](https://en.wikipedia.org/wiki/base/transport_Layer_Security)。
- `"xtls"` 表示使用 [XTLS](../../xtls)。
> `tlsSettings`: [TLSObject](#tlsobject)
TLS 配置。TLS 由 Golang 提供,通常情况下TLS协商的结果为使用 TLS 1.3,不支持 DTLS。
> `xtlsSettings`: [XTLSObject](#tlsobject)
XTLS 配置。XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力.<br>
XTLS 与 TLS 有相同的安全性, 配置方式也和TLS一致. 点击此处查看[XTLS的技术细节剖析](../../xtls)
::: danger
TLS / XTLS 是目前最安全的传输加密方案, 且外部看来流量类型和正常上网具有一致性.<br>
启用 XTLS 并且配置合适的XTLS流控模式, 可以在保持和 TLS 相同的安全性的前提下, 性能达到数倍甚至十几倍的提升.<br>
当 `security` 的值从'tls'改为'xtls'时, 只需将`tlsSettings` 修改成为 `xtlsSettings`
:::
> `tcpSettings`: [TcpObject](../../transports/tcp)
当前连接的 TCP 配置,仅当此连接使用 TCP 时有效。配置内容与上面的全局配置相同。
> `kcpSettings`: [KcpObject](../../transports/mkcp)
当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。
> `wsSettings`: [WebSocketObject](../../transports/websocket)
当前连接的 WebSocket 配置,仅当此连接使用 WebSocket 时有效。配置内容与上面的全局配置相同。
> `httpSettings`: [HttpObject](../../transports/h2)
当前连接的 HTTP/2 配置,仅当此连接使用 HTTP/2 时有效。配置内容与上面的全局配置相同。
> `quicSettings`: [QUICObject](../../transports/quic)
当前连接的 QUIC 配置,仅当此连接使用 QUIC 时有效。配置内容与上面的全局配置相同。
> `grpcSettings`: [GRPCObject](../../transports/grpc)
当前连接的 gRPC 配置,仅当此连接使用 gRPC 时有效。配置内容与上面的全局配置相同。
> `dsSettings`: [DomainSocketObject](../../transports/domainsocket)
当前连接的 Domain socket 配置,仅当此连接使用 Domain socket 时有效。配置内容与上面的全局配置相同。
> `sockopt`: [SockoptObject](#sockoptobject)
透明代理相关的具体配置。
### TLSObject
```json
{
"serverName": "xray.com",
"allowInsecure": false,
"alpn": [
"h2",
"http/1.1"
],
"minVersion": "1.2",
"maxVersion": "1.3",
"preferServerCipherSuites": true,
"cipherSuites": "此处填写你需要的加密套件名称,每个套件名称之间用:进行分隔",
"certificates": [],
"disableSystemRoot": false,
"enableSessionResumption": false
}
```
> `serverName`: string
指定服务器端证书的域名,在连接由 IP 建立时有用。
当目标连接由域名指定时,比如在 Socks inbound接收到了域名,或者由 Sniffing 功能探测出了域名,这个域名会自动用于 `serverName`,无须手动配置。
> `alpn`: \[ string \]
一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为 `["h2", "http/1.1"]`。
> `minVersion`: \[ string \]
minVersion为可接受的最小SSL/TLS版本。
> `maxVersion`: \[ string \]
maxVersion为可接受的最大SSL/TLS版本。
> `preferServerCipherSuites`: true | false
指示服务器选择客户端最喜欢的密码套件 或 服务器最优选的密码套件。
如果为true则为使用服务器的最优选的密码套件
> `cipherSuites`: \[ string \]
CipherSuites用于配置受支持的密码套件列表, 每个套件名称之间用:进行分隔.
你可以在[这里](https://golang.org/src/crypto/tls/cipher_suites.go#L500)或[这里](https://golang.org/src/crypto/tls/cipher_suites.go#L44)找到golang加密套件的名词和说明
::: danger
以上两项配置为非必要选项,正常情况下不影响安全性
在未配置的情况下golang根据设备自动选择.
若不熟悉, 请勿配置此选项, 填写不当引起的问题自行负责
:::
> `allowInsecure`: true | false
是否允许不安全连接(仅用于客户端)。默认值为 `false`。
当值为 `true` 时,Xray 不会检查远端主机所提供的 TLS 证书的有效性。
::: danger
出于安全性考虑,这个选项不应该在实际场景中选择true,否则可能遭受中间人攻击。
:::
> `disableSystemRoot`: true | false
是否禁用操作系统自带的 CA 证书。默认值为 `false`。
当值为 `true` 时,Xray 只会使用 `certificates` 中指定的证书进行 TLS 握手。当值为 `false` 时,Xray 只会使用操作系统自带的 CA 证书进行 TLS 握手。
> `enableSessionResumption`: true | false
此参数的设置为false时, ClientHello 里没有 session_ticket 这个扩展。
通常来讲 go 语言程序的 ClientHello 里并没有用到这个扩展, 因此建议保持默认值。
默认值为 `false`。
> `certificates`: \[ [CertificateObject](#certificateobject) \]
证书列表,其中每一项表示一个证书(建议 fullchain)。
::: tip
如果要在 ssllibs 或者 myssl 获得 A/A+ 等级的评价, 请参考[这里](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
:::
#### CertificateObject
```json
{
"ocspStapling": 3600,
"usage": "encipherment",
"certificateFile": "/path/to/certificate.crt",
"keyFile": "/path/to/key.key",
"certificate": [
"--BEGIN CERTIFICATE--",
"MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
"ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
"DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
"3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
"OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
"pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
"OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
"noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
"A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
"MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
"7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
"9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
"6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
"r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
"d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
"--END CERTIFICATE--"
],
"key": [
"--BEGIN RSA PRIVATE KEY--",
"MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
"bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
"GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
"jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
"itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
"IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
"qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
"C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
"/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
"aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
"/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
"bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
"8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
"pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
"L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
"3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
"az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
"gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
"TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
"eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
"64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
"8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
"GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
"ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
"cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
"--END RSA PRIVATE KEY--"
]
}
```
> `ocspStapling`: number
ocspStapling 检查更新时间间隔。 单位:秒
> `usage`: "encipherment" | "verify" | "issue"
证书用途,默认值为 `"encipherment"`。
* `"encipherment"`:证书用于 TLS 认证和加密。
* `"verify"`:证书用于验证远端 TLS 的证书。当使用此项时,当前证书必须为 CA 证书。
* `"issue"`:证书用于签发其它证书。当使用此项时,当前证书必须为 CA 证书。
::: tip TIP 1
在 Windows 平台上可以将自签名的 CA 证书安装到系统中,即可验证远端 TLS 的证书。
:::
::: tip TIP 2
当有新的客户端请求时,假设所指定的 `serverName` 为 `"xray.com"`,Xray 会先从证书列表中寻找可用于 `"xray.com"` 的证书,如果没有找到,则使用任一 `usage` 为 `"issue"` 的证书签发一个适用于 `"xray.com"` 的证书,有效期为一小时。并将新的证书加入证书列表,以供后续使用。
:::
::: tip TIP 3
当 `certificateFile` 和 `certificate` 同时指定时,Xray 优先使用 `certificateFile`。`keyFile` 和 `key` 也一样。
:::
::: tip TIP 4
当 `usage` 为 `"verify"` 时,`keyFile` 和 `key` 可均为空。
:::
::: tip TIP 5
使用 `xray tls cert` 可以生成自签名的 CA 证书。
:::
::: tip TIP 6
如已经拥有一个域名, 可以使用工具便捷的获取免费第三方证书,如[acme.sh](https://github.com/acmesh-official/acme.sh)
:::
> `certificateFile`: string
证书文件路径,如使用 OpenSSL 生成,后缀名为 .crt。
> `certificate`: \[ string \]
一个字符串数组,表示证书内容,格式如样例所示。`certificate` 和 `certificateFile` 二者选一。
> `keyFile`: string
密钥文件路径,如使用 OpenSSL 生成,后缀名为 .key。目前暂不支持需要密码的 key 文件。
> `key`: \[ string \]
一个字符串数组,表示密钥内容,格式如样例如示。`key` 和 `keyFile` 二者选一。
### SockoptObject
```json
{
"mark": 0,
"tcpFastOpen": false,
"tproxy": "off",
"domainStrategy": "AsIs",
"dialerProxy": ""
}
```
> `mark`: number
一个整数。当其值非零时,在ountbound连接以此数值上标记 SO_MARK。
* 仅适用于 Linux 系统。
* 需要 CAP_NET_ADMIN 权限。
> `tcpFastOpen`: true | false
是否启用 [TCP Fast Open](https://zh.wikipedia.org/wiki/TCP%E5%BF%AB%E9%80%9F%E6%89%93%E5%BC%80)。
当其值为 `true` 时,强制开启 TFO;当其值为 `false` 时,强制关闭 TFO;当此项不存在时,使用系统默认设置。
可用于inbound/ountbound。
* 仅在以下版本(或更新版本)的操作系统中可用:
* Windows 10 (1604)
* Mac OS 10.11 / iOS 9
* Linux 3.16:系统已默认开启,无需配置。
> `tproxy`: "redirect" | "tproxy" | "off"
是否开启透明代理(仅适用于 Linux)。
* `"redirect"`:使用 Redirect 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。
* `"tproxy"`:使用 TProxy 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。
* `"off"`:关闭透明代理。
透明代理需要 Root 或 CAP\_NET\_ADMIN 权限。
::: danger
当 [Dokodemo-door](../../inbound-protocols/dokodemo) 中指定了 `followRedirect`为`true`,且 Sockopt设置中的`tproxy` 为空时,Sockopt设置中的`tproxy` 的值会被设为 `"redirect"`。
:::
> `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6"
在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray 控制。这导致了在 [非标准Linux环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此,Xray 1.3.1 为 Sockopt 引入了 Freedom 中的 domainStrategy,解决了此问题。
在目标地址为域名时, 配置相应的值, SysteDailer 的行为模式如下:
- `"AsIs"`: 通过系统DNS服务器解析获取IP, 向此域名发出连接。
- `"UseIP"`、`"UseIPv4"` 和 `"UseIPv6"`: Xray 使用[内置 DNS 服务器](../dns)解析获取IP, 向此域名发出连接。
默认值为 `"AsIs"`。
::: danger
如果启用了此功能,将有可能导致通过 `代理服务器` 代理 `解析代理服务器IP的查询` 的死循环。因此,**不建议** 经验不足的用户擅自使用此功能。
:::
> `dialerProxy`: ""
一个出站代理的标识。当值不为空时,将使用指定的outbound发出连接。
此选项可用于支持底层传输方式的链式转发。
::: danger
此选项与 PorxySettingsObject.Tag 不兼容
:::