Add: config (wip)

pull/2/head
JimhHan 2021-03-15 23:59:11 +08:00
parent 42a4e8a05b
commit 2211b91c85
No known key found for this signature in database
GPG Key ID: 48D5D7CF95157AC5
49 changed files with 4365 additions and 12 deletions

View File

@ -11,18 +11,19 @@ module.exports = {
}
},
themeConfig: {
displayAllHeaders: true,
smoothScroll: true,
repo: 'xtls/xray-core',
repoLabel: '查看源码',
docsRepo: 'xtls/xtls.github.io',
docsRepo: 'xtls/Xray-docs-next',
docsBranch: 'main',
editLinks: true,
editLinkText: '帮助我们改善此页面!',
nav: [
{ text: '首页', link: '/' },
{ text: '大史记', link: '/about/news' },
{ text: '经典文档', link: 'https://xtls.github.io' },
{ text: '下载核心', link: 'https://github.com/XTLS/Xray-core/releases' },
{ text: '配置指南', link: '/config/' },
{ text: '开发指南', link: '/development/' },
{ text: '使用指南', link: '/usage/' },
{
text: '多语言',
ariaLabel: 'Language Menu',
@ -33,6 +34,22 @@ module.exports = {
},
],
sidebar: {
'/config/': [
{
title: '示例配置',
collapsable: false,
children: [
'examples/vless',
'examples/xtls',
'examples/fallback',
'examples/env',
'examples/multiple'
]
},
],
'/': 'auto',
}
},
markdown: {
toc: {

View File

@ -48,7 +48,7 @@ footer: Licensed under CC-BY-SA 4.0 | Copyleft 2020-Present Project X Community
> “配置兼容,整体更好”
- Xray-flutter 是一个优雅的跨平台图形界面工具. <Badge text="WIP" type="warning"/>
- Xray-flutter 是一个优雅的跨平台图形界面工具. <Badge text="WIP" type="warning"/>
### 我们是谁?

View File

@ -47,7 +47,7 @@ sidebar: auto
## 2021.01.25
- 全互联网最好最详细的秘籍入门篇同学们练熟了吗? 🍉老师开始连载[秘籍第一层](../../documents/level-1/)咯...
- [英文版文档网站](/en)逐渐增加内容ing, 感谢各位大佬的辛苦付出~!
- [英文版文档网站](../en)逐渐增加内容ing, 感谢各位大佬的辛苦付出~!

77
docs/config/README.md Normal file
View File

@ -0,0 +1,77 @@
---
title: 配置文件
lang: zh-CN
---
> **这个章节将告诉您所有的 Xray 配置细节,掌握这些内容,在您手中 Xray 将发挥更大威力.**
## 概述
Xray 的配置文件为 json 格式, 客户端和服务端的配置格式没有区别, 只是实际的配置内容不一样。
形式如下:
```json
{
"log": {},
"api": {},
"dns": {},
"routing": {},
"policy": {},
"inbounds": [],
"outbounds": [],
"transport": {},
"stats": {},
"reverse": {},
"fakedns":{}
}
```
::: warning
如果你刚接触 Xray, 您可以先点击查看[快速入门中的配置运行](../guide/install.md), 学习最基本的配置方式, 然后查看本章节内容以掌握所有 Xray 的配置方式.
:::
## 基础配置模块
> log:[LogObject](./log)
日志配置,控制 Xray输出日志的方式.
> api:[ApiObject](./api)
提供了一些API接口供远程调用。
> dns: [DnsObject](./dns)
内置的 DNS 服务器. 如果没有配置此项,则使用系统的 DNS 设置。
> routing: [RoutingObject](./routing)
路由功能。可以设置规则分流数据从不同的outbound发出.
> policy: [PolicyObject](./base/policy)
本地策略,可以设置不同的用户等级和对应的策略设置。
> inbounds: \[ [InboundObject](./inbounds) \]
一个数组,每个元素是一个入站连接配置。
> outbounds: \[ [OutboundObject](./outbounds) \]
一个数组,每个元素是一个出站连接配置。
> transport: [TransportObject](./base/transport)
用于配置 Xray 其它服务器建立和使用网络连接的方式。
> stats: [StatsObject](./stats)
用于配置流量数据的统计。
> reverse: [ReverseObject](./reverse)
反向代理。可以把服务器端的流量向客户端转发,即逆向流量转发
> fakedns: [FakeDnsObject](./fakedns)
FakeDNS. 可配合透明代理使用,以获取实际域名。

96
docs/config/base/api.md Normal file
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、Shadowsocksv1.3.0+
- 在一个入站代理中删除一个用户(仅支持 VMess、VLESS、Trojan、Shadowsocksv1.3.0+
### LoggerService
支持对内置 Logger 的重启,可配合 logrotate 进行一些对日志文件的操作。
### StatsService
内置的数据统计服务,详见 [统计信息](./stats)。

150
docs/config/base/dns.md Normal file
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

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
docs/config/base/log.md Normal file
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`

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
docs/config/base/policy.md Normal file
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
docs/config/base/reverse.md Normal file
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
docs/config/base/routing.md Normal file
View File

@ -0,0 +1,229 @@
# 路由
路由功能模块可以将入站数据按不同规则由不同的出站连接发出,以达到按需代理的目的。
如常见用法是分流国内外流量Xray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。
## RoutingObject
`RoutingObject` 对应配置文件的 `routing` 项。
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [],
"balancers": []
}
}
```
>`domainStrategy`: "AsIs" | "IPIfNonMatch" | "IPOnDemand"
域名解析策略,根据不同的设置使用不同的策略。
* `"AsIs"`:只使用域名进行路由选择。默认值。
* `"IPIfNonMatch"`:当域名没有匹配任何规则时,将域名解析成 IPA 记录或 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
docs/config/base/stats.md Normal file
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的下行流量单位字节。

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 不兼容
:::

View File

@ -0,0 +1,49 @@
# 环境变量
Xray 提供以下环境变量以供修改 Xray 的一些底层配置。
## XTLS 信息显示
### VLESS
- 名称:`xray.vless.xtls.show` 或 `XRAY_VLESS_XTLS_SHOW`
- 默认值:`""`。
使用 VLESS 协议时,设置此环境变量为 true 时, 会在终端或日志中输出 XTLS 的相关信息.
::: tip
可打开此环境变量并根据是否有输出 XTLS 相关信息, 来确定 XTLS 是否成功被应用.
:::
### TROJAN
- 名称:`xray.trojan.xtls.show` 或 `XRAY_TROJAN_XTLS_SHOW`
- 默认值:`""`。
使用 trojan 协议时, 设置此环境变量为 true 时, 会在终端或日志中输出 XTLS 的相关信息.
::: tip
可打开此环境变量并根据是否有输出 XTLS 相关信息, 来确定 XTLS 是否成功被应用.
:::
## 资源文件路径
- 名称:`xray.location.asset` 或 `XRAY_LOCATION_ASSET`
- 默认值:和 Xray 文件同路径。
这个环境变量指定了一个文件夹位置,这个文件夹应当包含 geoip.dat 和 geosite.dat 文件。
## 配置文件位置
- 名称:`xray.location.config` 或 `XRAY_LOCATION_CONFIG`
- 默认值:和 Xray 文件同路径。
这个环境变量指定了一个文件夹位置,这个文件夹应当包含 config.json 文件。
## 多配置目录
- 名称:`xray.location.confdir` 或 `XRAY_LOCATION_CONFDIR`
- 默认值:`""`。
这个目录内的 `.json` 文件会按文件名顺序读取,作为多配置选项。

View File

@ -0,0 +1,104 @@
# Fallback 回落
> **Fallback 是 Xray 的最强大功能之一, 可有效防止主动探测, 自由配置常用端口多服务共享**
fallback 为 Xray 提供了高强度的防主动探测性, 并且具有独创的首包回落机制.
fallback 也可以将不同类型的流量根据 path 进行分流, 从而实现一个端口, 多种服务共享.
目前您可以在使用 VLESS 或者 trojan 协议时, 通过配置 fallbacks 来使用回落这一特性, 并且创造出非常丰富的组合玩法.
## fallbacks 配置
```json
"fallbacks": [
{
"dest": 80
}
]
```
> `fallbacks`: \[ [FallbackObject](#fallbackobject) \]
一个数组,包含一系列强大的回落分流配置。
### FallbackObject
```json
{
"name": "",
"alpn": "",
"path": "",
"dest": 80,
"xver": 0
}
```
**`fallbacks` 是一个数组,这里是其中一个子元素的配置说明。**
`fallbacks` 项是可选的,只能用于 TCP+TLS 传输组合
- 该项有子元素时,[Inbound TLS](../base/transport/#tlsobject) 需设置 `"alpn":["http/1.1"]`。\*\*
通常,你需要先设置一组 `alpn``path` 均省略或为空的默认回落,然后再按需配置其它分流。
VLESS 会把 TLS 解密后首包长度 < 18 或协议版本无效、身份认证失败的流量转发到 `dest` 指定的地址。
其它传输组合必须删掉 `fallbacks` 项或所有子元素,此时也不会开启 FallbackVLESS 会等待读够所需长度,协议版本无效或身份认证失败时,将直接断开连接。
> `name`: string
尝试匹配 TLS SNI(Server Name Indication),空为任意,默认为 ""
> `alpn`: string
尝试匹配 TLS ALPN 协商结果,空为任意,默认为 ""
有需要时VLESS 才会尝试读取 TLS ALPN 协商结果,若成功,输出 info `realAlpn =` 到日志。
用途:解决了 Nginx 的 h2c 服务不能同时兼容 http/1.1 的问题Nginx 需要写两行 listen分别用于 1.1 和 h2c。
注意fallbacks alpn 存在 `"h2"` 时,[Inbound TLS](../base/transport/#tlsobject) 需设置 `"alpn":["h2","http/1.1"]`,以支持 h2 访问。
::: tip
Fallback 内设置的 "alpn" 是匹配实际协商出的 ALPN而 Inbound TLS 设置的 "alpn" 是握手时可选的 ALPN 列表,两者含义不同。
:::
> `path`: string
尝试匹配首包 HTTP PATH空为任意默认为空非空则必须以 `"/"` 开头,不支持 h2c。
智能有需要时VLESS 才会尝试看一眼 PATH不超过 55 个字节;最快算法,并不完整解析 HTTP若成功输出 info `realPath =` 到日志。
用途:分流其它 inbound 的 WebSocket 流量或 HTTP 伪装流量,没有多余处理、纯粹转发流量,理论性能比 Nginx 更强。
注意:**fallbacks 所在入站本身必须是 TCP+TLS**,这是分流至其它 WS 入站用的,被分流的入站则无需配置 TLS。
> `dest`: string | number
决定 TLS 解密后 TCP 流量的去向,目前支持两类地址:(该项必填,否则无法启动)
1. TCP格式为 `"addr:port"`,其中 addr 支持 IPv4、域名、IPv6若填写域名也将直接发起 TCP 连接(而不走内置的 DNS
2. Unix domain socket格式为绝对路径形如 `"/dev/shm/domain.socket"`,可在开头加 `"@"` 代表 [abstract](https://www.man7.org/linux/man-pages/man7/unix.7.html)`"@@"` 则代表带 padding 的 abstract。
若只填 port数字或字符串均可形如 `80`、`"80"`,通常指向一个明文 http 服务addr 会被补为 `"127.0.0.1"`)。
> `xver`: number
发送 [PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt),专用于传递请求的真实来源 IP 和端口,填版本 1 或 2默认为 0即不发送。若有需要建议填 1。
目前填 1 或 2功能完全相同只是结构不同且前者可打印后者为二进制。Xray 的 TCP 和 WS 入站均已支持接收 PROXY protocol。
::: warning
若你正在 [配置 Nginx 接收 PROXY protocol](https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/#configuring-nginx-to-accept-the-proxy-protocol),除了设置 proxy_protocol 外,还需设置 set_real_ip_from否则可能会出问题。
:::
### 补充说明
- 将匹配到最精确的子元素,与子元素的排列顺序无关。若配置了几个 alpn 和 path 均相同的子元素,则会以最后的为准。
- 回落分流均是解密后 TCP 层的转发,而不是 HTTP 层,只在必要时检查首包 PATH。
- 您可以查看更多的关于 Fallbacks 的使用技巧和心得
- [Fallbacks 功能简析](../../documents/level-1/fallbacks-lv1)
## Fallbacks 设计理论 <Badge text="WIP" type="warning"/>

View File

@ -0,0 +1,178 @@
# 多文件配置
Xray 程序支持使用多个配置文件。
多配置文件的主要作用在于分散不同作用模块配置,便于管理和维护。
该功能主要考虑是为了丰富 Xray 的生态链,比如对于 GUI 的客户端,一般只实现节点选择等固定的功能,对于太复杂的配置难以图形化实现;只需留一个 `confdir` 的自定义配置目录供配置复杂的功能;对于服务器的部署脚本,只需往 `confdir` 添加文件即可实现配置多种协议。
## 多文件启动
::: tip
启动信息中会提示依次读入的每个配置文件,留意启动信息是否符合你预设的顺序。
:::
```shell
$ xray run -confdir /etc/xray/confs
```
也可使用 `Xray.location.confdir``Xray_LOCATION_CONFDIR` 指定 `confdir`
参数 `-confdir` 的作用优先于环境变量,如果参数指定了有效的目录则不再读取环境变量中的路径。
## 规则说明
### 普通对象(`{}`
**在 json 的顶级对象当中,后者覆盖或补充前者。**
比如:
* base.json
```json
{
"log": {},
"api": {},
"dns": {},
"stats": {},
"policy": {},
"transport": {},
"routing": {},
"inbounds": []
}
```
* outbounds.json
```json
{
"outbounds": []
}
```
以多配置启动 Xray
```bash
$ xray run -confdir /etc/xray/confs
```
这两个配置文件的就等效于合成一起的整配置。当需要修改出口节点,只需要修改 `outbounds.json` 内容。
如果需要改编日志 log 的级别,也不需要改 `base.json`,只需后续增加一个配置:
* debuglog.json
```json
{
"log": {
"loglevel": "debug"
}
}
```
启动顺序放置在 base 后,即可输出 debug 级别的日志
### 数组(`[]`
在 json 配置中的`inbounds`和`outbounds`是数组结构,他们有特殊的规则:
* 当配置中的数组元素有 2 或以上,覆盖前者的 inbounds/oubounds
* 当配置中的数组元素只有 1 个时,查找原有`tag`相同的元素进行覆盖;若无法找到:
- 对于 inbounds添加至最后inbounds 内元素顺序无关)
- 对于 outbounds添加至最前outbounds 默认首选出口);但如果文件名含有 tail大小写均可添加至最后。
借助多配置,可以很方便为原有的配置添加不同协议的 inbound而不必修改原有配置。
以下例子不是有效配置,只为展示上述规则。
* 000.json
```json
{
"inbounds": [
{
"protocol": "socks",
"tag":"socks",
"port": 1234
}
]
}
```
* 001.json
```json
{
"inbounds": [
{
"protocol": "http",
"tag":"http"
}
]
}
```
* 002.json
```json
{
"inbounds": [
{
"protocol": "socks",
"tag":"socks",
"port": 4321
}
]
}
```
三个配置将会合成为:
```json
{
"inbounds": [
{
"protocol": "socks",
"tag":"socks",
"port": 4321 // < 002000tagsocksinbound4321
},
{
"protocol": "http",
"tag":"http"
}
]
}
```
## 推荐的多文件列表
执行:
```bash
for BASE in 00_log 01_api 02_dns 03_routing 04_policy 05_inbounds 06_outbounds 07_transport 08_stats 09_reverse; do echo '{}' > "/etc/Xray/$BASE.json"; done
```
```bash
for BASE in 00_log 01_api 02_dns 03_routing 04_policy 05_inbounds 06_outbounds 07_transport 08_stats 09_reverse; do echo '{}' > "/usr/local/etc/Xray/$BASE.json"; done
```
```bash
.
├── 00_log.json
├── 01_api.json
├── 02_dns.json
├── 03_routing.json
├── 04_policy.json
├── 05_inbounds.json
├── 06_outbounds.json
├── 07_transport.json
├── 08_stats.json
└── 09_reverse.json
0 directories, 10 files
```

View File

@ -0,0 +1,46 @@
# VLESS 协议详解
> **VLESS 是原创的无状态的轻量传输协议, 也是 Xray 一切的开始**
## 协议详解 <Badge text="WIP" type="warning"/>
## 配置模板
[Xray-examples](https://github.com/xtls/Xray-examples) 有完整的 VLESS 配置示例供参考。(但目前不能保证其它协议的配置示例质量)
## 客户端开发指引
1. VLESS 协议本身还会有不兼容升级,但客户端配置文件参数基本上是只增不减的。**所以如果你开发了用 core 的客户端,现在就可以适配。** iOS 客户端的协议实现则需紧跟升级。
2. **视觉标准UI 标识请统一用 VLESS**,而不是 VLess / Vless / vless配置文件不受影响代码内则顺其自然。
3. `encryption` 应做成输入框而不是选择框,新配置的默认值应为 `none`,若用户置空则应代填 `none`
**以下为已支持图形化配置 VLESS 的部分客户端列表,推荐使用:**(排名不分先后顺序)
- OpenWrt
- [PassWall](https://github.com/xiaorouji/openwrt-passwall)
- [Hello World](https://github.com/jerrykuku/luci-app-vssr)
- [ShadowSocksR Plus+](https://github.com/fw876/helloworld)
- Windows
- [v2rayN](https://github.com/2dust/v2rayN)
- [Qv2ray](https://github.com/Qv2ray/Qv2ray)
- Android
- [v2rayNG](https://github.com/2dust/v2rayNG)
- [Kitsunebi](https://github.com/rurirei/Kitsunebi/tree/release_xtls)
- iOS / Mac
- [Shadowrocket](https://apps.apple.com/app/shadowrocket/id932747118)
## Fallbacks
Fallbacks 是 Xray 独创的新型协议回落模式解析, 可有效防止主动探测, 自由配置常用端口多服务共享.
目前 Xray 中的 VLESS 和 trojan 协议支持Fallbacks.
- [Fallbacks 配置说明](../fallback/#fallbacks-配置)
- [Fallbacks 功能简析]()
- [Fallbacks 设计理论](../fallback/#fallbacks-设计理论)
## VLESS 分享链接标准
感谢<img src="https://avatars2.githubusercontent.com/u/7822648?s=32" width="32px" height="32px" alt="a"/> [@DuckSoft](https://github.com/DuckSoft) 的提案!
目前为初步提案, 详情请见[VMessAEAD / VLESS 分享链接标准提案](https://github.com/XTLS/Xray-core/issues/91)

View File

@ -0,0 +1,5 @@
# XTLS 深度剖析
> **XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力**
<Badge text="WIP" type="warning"/>

51
docs/config/fakedns.md Normal file
View File

@ -0,0 +1,51 @@
---
date: "2021-03-14T00:00:00.000Z"
description: Project X 的文档.
title: FakeDNS
weight: 11
---
FakeDNS 通过伪造 DNS 以获取目标域名,能够降低 DNS 查询时的延迟、配合透明代理获取目标域名。
::: warning
FakeDNS 有可能会污染本地 DNS导致 Xray 关闭后“无法访问网络”。
## FakeDNSObject
---
`FakeDNSObject` 对应配置文件的 `fakedns` 项。
```json
{
"ipPool": "240.0.0.0/8",
"poolSize": 65535
}
```
> `ipPool`: CIDR
FakeDNS 将使用此选项指定的 IP 块分配地址。
> `poolSize`: int
指定 FakeDNS 储存的 域名-IP 映射的最大数目。当映射数超过此值后,会按照 LRU 规则淘汰映射。默认为 65535。
### 如何使用?
FakeDNS 本质上是一个 [DNS 服务器](../dns#serverobject),能够与任意 DNS 规则配合使用。
::: tip
只有将 DNS 查询路由到 FakeDNS才能使其发挥作用。
另外,你需要在入站中开启 `Sniffing` ,并使用 `fakedns` 目标地址重置。
{{% notice warning important %}}
**TIP**\
如果 FakeIP 没有被正确的还原为域名,将无法连接到服务器。

View File

@ -0,0 +1,30 @@
---
alwaysopen: false
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
# head: <hr/>
hide:
- toc
# post: "&nbsp;\U0001F44B"
title: Inbounds 可用协议列表
weight: 5
---
{{% alert theme="warning" %}}**这个章节包含了目前所有可用于 Inbounds 的协议及具体配置细节.**{{% /alert %}}
## 协议列表
---
>[Dokodemo-door](./dokodemo)
Dokodemo door任意门可以监听一个本地端口并把所有进入此端口的数据发送至指定服务器的一个端口从而达到端口映射的效果。
>[HTTP](./http)
HTTP 协议
>[Socks](./socks)
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
>[VLESS](./vless)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
>[VMess](./vmess)
[VMess](../../develop/protocols/vmess) 是一个加密传输协议,,可以作为 Xray 客户端和服务器之间的桥梁。
>[Trojan](./trojan)
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议
>[Shadowsocks](./shadowsocks)
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。

View File

@ -0,0 +1,61 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Dokodemo door
weight: 2
---
Dokodemo door任意门可以监听一个本地端口并把所有进入此端口的数据发送至指定服务器的一个端口从而达到端口映射的效果。
## InboundConfigurationObject
---
```json
{
"address": "8.8.8.8",
"port": 53,
"network": "tcp",
"timeout": 0,
"followRedirect": false,
"userLevel": 0
}
```
> `address`: address
将流量转发到此地址。可以是一个 IP 地址,形如 `"1.2.3.4"`,或者一个域名,形如 `"xray.com"`。字符串类型。
`followRedirect`(见下文)为 `true` 时,`address` 可为空。
> `port`: number
将流量转发到目标地址的指定端口,范围 \[1, 65535\],数值类型。必填参数。
> `network`: "tcp" | "udp" | "tcp,udp"
可接收的网络协议类型。比如当指定为 `"tcp"` 时,仅会接收 TCP 流量。默认值为 `"tcp"`
> `timeout`: number
连接空闲的时间限制。单位为秒。默认值为 `300`。处理一个连接时,如果在 `timeout` 时间内,没有任何数据被传输,则中断该连接。
> `followRedirect`: true | false
当值为 `true`dokodemo-door 会识别出由 iptables 转发而来的数据,并转发到相应的目标地址。
可参考 [传输配置](../../base/transport#sockoptobject) 中的 `tproxy` 设置。
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
userLevel 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
## 透明代理配置样例
---
此部分请参考[透明代理TProxy配置教程](../../../documents/level-2/tproxy)。

View File

@ -0,0 +1,90 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: HTTP
weight: 3
---
HTTP 协议。
::: danger
**http 协议没有对传输加密,不适宜经公网中传输,更容易成为被人用作攻击的肉鸡。**
`http inbound` 更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
::: tip
**TIP 1**\
`http proxy` 只能代理 tcp 协议udp 系的协议均不能通过。
::: tip
**TIP 2**\
在 Linux 中使用以下环境变量即可在当前 session 使用全局 HTTP 代理(很多软件都支持这一设置,也有不支持的)。
- `export http_proxy=http://127.0.0.1:8080/` (地址须改成你配置的 HTTP 入站代理地址)
- `export https_proxy=$http_proxy`
## InboundConfigurationObject
---
```json
{
"timeout": 0,
"accounts": [
{
"user": "my-username",
"pass": "my-password"
}
],
"allowTransparent": false,
"userLevel": 0
}
```
> `timeout`: number
连接空闲的时间限制。单位为秒。默认值为 `300`, 0 表示不限时。
处理一个连接时,如果在 `timeout` 时间内,没有任何数据被传输,则中断该连接。
> `accounts`: \[[AccountObject](#accountobject)\]
一个数组,数组中每个元素为一个用户帐号。默认值为空。
`accounts` 非空时HTTP 代理将对入站连接进行 Basic Authentication 验证。
> `allowTransparent`: true | false
当为 `true` 时,会转发所有 HTTP 请求,而非只是代理请求。
::: tip
若配置不当,开启此选项会导致死循环。
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
userLevel 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
### AccountObject
---
```json
{
"user": "my-username",
"pass": "my-password"
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。

View File

@ -0,0 +1,68 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Shadowsocks
weight: 8
---
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议,兼容大部分其它版本的实现。
目前兼容性如下:
* 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
* 推荐的加密方式:
* AES-256-GCM
* AES-128-GCM
* ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
* none 或 plain
不推荐的加密方式:
* AES-256-CFB
* AES-128-CFB
* ChaCha20
* ChaCha20-IETF
::: danger
"none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path
## InboundConfigurationObject
```json
{
"email": "love@xray.com",
"method": "aes-256-gcm",
"password": "密码",
"level": 0,
"network": "tcp"
}
```
> `email`: string
邮件地址,可选,用于标识用户
> `method`: string
必填。
* 推荐的加密方式:
* AES-256-GCM
* AES-128-GCM
* ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
* none 或 plain
> `password`: string
必填,任意字符串。
Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
`level` 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
> `network`: "tcp" | "udp" | "tcp,udp"
可接收的网络协议类型。比如当指定为 `"tcp"` 时,仅会接收 TCP 流量。默认值为 `"tcp"`

View File

@ -0,0 +1,82 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Socks
weight: 4
---
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
::: danger
**socks 协议没有对传输加密,不适宜经公网中传输**
`socks inbound` 更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
## InboundConfigurationObject
```json
{
"auth": "noauth",
"accounts": [
{
"user": "my-username",
"pass": "my-password"
}
],
"udp": false,
"ip": "127.0.0.1",
"userLevel": 0
}
```
> `auth`: "noauth" | "password"
Socks 协议的认证方式,支持 `"noauth"` 匿名方式和 `"password"` 用户密码方式。
默认值为 `"noauth"`
> `accounts`: \[ [AccountObject](#accountobject) \]
一个数组,数组中每个元素为一个用户帐号。
此选项仅当 `auth``password` 时有效。
默认值为空。
> `udp`: true | false
是否开启 UDP 协议的支持。
默认值为 `false`
> `ip`: address
当开启 UDP 时Xray 需要知道本机的 IP 地址。
默认值为 `"127.0.0.1"`
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
userLevel 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
### AccountObject
---
```json
{
"user": "my-username",
"pass": "my-password"
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。

View File

@ -0,0 +1,103 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Trojan
weight: 7
---
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议
::: danger
Trojan 被设计工作在正确配置的加密 TLS 隧道
## InboundConfigurationObject
---
```json
{
"clients": [
{
"password": "password",
"email": "love@xray.com",
"level": 0,
"flow": "xtls-rprx-direct"
}
],
"fallbacks": [
{
"dest": 80
}
]
}
```
> `clients`: \[ [ClientObject](#clientobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户 [ClientObject](#clientobject)。
> `fallbacks`: \[ [FallbackObject](../../fallback) \]
一个数组,包含一系列强大的回落分流配置(可选)。<br>
fallbacks 的具体配置请点击[FallbackObject](../../fallback/#fallbacks-配置)
{{% notice %}}
**TIP**\
Xray 的 Trojan 有完整的 fallbacks 支持,配置方式完全一致。</br>
触发回落的条件也与VLESS类似首包长度 < 58 或第 57 个字节不为 '\r'(因为 Trojan 没有协议版本)或身份认证失败。
### ClientObject
---
```json
{
"password": "password",
"email": "love@xray.com",
"level": 0,
"flow": "xtls-rprx-direct"
}
```
> `password`: string
必填,任意字符串。
> `email`: string
邮件地址,可选,用于标识用户
::: danger
如果存在多个 ClientObject, 请注意 email 不可以重复。
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
userLevel 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前入站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式,此时客户端仅可选择 `xtls-rprx-origin``xtls-rprx-origin-udp443` 这两种流控模式。该模式纪念价值大于实际使用价值
- `xtls-rprx-direct`**推荐**,所有平台皆可使用的典型流控方式,此时客户端可选择任何流控模式
::: warning
**注意**
`flow` 被指定时,还需要将该入站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../../base/transport#streamsettingsobject)。
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。

View File

@ -0,0 +1,110 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: VLESS
weight: 5
---
::: danger
目前 VLESS 没有自带加密,请用于可靠信道,如 TLS。</br>
目前 VLESS 不支持分享。</br>
VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部分,可以作为 Xray 客户端和服务器之间的桥梁。
与 [VMess](../vmess) 不同VLESS 不依赖于系统时间,认证方式同样为 UUID但不需要 alterId。
## InboundConfigurationObject
```json
{
"clients": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"email": "love@xray.com",
"flow": "xtls-rprx-direct"
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 80
}
]
}
```
> `clients`: \[ [ClientObject](#clientobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户 [ClientObject](#clientobject)。
> `decryption`: "none"
现阶段需要填 `"none"`,不能留空。</br>
若未正确设置 decryption 的值,使用 Xray 或 -test 时会收到错误信息。
注意这里是 decryption和 clients 同级。</br>
decryption 和 vmess 协议的 encryption 的位置不同,是因为若套一层约定加密,服务端需要先解密才能知道是哪个用户。</br>
> `fallbacks`: \[ [FallbackObject](../../fallback) \]
一个数组,包含一系列强大的回落分流配置(可选)。<br>
fallbacks 的具体配置请点击[FallbackObject](../../fallback/#fallbacks-配置)
</br>
### ClientObject
---
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"email": "love@xray.com",
"flow": "xtls-rprx-direct"
}
```
> `id`: string
VLESS 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. </br>
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即
- 写 "id": "我爱🍉老师1314",
- 或写 "id": "5783a3e7-e373-51cd-8642-c83782b807c5" (此UUID是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在[VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -map "自定义字符串"` 生成自定义字符串所映射的的 UUID.</br>
也可以使用命令 `xray uuid` 生成随机的UUID.
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
level 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
> `email`: string
用户邮箱,用于区分不同用户的流量(会体现在日志、统计中)。
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前入站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式,此时客户端仅可选择 `xtls-rprx-origin``xtls-rprx-origin-udp443` 这两种流控模式。该模式纪念价值大于实际使用价值
- `xtls-rprx-direct`**推荐**,所有平台皆可使用的典型流控方式,此时客户端可选择任何流控模式
::: warning
**注意**
`flow` 被指定时,还需要将该入站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../../base/transport#streamsettingsobject)。
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。
</br>

View File

@ -0,0 +1,162 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: VMess
weight: 6
---
[VMess](../../../develop/protocols/vmess) 是一个加密传输协议,通常作为 Xray 客户端和服务器之间的桥梁。
::: danger
VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在 90 秒之内,时区无关。在 Linux 系统中可以安装`ntp`服务来自动同步系统时间。</br>
## InboundConfigurationObject
---
```json
{
"clients": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"alterId": 0,
"email": "love@xray.com"
}
],
"default": {
"level": 0,
"alterId": 0
},
"detour": {
"to": "tag_to_detour"
},
"disableInsecureEncryption": false
}
```
> `clients`: \[ [ClientObject](#clientobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户[ClientObject](#clientobject)。
当此配置用作动态端口时Xray 会自动创建用户。
> `detour`: [DetourObject](#detourobject)
指示对应的出站协议使用另一个服务器。
> `default`: [DefaultObject](#defaultobject)
可选clients 的默认配置。仅在配合`detour`时有效。
> `disableInsecureEncryption`: true | false
是否禁止客户端使用不安全的加密方式,如果设置为 true 当客户端指定下列加密方式时,服务器会主动断开连接。
- `"none"`
- `"aes-128-cfb"`
默认值为`false`。
### ClientObject
---
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"alterId": 4,
"email": "love@xray.com"
}
```
> `id`: string
Vmess 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. </br>
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即
- 写 "id": "我爱🍉老师1314",
- 或写 "id": "5783a3e7-e373-51cd-8642-c83782b807c5" (此UUID是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在[VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -map "自定义字符串"` 生成自定义字符串所映射的的 UUID.</br>
也可以使用命令 `xray uuid` 生成随机的UUID.
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
level 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
> `alterId`: number
为了进一步防止被探测,一个用户可以在主 ID 的基础上,再额外生成多个 ID。这里只需要指定额外的 ID 的数量,推荐值为 0 代表启用 VMessAEAD。
最大值 65535。这个值不能超过服务器端所指定的值。
不指定的话,默认值是 0。
::: tip
客户端 AlterID 设置为 0 代表启用 VMessAEAD ;服务端为自动适配,可同时兼容启用和未开启 VMessAEAD 的客户端。
客户端可通过设置环境变量 Xray_VMESS_AEAD_DISABLED=true 强行禁用 VMessAEAD
> `email`: string
用户邮箱地址,用于区分不同用户的流量。
### DetourObject
---
```json
{
"to": "tag_to_detour"
}
```
> `to`: string
一个 inbound 的`tag`, 指定的 inbound 的必须是使用 VMess 协议的 inbound.
### DefaultObject
---
```json
{
"level": 0,
"alterId": 0
}
```
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
level 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
> `alterId`: number
动态端口的默认`alterId`,默认值为`0`。
## VMess MD5 认证信息 玷污机制
---
为了进一步对抗可能的探测和封锁,每个 VMess 认证数据的服务端结构都会包含一个一次写入的玷污状态标记,初始状态为无瑕状态,当服务器检测到重放探测时或者因为其他原因入站连接出错以致校验数据不正确时,该连接所对应的请求认证数据会被玷污。
被玷污的认证数据无法被用于建立连接,当攻击者或客户端使用被玷污的认证数据建立连接时,服务器会输出包含 "invalid user" "ErrTainted" 的错误信息,并阻止该连接。
当服务器没有受到重放攻击时,该机制对正常连接的客户端没有影响。
如果服务器正在被重放攻击,可能会出现连接不稳定的情况。
::: tip
拥有服务器 UUID 以及其他连接数据的恶意程序可能根据此机制对服务器发起拒绝服务攻击,受到此类攻击的服务可以通过修改 proxy/vmess/validator.go 文件中 func (v \*TimedUserValidator) BurnTaintFuse(userHash []byte) error 函数的 atomic.CompareAndSwapUint32(pair.taintedFuse, 0, 1) 语句为 atomic.CompareAndSwapUint32(pair.taintedFuse, 0, 0) 来解除服务器对此类攻击的安全保护机制。使用 VMessAEAD 认证机制的客户端不受到 VMess MD5 认证信息 玷污机制 的影响。

View File

@ -0,0 +1,34 @@
---
alwaysopen: false
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
# head: <hr/>
hide:
- toc
# post: "&nbsp;\U0001F44B"
title: Outbounds 可用协议列表
weight: 6
---
{{% alert theme="warning" %}}**这个章节包含了目前所有可用于 Outbounds 的协议及具体配置细节.**{{% /alert %}}
## 协议列表
---
>[Blackhole](./blackhole)
Blackhole黑洞是一个出站数据协议它会阻碍所有数据的出站配合 [路由Routing](../routing) 一起使用,可以达到禁止访问某些网站的效果。
>[DNS](./dns)
DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。
>[Freedom](./freedom)
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
>[HTTP](./http)
HTTP 协议
>[Socks](./socks)
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
>[VLESS](./vless)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
>[VMess](./vmess)
[VMess](../../develop/protocols/vmess) 是一个加密传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
>[Trojan](./trojan)
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议。
>[Shadowsocks](./shadowsocks)
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。

View File

@ -0,0 +1,43 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Blackhole
weight: 1
---
Blackhole黑洞是一个出站数据协议它会阻碍所有数据的出站配合 [路由配置](../../routing) 一起使用,可以达到禁止访问某些网站的效果。
## OutboundConfigurationObject
---
```json
{
"response": {
"type": "none"
}
}
```
> `response`: [ResponseObject](#responseobject)
配置黑洞的响应数据。
Blackhole 会在收到待转发数据之后,发送指定的响应数据,然后关闭连接,待转发的数据将被丢弃。</br>
如不指定此项Blackhole 将直接关闭连接。
### ResponseObject
---
```json
{
"type": "none"
}
```
> `type`: "http" | "none"
`type``"none"`默认值Blackhole 将直接关闭连接。
`type``"http"`Blackhole 会发回一个简单的 HTTP 403 数据包,然后关闭连接。

View File

@ -0,0 +1,43 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: DNS
weight: 2
---
DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。
此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。
在处理 DNS 查询时,此出站协议会将 IP 查询(即 A 和 AAAA转发给内置的 [DNS 服务器](../../dns)。其它类型的查询流量将被转发至它们原本的目标地址。
## OutboundConfigurationObject
---
```json
{
"network": "tcp",
"address": "1.1.1.1",
"port": 53
}
```
> `network`: "tcp" | "udp"
修改 DNS 流量的传输层协议,可选的值有 `"tcp"``"udp"`。当不指定时,保持来源的传输方式不变。
> `address`: address
修改 DNS 服务器地址。当不指定时,保持来源中指定的地址不变。
> `port`: number
修改 DNS 服务器端口。当不指定时,保持来源中指定的端口不变。
## DNS配置实例
---
{{% badge warning %}}In progress{{% /badge %}}

View File

@ -0,0 +1,51 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Freedom
weight: 3
---
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
## OutboundConfigurationObject
---
```json
{
"domainStrategy": "AsIs",
"redirect": "127.0.0.1:3366",
"userLevel": 0
}
```
> `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6"
在目标地址为域名时, 配置相应的值, Freedom 的行为模式如下:
- `"AsIs"`: Freedom 通过系统DNS服务器解析获取IP, 向此域名发出连接.
- `"UseIP"`、`"UseIPv4"` 和 `"UseIPv6"`: Xray 使用[内置 DNS 服务器](../../base/dns)解析获取IP, 向此域名发出连接.
默认值为 `"AsIs"`
::: tip
**TIP 1**\
当使用 `"UseIP"` 模式,并且[出站连接配置](../outbounds#outboundobject) 中指定了 `sendThrough`Freedom 会根据 `sendThrough` 的值自动判断所需的 IP 类型IPv4 或 IPv6。
::: tip
**TIP 2**\
当使用 `"UseIPv4"``"UseIPv6"` 模式时Freedom 会只使用对应的 IPv4 或 IPv6 地址。当 `sendThrough` 指定了不匹配的本地地址时,将导致连接失败。
> `redirect`: address_port
Freedom 会强制将所有数据发送到指定地址(而不是 inbound 指定的地址)。
其值为一个字符串,样例:`"127.0.0.1:80"``":1234"`。</br>
当地址不指定时,如 `":443"`Freedom 不会修改原先的目标地址。</br>
当端口为 `0` 时,如 `"xray.com: 0"`Freedom 不会修改原先的端口。
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
userLevel 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.

View File

@ -0,0 +1,99 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: HTTP
weight: 4
---
HTTP 协议。
::: danger
**http 协议没有对传输加密,不适宜经公网中传输,更容易成为被人用作攻击的肉鸡。**
`http inbound` 更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
::: tip
`http proxy` 只能代理 tcp 协议udp 系的协议均不能通过。
## OutboundConfigurationObject
---
```json
{
"servers": [
{
"address": "192.168.108.1",
"port": 3128,
"users": [
{
"user": "my-username",
"pass": "my-password"
}
]
}
]
}
```
::: tip
目前 HTTP 协议 outbound 中 `streamSettings` 设置 `security``tlsSettings` 是生效的。
> `servers`: \[ [ServerObject](#serverobject) \]
HTTP 服务器列表,其中每一项是一个服务器配置,若配置多个,循环使用 (RoundRobin)。
### ServerObject
---
```json
{
"address": "192.168.108.1",
"port": 3128,
"users": [
{
"user": "my-username",
"pass": "my-password"
}
]
}
```
> `address`: string
HTTP 代理服务器地址,必填。
> `port`: int
HTTP 代理服务器端口,必填。
> `user`: \[[AccountObject](#accountobject)\]
一个数组,数组中每个元素为一个用户帐号。默认值为空。
#### AccountObject
---
```json
{
"user": "my-username",
"pass": "my-password"
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。

View File

@ -0,0 +1,102 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Shadowsocks
weight: 9
---
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议,兼容大部分其它版本的实现。
目前兼容性如下:
- 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
不推荐的加密方式:
- AES-256-CFB
- AES-128-CFB
- ChaCha20
- ChaCha20-IETF
::: danger
"none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path
## OutboundConfigurationObject
---
```json
{
"servers": [
{
"email": "love@xray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"level": 0
}
]
}
```
> `servers`: \[[ServerObject](#serverobject)\]
一个数组,代表一组 Shadowsocks 服务端设置, 其中每一项是一个 [ServerObject](#serverobject)。
### ServerObject
---
```json
{
"email": "love@xray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"level": 0
}
```
> `email`: string
邮件地址,可选,用于标识用户
> `address`: address
Shadowsocks 服务端地址,支持 IPv4、IPv6 和域名。必填。
> `port`: number
Shadowsocks 服务端端口。必填。
> `method`: string
必填。
* 推荐的加密方式:
* AES-256-GCM
* AES-128-GCM
* ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
* none 或 plain
> `password`: string
必填。任意字符串。
Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
`level` 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.

View File

@ -0,0 +1,103 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Socks
weight: 5
---
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
::: danger
**socks 协议没有对传输加密,不适宜经公网中传输**
`socks inbound` 更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
## OutboundConfigurationObject
---
```json
{
"servers": [
{
"address": "127.0.0.1",
"port": 1234,
"users": [
{
"user": "test user",
"pass": "test pass",
"level": 0
}
]
}
]
}
```
> `servers`: \[ [ServerObject](#serverobject) \]
Socks 服务器列表,其中每一项是一个服务器配置。
### ServerObject
```json
{
"address": "127.0.0.1",
"port": 1234,
"users": [
{
"user": "test user",
"pass": "test pass",
"level": 0
}
]
}
```
> `address`: address
服务器地址, 必填
::: tip
仅支持连接到 Socks 5 服务器。
> `port`: number
服务器端口, 必填
> `users`: \[ [UserObject](#userobject) \]
一个数组表示的用户列表,数组中每个元素为一个用户配置。
当列表不为空时Socks 客户端会使用用户信息进行认证;如未指定,则不进行认证。
默认值为空。
#### UserObject
---
```json
{
"user": "test user",
"pass": "test pass",
"level": 0
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
userLevel 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0

View File

@ -0,0 +1,117 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: Trojan
weight: 8
---
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议
::: danger
Trojan 被设计工作在正确配置的加密 TLS 隧道
## OutboundConfigurationObject
---
```json
{
"servers": [
{
"address": "127.0.0.1",
"port": 1234,
"password": "password",
"email": "love@xray.com",
"flow": "xtls-rprx-direct",
"level": 0
}
]
}
```
> `servers`: \[ [ServerObject](#serverobject) \]
一个数组,其中每一项是一个 [ServerObject](#serverobject)。
### ServerObject
---
```json
{
"address": "127.0.0.1",
"port": 1234,
"password": "password",
"email": "love@xray.com",
"flow": "xtls-rprx-direct",
"level": 0
}
```
> `address`: address
服务端地址,支持 IPv4、IPv6 和域名。必填。
> `port`: number
服务端端口,通常与服务端监听的端口相同。
> `password`: string
密码. 必填,任意字符串。
> `email`: string
邮件地址,可选,用于标识用户
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前出站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式。该模式纪念价值大于实际使用价值
- `xtls-rprx-origin-udp443`:同 `xtls-rprx-origin`, 但放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-direct`:所有平台皆可使用的典型流控模式
- `xtls-rprx-direct-udp443`:同 `xtls-rprx-direct`, 但是放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-splice`Linux 平台下最建议使用的流控模式
- `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量
::: warning
**注意**
`flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../../base/transport#streamsettingsobject)。
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。
{{% notice %}}
**关于 `xtls-rprx-*-udp443` 流控模式**
启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能, 它作为 UDP 流量在通过 Trojan 协议传输时,底层协议为 TCP就相当于两层 TCP 了。
若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。
::: danger
Splice 是 Linux Kernel 提供的函数,系统内核直接转发 TCP不再经过 Xray 的内存大大减少了数据拷贝、CPU 上下文切换的次数。
Splice 模式的的使用限制:
- Linux 环境
- 入站协议为 `Dokodemo door`、`Socks`、`HTTP` 等纯净的 TCP 连接, 或其它使用了 XTLS 的入站协议
- 出站协议为 VLESS + XTLS 或 Trojan + XTLS
此外,使用 Splice 时网速显示会滞后,这是特性,不是 bug。
需要注意的是,使用 mKCP 协议时不会使用 Splice是的虽然没有报错但实际上根本没用到
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
level 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.

View File

@ -0,0 +1,160 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: VLESS
weight: 6
---
::: danger
目前 VLESS 没有自带加密,请用于可靠信道,如 TLS。</br>
目前 VLESS 不支持分享。</br>
VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部分,可以作为 Xray 客户端和服务器之间的桥梁。
与 [VMess](../vmess) 不同VLESS 不依赖于系统时间,认证方式同样为 UUID但不需要 alterId。
## OutboundConfigurationObject
---
```json
{
"vnext": [
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"encryption": "none",
"flow": "xtls-rprx-direct",
"level": 0
}
]
}
]
}
```
> `vnext`: \[ [ServerObject](#serverobject) \]
一个数组, 表示 VLESS 服务器列表,包含一组指向服务端的配置, 其中每一项是一个服务器配置。
### ServerObject
---
```json
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"encryption": "none",
"flow": "xtls-rprx-direct",
"level": 0
}
]
}
```
> `address`: address
服务端地址指向服务端支持域名、IPv4、IPv6。
> `port`: number
服务端端口,通常与服务端监听的端口相同。
> `users`: \[ [UserObject](#userobject) \]
数组, 一组服务端认可的用户列表, 其中每一项是一个用户配置
### UserObject
---
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"encryption": "none",
"flow": "xtls-rprx-direct",
"level": 0
}
```
> `id`: string
VLESS 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. </br>
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即
- 写 "id": "我爱🍉老师1314",
- 或写 "id": "5783a3e7-e373-51cd-8642-c83782b807c5" (此UUID是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在[VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -map "自定义字符串"` 生成自定义字符串所映射的的 UUID.</br>
也可以使用命令 `xray uuid` 生成随机的UUID.
> `encryption`: "none"
需要填 `"none"`,不能留空。
该要求是为了提醒使用者没有加密,也为了以后出加密方式时,防止使用者填错属性名或填错位置导致裸奔。</br>
若未正确设置 encryption 的值,使用 Xray 或 -test 时会收到错误信息。
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前出站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式。该模式纪念价值大于实际使用价值
- `xtls-rprx-origin-udp443`:同 `xtls-rprx-origin`, 但放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-direct`:所有平台皆可使用的典型流控模式
- `xtls-rprx-direct-udp443`:同 `xtls-rprx-direct`, 但是放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-splice`Linux 平台下最建议使用的流控模式
- `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量
::: warning
**注意**
`flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../../base/transport#streamsettingsobject)。
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。
{{% notice %}}
**关于 `xtls-rprx-*-udp443` 流控模式**
启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能,它作为 UDP 流量在通过 VLESS 协议传输时,底层协议为 TCP就相当于两层 TCP 了。
若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。
::: danger
Splice 是 Linux Kernel 提供的函数,系统内核直接转发 TCP不再经过 Xray 的内存大大减少了数据拷贝、CPU 上下文切换的次数。
Splice 模式的的使用限制:
- Linux 环境
- 入站协议为 `Dokodemo door`、`Socks`、`HTTP` 等纯净的 TCP 连接, 或其它使用了 XTLS 的入站协议
- 出站协议为 VLESS + XTLS 或 Trojan + XTLS
此外,使用 Splice 时网速显示会滞后,这是特性,不是 bug。
需要注意的是,使用 mKCP 协议时不会使用 Splice是的虽然没有报错但实际上根本没用到
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
level 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.

View File

@ -0,0 +1,125 @@
---
date: "2020-12-23T00:00:00.000Z"
description: Project X 的文档.
title: VMess
weight: 7
---
# VMess
[VMess](../../../develop/protocols/vmess) 是一个加密传输协议,通常作为 Xray 客户端和服务器之间的桥梁。
::: danger
VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在 90 秒之内,时区无关。在 Linux 系统中可以安装`ntp`服务来自动同步系统时间。</br>
## OutboundConfigurationObject
---
```json
{
"vnext": [
{
"address": "127.0.0.1",
"port": 37192,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"alterId": 0,
"security": "auto",
"level": 0
}
]
}
]
}
```
> `vnext`\[ [ServerObject](#serverobject) \]
一个数组,包含一组的服务端配置.
其中每一项是一个服务端配置[ServerObject](#serverobject)。
### ServerObject
---
```json
{
"address": "127.0.0.1",
"port": 37192,
"users": []
}
```
> `address`: address
服务端地址,支持 IP 地址或者域名。
> `port`: number
服务端监听的端口号, 必填。
> `users`: \[ [UserObject](#userobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户[UserObject](#userobject)。
#### UserObject
---
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"alterId": 0,
"security": "auto",
"level": 0
}
```
> `id`string
Vmess 的用户 ID可以是任意小于30字节的字符串, 也可以是一个合法的UUID. </br>
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写id来标识同一用户,即
- 写 "id": "我爱🍉老师1314",
- 或写 "id": "5783a3e7-e373-51cd-8642-c83782b807c5" (此UUID是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在[VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -map "自定义字符串"` 生成自定义字符串所映射的的 UUID.</br>
也可以使用命令 `xray uuid` 生成随机的UUID.
> `alterId`number
为了进一步防止被探测,一个用户可以在主 ID 的基础上,再额外生成多个 ID。这里只需要指定额外的 ID 的数量,推荐值为 0 代表启用 VMessAEAD。
最大值 65535。这个值不能超过服务器端所指定的值。
不指定的话,默认值是 0。
::: tip
客户端 AlterID 设置为 0 代表启用 VMessAEAD ;服务端为自动适配,可同时兼容启用和未开启 VMessAEAD 的客户端。
客户端可通过设置环境变量 Xray_VMESS_AEAD_DISABLED=true 强行禁用 VMessAEAD
> `level`: number
用户等级,连接会使用这个用户等级对应的[本地策略](../../base/policy#levelpolicyobject)。
level 的值, 对应 [policy](../../base/policy#policyobject) 中 level 的值. 如不指定, 默认为 0.
> `security`: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none"
加密方式,客户端将使用配置的加密方式发送数据,服务器端自动识别,无需配置。
- `"aes-128-gcm"`:推荐在 PC 上使用
- `"chacha20-poly1305"`:推荐在手机端使用
- `"auto"`:默认值,自动选择(运行框架为 AMD64、ARM64 或 s390x 时为 aes-128-gcm 加密方式,其他情况则为 Chacha20-Poly1305 加密方式)
- `"none"`:不加密
::: tip
推荐使用`"auto"`加密方式,这样可以永久保证安全性和兼容性。

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 连接的配置。

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`

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。
客户端会使用此名称进行通信,服务器会验证服务名称是否匹配。

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 路径,由 `/` 开头, 客户端和服务器必须一致。
默认值为 `"/"`

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单位毫秒msmKCP 将以这个时间频率发送数据。
请选译一个介于 `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 不支持这个场景。

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 工具对接。
为了避免被探测,建议加密或伪装至少开启一项。

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 头的名称,对应的值是一个数组。
每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。

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 头的名称,对应的值是字符串。
默认值为空。

View File

@ -42,7 +42,7 @@ Xray 提供两种验证方式:
## macOS 安装方式
- 在 [Github Releases](https://github.com/xtls/Xray-core/releases) 下载适用于 macOS 平台的 ZIP 压缩包,解压后可得到可执行文件 `xray`,然后[通过命令行带参数运行](./command) 即可
- 通过 [Homebrew](https://brew.sh) 包管理器安装:<Badge text="WIP" type="warning"/>
- 通过 [Homebrew](https://brew.sh) 包管理器安装:<Badge text="WIP" type="warning"/>
## Linux 安装方式
@ -66,10 +66,10 @@ Xray 提供两种验证方式:
Linux 发行版 Xray 包(可通过发行版相应的包管理器安装):
- Debian <Badge text="WIP" type="warning"/>
- Arch Linux <Badge text="WIP" type="warning"/>
- Debian <Badge text="WIP" type="warning"/>
- Arch Linux <Badge text="WIP" type="warning"/>
### Linuxbrew 包管理器 <Badge text="WIP" type="warning"/>
### Linuxbrew 包管理器 <Badge text="WIP" type="warning"/>
## Docker 安装方式
@ -88,4 +88,4 @@ Linux 发行版 Xray 包(可通过发行版相应的包管理器安装):
您可以点击 [传送至众多大佬集结区的任意门](../links) 获取更多资源
## FAQ <Badge text="WIP" type="warning"/>
## FAQ <Badge text="WIP" type="warning"/>

View File

@ -10,7 +10,7 @@ title: 链接
- [Xray-script](https://github.com/kirin10000/Xray-script) 感谢[@kirin](https://github.com/kirin10000)
- Docker
- [teddysun/xray](https://hub.docker.com/r/teddysun/xray) 感谢[@秋水逸冰](https://hub.docker.com/u/teddysun)
- Xray-docker <Badge text="WIP" type="warning"/>
- Xray-docker <Badge text="WIP" type="warning"/>
- One Click
- [ProxySU](https://github.com/proxysu/ProxySU) 感谢[@ProxySu](https://github.com/proxysu)
- [Xray-agent](https://github.com/mack-a/Xray-agent) 感谢[@mack-a](https://github.com/mack-a)