Update latest content from Chinese to English

This commit is contained in:
yuhan6665 2023-03-04 11:39:44 -05:00
parent 4e6196c70a
commit 8f28caf961
34 changed files with 1829 additions and 518 deletions

View File

@ -41,9 +41,9 @@ footer: Licensed under CC-BY-SA 4.0 | Copyright 2020-Present Project X Community
**XTLS are brilliant ideas for TLS we study, while Xray is the best practice we maintain.**
- Xray-core 是 v2ray-core 的超集,含更好的整体性能和 XTLS 等一系列增强,且完全兼容 v2ray-core 的功能及配置。
- Xray-core 是 v2ray-core 的超集,含更好的整体性能和 XTLS 等一系列增强,且~~完全~~兼容 v2ray-core 的功能及配置。
- 只有一个可执行文件,含 ctl 的功能run 为默认指令
- 配置上完全兼容,环境变量和 API 对应要改为以 XRAY\_ 开头
- 配置上~~完全~~兼容,环境变量和 API 对应要改为以 XRAY\_ 开头
- 全平台开放了裸协议的 ReadV
- 提供完整的 VLESS & Trojan XTLS 支持,均有 ReadV
- 提供了 XTLS 多种流控模式, 性能一骑绝尘!
@ -52,7 +52,7 @@ footer: Licensed under CC-BY-SA 4.0 | Copyright 2020-Present Project X Community
### 我们是谁?
> **It doesn't matter who we are. What matters is that we will keep riding and not look back.**
> **It doesn't matter who we are. What matters is that we will keep riding and never look back.**
### 帮助 Xray 变得更强

View File

@ -53,18 +53,15 @@ API 接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
```json
"routing": {
"settings": {
"rules": [
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
}
]
},
"strategy": "rules"
"rules": [
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
}
]
}
```

View File

@ -23,15 +23,16 @@ Xray 内置的 DNS 模块,主要有两大用途:
## DNS 处理流程
DNS 服务器配置模块可以配置多个 DNS 服务器, 并且指定优先匹配列表.
若当前要查询的域名:
1. 查询的域名与某个 DNS 服务器指定的域名列表匹配时Xray 会优先使用这个 DNS 服务器进行查询。
2. 无匹配时, 按从上往下的顺序进行查询,并且会跳过 1 步骤中使用的最后一个服务器。
3. 只返回匹配 expectIPs 的 IP 列表。
DNS 服务器的处理流程示意图如下:
![](./dns_flow.png?classes=border,shadow)
- 命中了 `hosts` 中的「域名 - IP」、「域名 - IP 数组」映射,则将该 IP 或 IP 数组作为 DNS 解析结果返回。
- 命中了 `hosts` 中的「域名 - 域名」映射,则该映射的值(另一个域名)将作为当前要查询的域名,进入 DNS 处理流程,直到解析出 IP 后返回,或返回空解析。
- 没有命中 `hosts`,但命中了某(几)个 DNS 服务器中的 `domains` 域名列表,则按照命中的规则的优先级,依次使用该规则对应的 DNS 服务器进行查询。若命中的 DNS 服务器查询失败或 `expectIPs` 不匹配,则使用下一个命中的 DNS 服务器进行查询;否则返回解析得到的 IP。若所有命中的 DNS 服务器均查询失败或 `expectIPs` 不匹配,此时 DNS 组件:
- 默认会进行 「DNS 回退fallback查询」使用「上一轮失败查询中未被使用的、且 `skipFallback` 为默认值 `false` 的 DNS 服务器」依次查询。若查询失败或 `expectIPs` 不匹配,返回空解析;否则返回解析得到的 IP。
- 若 `disableFallback` 设置为 `true`则不会进行「DNS 回退fallback查询」。
- 既没有命中 `hosts`,又没有命中 DNS 服务器中的 `domains` 域名列表,则:
- 默认使用「`skipFallback` 为默认值 `false` 的 DNS 服务器」依次查询。若第一个被选中的 DNS 服务器查询失败或 `expectIPs` 不匹配,则使用下一个被选中的 DNS 服务器进行查询;否则返回解析得到的 IP。若所有被选中的 DNS 服务器均查询失败或 `expectIPs` 不匹配,返回空解析。
- 若「`skipFallback` 为默认值 `false` 的 DNS 服务器」数量为 0 或 `disableFallback` 设置为 `true`,则使用 DNS 配置中的第一个 DNS 服务器进行查询。查询失败或 `expectIPs` 不匹配,返回空解析;否则返回解析得到的 IP。
## DnsObject
@ -51,11 +52,17 @@ DNS 服务器的处理流程示意图如下:
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
"expectIPs": ["geoip:cn"]
"expectIPs": ["geoip:cn"],
"skipFallback": false,
"clientIP": "1.2.3.4"
},
"localhost"
],
"clientIp": "1.2.3.4",
"queryStrategy": "UseIP",
"disableCache": false,
"disableFallback": false,
"disableFallbackIfMatch": false,
"tag": "dns_inbound"
}
}
@ -81,13 +88,19 @@ DNS 服务器的处理流程示意图如下:
一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 [ServerObject](#serverobject) 。
当它的值是一个 DNS IP 地址时,如 `"8.8.8.8"`Xray 会使用此地址的 53 端口进行 DNS 查询。
当值为 `"localhost"` 时,表示使用本机预设的 DNS 配置。
当它的值是一个 DNS `"IP:Port"` 地址时,如 `"8.8.8.8:53"`Xray 会使用此地址的指定 UDP 端口进行 DNS 查询。该查询遵循路由规则。不指定端口时,默认使用 53 端口。
当值是 `"tcp://host:port"` 的形式,如 `"tcp://8.8.8.8:53"`Xray 会使用 `DNS over TCP` 进行查询。该查询遵循路由规则。不指定端口时,默认使用 53 端口。
当值是 `"tcp+local://host:port"` 的形式,如 `"tcp+local://8.8.8.8:53"`Xray 会使用 `TCP 本地模式 (TCPL)` 进行查询。即 DNS 请求不会经过路由组件,直接通过 Freedom outbound 对外请求,以降低耗时。不指定端口时,默认使用 53 端口。
当值是 `"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 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`Xray 会使用 `DOH 本地模式 (DOHL)` 进行查询,即 DOH 请求不会经过路由组件,直接通过 Freedom outbound 对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `"quic+local://host"` 的形式,如 `"quic+local://dns.adguard.com"`Xray 会使用 `DNS over QUIC 本地模式 (DOQL)` 进行查询,即 DNS 请求不会经过路由组件,直接通过 Freedom outbound 对外请求。该方式需要 DNS 服务器支持 DNS over QUIC。默认使用 784 端口进行查询,可以使用非标端口。
当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。
@ -107,9 +120,33 @@ DNS 服务器的处理流程示意图如下:
用于 DNS 查询时通知服务器以指定 IP 位置。不能是私有地址。
::: tip TIP 1
需要 DNS 服务器支持 EDNS Client Subnet。
:::
::: tip TIP 2
可以在 [DnsObject](#dnsobject) 为所有 DNS 服务器指定 clientIp, 也可在每个 DNS 服务器配置的 [ServerObject](#serverobject) 为此 DNS 服务器指定 clientIp (优先级高于 [DnsObject](#dnsobject) 的配置)。
:::
> `queryStrategy`: "UseIP" | "UseIPv4" | "UseIPv6"
`UseIPv4` 只查询 A 记录;`UseIPv6` 只查询 AAAA 记录。默认值为 `UseIP`,即查询 A 和 AAAA 记录。
> `disableCache`: true | false
`true` 禁用 DNS 缓存,默认为 `false`,即不禁用。
> `disableFallback`: true | false
`true` 禁用 DNS 的 fallback 查询,默认为 `false`,即不禁用。
> `disableFallbackIfMatch`: true | false
`true` 当 DNS 服务器的优先匹配域名列表命中时,禁用 fallback 查询,默认为 `false`,即不禁用。
> `tag`: string
由内置 DNS 发出的查询流量,除 `localhost``DOHL_` 模式外,都可以用此标识在路由使用 `inboundTag` 进行匹配。
由内置 DNS 发出的查询流量,除 `localhost``fakedns``TCPL``DOHL``DOQL` 模式外,都可以用此标识在路由使用 `inboundTag` 进行匹配。
### ServerObject
@ -118,7 +155,9 @@ DNS 服务器的处理流程示意图如下:
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
"expectIPs": ["geoip:cn"]
"expectIPs": ["geoip:cn"],
"skipFallback": false,
"clientIP": "1.2.3.4"
}
```
@ -126,19 +165,25 @@ DNS 服务器的处理流程示意图如下:
一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 ServerObject 。
它的值是一个 DNS IP 地址时,如 "8.8.8.8"Xray 会使用此地址的 53 端口进行 DNS 查询
值为 `"localhost"` 时,表示使用本机预设的 DNS 配置
当值为 "localhost" 时,表示使用本机预设的 DNS 配置。
当它的值是一个 DNS `"IP"` 地址时,如 `"8.8.8.8"`Xray 会使用此地址的指定 UDP 端口进行 DNS 查询。该查询遵循路由规则。默认使用 53 端口。
当值是 `"tcp://host"` 的形式,如 `"tcp://8.8.8.8"`Xray 会使用 `DNS over TCP` 进行查询。该查询遵循路由规则。默认使用 53 端口。
当值是 `"tcp+local://host"` 的形式,如 `"tcp+local://8.8.8.8"`Xray 会使用 `TCP 本地模式 (TCPL)` 进行查询。即 DNS 请求不会经过路由组件,直接通过 Freedom outbound 对外请求,以降低耗时。不指定端口时,默认使用 53 端口。
当值是 `"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 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`Xray 会使用 `DOH 本地模式 (DOHL)` 进行查询,即 DOH 请求不会经过路由组件,直接通过 Freedom outbound 对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `"quic+local://host:port"` 的形式,如 `"quic+local://dns.adguard.com"`Xray 会使用 `DOQ 本地模式 (DOQL)` 进行查询,即 DNS 请求不会经过路由组件,直接通过 Freedom outbound 对外请求。该方式需要 DNS 服务器支持 DNS over QUIC。默认使用 784 端口进行查询,可以使用非标端口。
当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。
> `port`: number
DNS 服务器端口,如 `53`。此项缺省时默认为 `53`。当使用 DOH 模式该项无效,非标端口应在 URL 中指定。
DNS 服务器端口,如 `53`。此项缺省时默认为 `53`。当使用 DOH、DOHL、DOQL 模式该项无效,非标端口应在 URL 中指定。
> `domains`: \[string\]
@ -151,3 +196,7 @@ DNS 服务器端口,如 `53`。此项缺省时默认为 `53`。当使用 DOH
当配置此项时Xray DNS 会对返回的 IP 的进行校验,只返回包含 expectIPs 列表中的地址。
如果未配置此项,会原样返回 IP 地址。
> `skipFallback`: true | false
`true`,在进行 DNS fallback 查询时将跳过此服务器, 默认为 `false`,即不跳过。

View File

@ -17,6 +17,21 @@ FakeDNS 有可能会污染本地 DNS导致 Xray 关闭后“无法访问网
}
```
`FakeDnsObject` 亦可配置为一个包含多个 FakeIP Pool 的数组。当收到 DNS 查询请求时FakeDNS 会返回一组同时由多个 FakeIP Pool 得到的一组 FakeIP。
```json
[
{
"ipPool": "198.18.0.0/15",
"poolSize": 65535
},
{
"ipPool": "fc00::/18",
"poolSize": 65535
}
]
```
> `ipPool`: CIDR
FakeDNS 将使用此选项指定的 IP 块分配地址。
@ -25,16 +40,156 @@ FakeDNS 将使用此选项指定的 IP 块分配地址。
指定 FakeDNS 储存的 域名-IP 映射的最大数目。当映射数超过此值后,会按照 LRU 规则淘汰映射。默认为 65535。
::: warning
`poolSize` 必须小于或等于 `ipPool` 对应的地址总数。
:::
::: tip
若配置文件中 `dns` 项设置了 `fakedns` 但配置文件没有设置 `FakeDnsObject`Xray 会根据 DNS 组件的 `queryStrategy` 来初始化 `FakeDnsObject`
`queryStrategy``UseIP` 时,初始化的 FakeIP Pool 相当于
```json
[
{
"ipPool": "198.18.0.0/15",
"poolSize": 32768
},
{
"ipPool": "fc00::/18",
"poolSize": 32768
}
]
```
`queryStrategy``UseIPv4` 时,初始化的 FakeIP Pool 相当于
```json
{
"ipPool": "198.18.0.0/15",
"poolSize": 65535
}
```
`queryStrategy``UseIPv6` 时,初始化的 FakeIP Pool 相当于
```json
{
"ipPool": "fc00::/18",
"poolSize": 65535
}
```
:::
### 如何使用?
FakeDNS 本质上是一个 [DNS 服务器](./dns.md#serverobject),能够与任意 DNS 规则配合使用。
::: tip
只有将 DNS 查询路由到 FakeDNS才能使其发挥作用。
:::
另外,你需要在入站中开启 `Sniffing` ,并使用 `fakedns` 目标地址重置。
```json
{
"dns": {
"servers": [
"fakedns", // fakedns 排在首位
"8.8.8.8"
]
},
"outbounds": [
{
"protocol": "dns",
"tag": "dns-out"
}
],
"routing": {
"rules": [
{
"type": "field",
"inboundTag": ["dns-in"], // 劫持来自 DNS 查询入口的 DNS 流量,或劫持来自透明代理入站的 DNS 流量。
"port": 53,
"outboundTag": "dns-out"
}
]
}
}
```
当外部 DNS 请求进入 FakeDNS 组件时,它会返回位于自己 `ipPool` 内的 IP 地址作为域名的虚构解析结果,并记录该域名与虚构解析结果之间的映射关系。
另外,你需要在**客户端**接收需代理流量的入站中开启 `Sniffing`,并使用 `fakedns` 目标地址重置。
```json
"sniffing": {
"enabled": true,
"destOverride": ["fakedns"], // 使用 "fakedns",或与其它 sniffer 搭配使用,或直接使用 "fakedns+others"
"metadataOnly": false // 此项为 true 时 destOverride 仅可使用 fakedns
},
```
::: warning
如果 FakeIP 没有被正确的还原为域名,将无法连接到服务器。
:::
### 与其它类型 DNS 搭配使用
#### 与 DNS 分流共存
使用 DNS 分流时,为了使 `fakedns` 拥有高优先级,需要对其增加与其他类型 DNS 相同的 `domains`
```json
{
"servers": [
{
"address": "fakedns",
"domains": [
// 与下方分流所用的内容一致
"geosite:cn",
"domain:example.com"
]
},
{
"address": "1.2.3.4",
"domains": ["geosite:cn"],
"expectIPs": ["geoip:cn"]
},
{
"address": "1.1.1.1",
"domains": ["domain:example.com"]
},
"8.8.8.8"
]
}
```
#### FakeDNS 黑名单
如不希望某些域名使用 FakeDNS则可在其它类型的 DNS 配置中添加 `domains` 配置,使指定域名在匹配时其它 DNS 服务器拥有比 FakeDNS 更高的优先级,进而实现 FakeDNS 的黑名单机制。
```json
{
"servers": [
"fakedns",
{
"address": "1.2.3.4",
"domains": ["domain:do-not-use-fakedns.com"]
}
]
}
```
#### FakeDNS 白名单
如希望仅某些域名使用 FakeDNS则可在 `fakedns` 增加 `domains` 配置,使指定域名在匹配时 `fakedns` 拥有比其它 DNS 服务器更高的优先级,进而实现 FakeDNS 的白名单机制。
```json
{
"servers": [
"1.2.3.4",
{
"address": "fakedns",
"domains": ["domain:only-this-use-fakedns.com"]
}
]
}
```

View File

@ -0,0 +1,37 @@
# Browser Dialer
<Badge text="BETA" type="warning"/> <Badge text="v1.4.1+" type="warning"/>
## Background
基于 [一年前的想法](https://github.com/v2ray/discussion/issues/754#issuecomment-647934994) ,利用原生 JS 实现了简洁的 WSS Browser Dialer达到了真实浏览器的 TLS 指纹、行为特征。
不过 WSS 仍存在 ALPN 明显的问题,所以下一步是浏览器转发 `HTTP/2`,`QUIC`
## Xray & JS
创造了一个非常简单、巧妙的通信机制:
- Xray 监听地址端口 A作为 HTTP 服务,浏览器访问 A加载网页中的 JS。
- JS 主动向 A 建立 WebSocket 连接成功后Xray 将连接发给 channel。
- 需要建立连接时Xray 从 channel 接收一个可用的连接,并发送目标 URL 和可选的 early data。
- JS 成功连接到目标后告知 Xray并继续用这个 conn 全双工双向转发数据,连接关闭行为同步。
- 连接使用后就会被关闭,但 JS 会确保始终有新空闲连接可用。
## Early data
根据浏览器的需求,对 early data 机制进行了如下调整:
- 服务端响应头会带有请求的 `Sec-WebSocket-Protocol`,这也初步混淆了 WSS 握手响应的长度特征。
- 用于浏览器的 early data 编码是 `base64.RawURLEncoding` 而不是 `StdEncoding`,服务端做了兼容。
- 此外,由于 [Xray-core#375](https://github.com/XTLS/Xray-core/pull/375) 推荐 `?ed=2048`,这个 PR 顺便将服务端一处 `MaxHeaderBytes` 扩至了 4096。 ~~(虽然好像不改也没问题)~~
## Configuration <Badge text="v1.4.1" type="warning"/>
这是一个探索的过程,目前两边都是 Xray-core v1.4.1 时的配置方式:
- 准备一份可用的 WSS 配置,注意 address 必须填域名,若需要指定 IP请配置 DNS 或系统 hosts。
- 若浏览器的流量也会经过 Xray-core务必将这个域名设为直连否则会造成流量回环。
- 设置环境变量指定要监听的地址端口,比如 `XRAY_BROWSER_DIALER = 127.0.0.1:8080`
- 先运行 Xray-core再用任意浏览器访问上面指定的地址端口还可以 `F12``Console``Network`
- 浏览器会限制 WebSocket 连接数,所以建议开启 `Mux.Cool`

View File

@ -31,9 +31,16 @@ Xray 提供以下环境变量以供修改 Xray 的一些底层配置。
## 资源文件路径
- 名称:`xray.location.asset``XRAY_LOCATION_ASSET`
- 默认值: Xray 文件同路径。
- 默认值:特定 [FHS](https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard) 目录或 Xray 文件同路径。
这个环境变量指定了一个文件夹位置,这个文件夹应当包含 geoip.dat 和 geosite.dat 文件。
若无指定变量值,程序将会按以下顺序寻找资源文件:
```
./
/usr/local/share/xray
/usr/share/xray
```
## 配置文件位置

View File

@ -95,6 +95,6 @@ Fallback 内设置的 `alpn` 是匹配实际协商出的 ALPN而 Inbound TLS
- 将匹配到最精确的子元素,与子元素的排列顺序无关。若配置了几个 alpn 和 path 均相同的子元素,则会以最后的为准。
- 回落分流均是解密后 TCP 层的转发,而不是 HTTP 层,只在必要时检查首包 PATH。
- 您可以查看更多的关于 Fallbacks 的使用技巧和心得
- [Fallbacks 功能简析](../documents/level-1/fallbacks-lv1)
- [Fallbacks 功能简析](../../document/level-1/fallbacks-lv1)
## Fallbacks 设计理论 <Badge text="WIP" type="warning"/>

View File

@ -38,7 +38,9 @@
支持填写 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。
填写 Unix domain socket 时,`port``allocate` 将被忽略,协议目前可选 VLESS、VMess、Trojan传输方式可选 TCP、WebSocket、HTTP/2、gRPC。
填写 Unix domain socket 时,填写为形如 `"/dev/shm/domain.socket,0666"` 的形式,即 socket 后加逗号及访问权限指示符,即可指定 socket 的访问权限,可用于解决默认情况下出现的 socket 访问权限问题。
> `port`: number | "env:variable" | string
@ -46,7 +48,7 @@
- 整型数值:实际的端口号。
- 环境变量:以 `"env:"` 开头,后面是一个环境变量的名称,如 `"env:PORT"`。Xray 会以字符串形式解析这个环境变量。
- 字符串:可以是一个数值类型的字符串,如 `"1234"`;或者一个数值范围,如 `"5-10"` 表示端口 5 到端口 10这 6 个端口。
- 字符串:可以是一个数值类型的字符串,如 `"1234"`;或者一个数值范围,如 `"5-10"` 表示端口 5 到端口 10这 6 个端口。可以使用逗号进行分段,如 `11,13,15-17` 表示端口 11、端口 13、端口 15 到端口 17 这 5 个端口。
当只有一个端口时Xray 会在此端口监听入站连接。当指定了一个端口范围时,取决于 `allocate` 设置。
@ -93,7 +95,9 @@
{
"enabled": true,
"destOverride": ["http", "tls", "fakedns"],
"metadataOnly": false
"metadataOnly": false,
"domainsExcluded": [],
"routeOnly": false
}
```
@ -101,13 +105,35 @@
是否开启流量探测。
> `destOverride`: \["http" | "tls" | "fakedns" \]
> `destOverride`: \["http" | "tls" | "quic" | "fakedns" | "fakedns+others" \]
当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。
其中 `["fakedns+others"]` 相当于 `["http", "tls", "quic", "fakedns"]`,当 IP 地址处于 FakeIP 区间内但没有命中域名记录时会使用 `http``tls``quic` 进行匹配。此项仅在 `metadataOnly``false` 时有效。
> `metadataOnly`: true | false
当启用时,将仅使用连接的元数据嗅探目标地址。此时,`http``tls` 将不能使用。
当启用时,将仅使用连接的元数据嗅探目标地址。此时,除 `fakedns` 以外的 sniffer 将不能激活(包括 `fakedns+others`)。
如果关闭仅使用元数据推断目标地址,此时客户端必须先发送数据,代理服务器才会实际建立连接。此行为与需要服务器首先发起第一个消息的协议不兼容,如 SMTP 协议。
> `domainsExcluded`: [string] <Badge text="WIP" type="warning"/>
一个域名列表,如果流量探测结果在这个列表中时,将 **不会** 重置目标地址。
::: warning
目前,`domainsExcluded` 不支持类似路由中的域名匹配方式。此选项未来可能会改变,不保证跨版本兼容。
:::
> `routeOnly`: true | false
将嗅探得到的域名仅用于路由,代理目标地址仍为 IP。默认值为 `false`
此项需要开启 `destOverride` 使用。
::: tip
在能保证 **被代理连接能得到正确的 DNS 解析** 时,使用 `routeOnly` 且开启 `destOverride` 的同时,将路由匹配策略 `domainStrategy` 设置为 `AsIs` 即可实现全程无 DNS 解析进行域名及 IP 分流。此时遇到 IP 规则匹配时使用的 IP 为域名原始 IP。
:::
### AllocateObject

View File

@ -6,21 +6,25 @@
- 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- 2022-blake3-aes-128-gcm
- 2022-blake3-aes-256-gcm
- 2022-blake3-chacha20-poly1305
- 其他加密方式
- aes-256-gcm
- aes-128-gcm
- chacha20-poly1305 或称 chacha20-ietf-poly1305
- xchacha20-poly1305 或称 xchacha20-ietf-poly1305
- none 或 plain
不推荐的加密方式:
Shadowsocks 2022 新协议格式提升了性能并带有完整的重放保护,解决了旧协议的以下安全问题:
- AES-256-CFB
- AES-128-CFB
- ChaCha20
- ChaCha20-IETF
- [Shadowsocks AEAD 加密方式设计存在严重漏洞,无法保证通信内容的可靠性](https://github.com/shadowsocks/shadowsocks-org/issues/183)
- 原有 TCP 重放过滤器误报率随时间增加
- 没有 UDP 重放保护
- 可用于主动探测的 TCP 行为
::: danger
"none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path
"none" 不加密方式下流量将明文传输。为确保安全性, 不要在公共网络上使用。
:::
## InboundConfigurationObject
@ -28,14 +32,10 @@
```json
{
"settings": {
"clients": [
{
"password": "密码",
"method": "aes-256-gcm",
"level": 0,
"email": "love@xray.com"
}
],
"password": "密码",
"method": "aes-256-gcm",
"level": 0,
"email": "love@xray.com",
"network": "tcp,udp"
}
}
@ -56,25 +56,31 @@
}
```
::: tip
(v1.2.3+) Xray 支持 Shadowsocks 单端口多用户,但是需要将该入站所有用户的加密方式设置为 AEAD。
:::
> `method`: string
必填。
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
> `password`: string
必填,任意字符串
必填。
Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
- Shadowsocks 2022
使用与 WireGuard 类似的预共享密钥作为密码。
使用 `openssl rand -base64 <长度>` 以生成与 shadowsocks-rust 兼容的密钥,长度取决于所使用的加密方法。
| 加密方法 | 密钥长度 |
| ----------------------------- | -------: |
| 2022-blake3-aes-128-gcm | 16 |
| 2022-blake3-aes-256-gcm | 32 |
| 2022-blake3-chacha20-poly1305 | 32 |
在 Go 实现中32 位密钥始终工作。
- 其他加密方法
任意字符串。 不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
> `level`: number

View File

@ -3,10 +3,10 @@
标准 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 协议没有对传输加密,不适宜经公网中传输**
:::
`socks` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
`Socks` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
## InboundConfigurationObject

View File

@ -32,10 +32,10 @@ Trojan 被设计工作在正确配置的加密 TLS 隧道
其中每一项是一个用户 [ClientObject](#clientobject)。
> `fallbacks`: \[ [FallbackObject](../examples/fallback.md) \]
> `fallbacks`: \[ [FallbackObject](../features/fallback.md) \]
一个数组,包含一系列强大的回落分流配置(可选)。
fallbacks 的具体配置请点击[FallbackObject](../examples/fallback.md#fallbacks-配置)
fallbacks 的具体配置请点击[FallbackObject](../features/fallback.md#fallbacks-配置)
::: tip
Xray 的 Trojan 有完整的 fallbacks 支持,配置方式完全一致。

View File

@ -148,3 +148,17 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。
::: 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 认证信息 玷污机制 的影响。
:::
## VMess MD5 认证信息 淘汰机制
VMess MD5 认证信息 的淘汰机制已经启动。
自 2022 年 1 月 1 日起,服务器端默认禁用对于 MD5 认证信息 的兼容。任何使用 MD5 认证信息的客户端将无法连接到禁用 VMess MD5 认证信息的服务器端。
::: tip
在服务器端可以通过设置环境变量 xray.vmess.aead.forced=true 以关闭对于 MD5 认证信息的兼容,或者 xray.vmess.aead.forced=false 以强制开启对于 MD5 认证信息 认证机制的兼容(不受到 2022 年自动禁用机制的影响)。
:::
::: tip
如无兼容旧客户端必要,应在服务端配置移除 `"alterID"` 参数。
:::

View File

@ -6,21 +6,24 @@
- 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- 2022-blake3-aes-128-gcm
- 2022-blake3-aes-256-gcm
- 2022-blake3-chacha20-poly1305
- 其他加密方式
- aes-256-gcm
- aes-128-gcm
- chacha20-poly1305 或称 chacha20-ietf-poly1305
- none 或 plain
不推荐的加密方式:
Shadowsocks 2022 新协议格式提升了性能并带有完整的重放保护,解决了旧协议的以下安全问题:
- AES-256-CFB
- AES-128-CFB
- ChaCha20
- ChaCha20-IETF
- [Shadowsocks AEAD 加密方式设计存在严重漏洞,无法保证通信内容的可靠性](https://github.com/shadowsocks/shadowsocks-org/issues/183)
- 原有 TCP 重放过滤器误报率随时间增加
- 没有 UDP 重放保护
- 可用于主动探测的 TCP 行为
::: danger
"none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path
"none" 不加密方式下流量将明文传输。为确保安全性, 不要在公共网络上使用。
:::
## OutboundConfigurationObject
@ -53,6 +56,7 @@
"port": 1234,
"method": "加密方式",
"password": "密码",
"uot": true,
"level": 0
}
```
@ -73,17 +77,31 @@ Shadowsocks 服务端端口。必填。
必填。
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
> `password`: string
必填。任意字符串。
必填。
Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
> `uot`: bool
当开启后,会启用`udp over tcp`
- Shadowsocks 2022
使用与 WireGuard 类似的预共享密钥作为密码。
使用 `openssl rand -base64 <长度>` 以生成与 shadowsocks-rust 兼容的密钥,长度取决于所使用的加密方法。
| 加密方法 | 密钥长度 |
| ----------------------------- | -------: |
| 2022-blake3-aes-128-gcm | 16 |
| 2022-blake3-aes-256-gcm | 32 |
| 2022-blake3-chacha20-poly1305 | 32 |
在 Go 实现中32 位密钥始终工作。
- 其他加密方法
任意字符串。不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
> `level`: number

View File

@ -1,9 +1,9 @@
# 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)。
标准 Socks 协议实现,兼容 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
::: danger
**socks 协议没有对传输加密,不适宜经公网中传输**
**Socks 协议没有对传输加密,不适宜经公网中传输**
:::
## OutboundConfigurationObject

View File

@ -4,6 +4,8 @@
如常见用法是分流国内外流量Xray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。
有关路由功能更详细的解析:[路由 (routing) 功能简析](https://xtls.github.io/document/level-1/routing-lv1-part1.html)
## RoutingObject
`RoutingObject` 对应配置文件的 `routing` 项。
@ -12,6 +14,7 @@
{
"routing": {
"domainStrategy": "AsIs",
"domainMatcher": "hybrid",
"rules": [],
"balancers": []
}
@ -28,11 +31,18 @@
- 解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名;
- `"IPOnDemand"`:当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配;
> `domainMatcher`: "hybrid" | "linear"
域名匹配算法,根据不同的设置使用不同的算法。此处选项会影响所有未单独指定匹配算法的 `RuleObject`
- `"hybrid"`:使用新的域名匹配算法,速度更快且占用更少。默认值。
- `"linear"`:使用原来的域名匹配算法。
> `rules`: \[[RuleObject](#ruleobject)\]
对应一个数组,数组中每一项是一个规则。
对于每一个连接,路由将根据这些规则依次进行判断,当一个规则生效时,即将这个连接转发至它所指定的 `outboundTag``balancerTag`
对于每一个连接,路由将根据这些规则从上到下依次进行判断,当遇到第一个生效规则时,即将这个连接转发至它所指定的 `outboundTag``balancerTag`
::: tip
当没有匹配到任何规则时,流量默认由第一个 outbound 发出。
@ -48,6 +58,7 @@
```json
{
"domainMatcher": "hybrid",
"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"],
@ -68,6 +79,13 @@
当多个属性同时指定时,这些属性需要**同时**满足,才可以使当前规则生效。
:::
> `domainMatcher`: "hybrid" | "linear"
域名匹配算法,根据不同的设置使用不同的算法。此处选项优先级高于 `RoutingObject` 中配置的 `domainMatcher`
- `"hybrid"`:使用新的域名匹配算法,速度更快且占用更少。默认值。
- `"linear"`:使用原来的域名匹配算法。
> `type`: "field"
目前只支持`"field"`这一个选项。
@ -203,3 +221,5 @@
- `geolocation-!cn`:包含了常见的非大陆站点域名,同时包含了 `tld-!cn`
- `tld-cn`:包含了 CNNIC 管理的用于中国大陆的顶级域名,如以 `.cn``.中国` 结尾的域名。
- `tld-!cn`:包含了非中国大陆使用的顶级域名,如以 `.hk`(香港)、`.tw`(台湾)、`.jp`(日本)、`.sg`(新加坡)、`.us`(美国)`.ca`(加拿大)等结尾的域名。
你也可以在这里查看完整的域名列表 [Domain list community](https://github.com/v2fly/domain-list-community)。

View File

@ -80,12 +80,13 @@
"tproxy": "off",
"domainStrategy": "AsIs",
"dialerProxy": "",
"acceptProxyProtocol": false
"acceptProxyProtocol": false,
"tcpKeepAliveInterval": 0
}
}
```
> `network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"
> `network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic" | "grpc"
连接的数据流所使用的传输方式类型,默认值为 `"tcp"`
@ -147,16 +148,17 @@ TLS / XTLS 是目前最安全的传输加密方案, 且外部看来流量类型
```json
{
"serverName": "xray.com",
"rejectUnknownSni": false,
"allowInsecure": false,
"alpn": ["h2", "http/1.1"],
"minVersion": "1.2",
"maxVersion": "1.3",
"preferServerCipherSuites": true,
"cipherSuites": "此处填写你需要的加密套件名称,每个套件名称之间用:进行分隔",
"certificates": [],
"disableSystemRoot": false,
"enableSessionResumption": false,
"fingerprint": ""
"fingerprint": "",
"pinnedPeerCertificateChainSha256": [""]
}
```
@ -166,6 +168,10 @@ TLS / XTLS 是目前最安全的传输加密方案, 且外部看来流量类型
当目标连接由域名指定时,比如在 Socks 入站接收到了域名,或者由 Sniffing 功能探测出了域名,这个域名会自动用于 `serverName`,无须手动配置。
> `rejectUnknownSni`: bool
当值为 `true` 时,服务端接收到的 SNI 与证书域名不匹配即拒绝 TLS 握手,默认为 false。
> `alpn`: \[ string \]
一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为 `["h2", "http/1.1"]`
@ -178,12 +184,6 @@ minVersion 为可接受的最小 SSL/TLS 版本。
maxVersion 为可接受的最大 SSL/TLS 版本。
> `preferServerCipherSuites`: true | false
指示服务器选择客户端最喜欢的密码套件 或 服务器最优选的密码套件。
如果为 true 则为使用服务器的最优选的密码套件
> `cipherSuites`: \[ string \]
CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之间用:进行分隔.
@ -226,7 +226,6 @@ CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之
- `"safari"`
- `"ios"`
- `"android"`
- `"safari"`
- `"edge"`
- `"360"`
- `"qq"`
@ -243,6 +242,20 @@ CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之
指纹与行为,可以使用 [Browser Dialer](./transports/websocket.md#browser-dialer)。
:::
> `pinnedPeerCertificateChainSha256`: \[string\]
用于指定远程服务器的证书链 SHA256 散列值,使用标准编码格式。仅有当服务器端证书链散列值符合设置项中之一时才能成功建立 TLS 连接。
在连接因为此配置失败时,会展示远程服务器证书散列值。
::: danger
不建议使用这种方式获得证书链散列值,因为在这种情况下将没有机会验证此时服务器提供的证书是否为真实证书,进而不保证获得的证书散列值为期望的散列值。
:::
::: tip
如果需要获得证书的散列值,应在命令行中运行 `xray tls certChainHash --cert <cert.pem>` 来获取,`<cert.pem>` 应替换为实际证书文件路径。
:::
> `certificates`: \[ [CertificateObject](#certificateobject) \]
证书列表,其中每一项表示一个证书(建议 fullchain
@ -257,6 +270,7 @@ CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之
```json
{
"ocspStapling": 3600,
"oneTimeLoading": false,
"usage": "encipherment",
"certificateFile": "/path/to/certificate.crt",
"keyFile": "/path/to/key.key",
@ -313,7 +327,14 @@ CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之
> `ocspStapling`: number
ocspStapling 检查更新时间间隔。 单位:秒
OCSP 装订更新,与证书热重载的时间间隔。 单位:秒。默认值为 `3600`,即一小时。
> `oneTimeLoading`: true | false
仅加载一次。值为 `true` 时将关闭证书热重载功能与 ocspStapling 功能。
::: warning
当值为 `true` 时,将会关闭 OCSP 装订。
:::
> `usage`: "encipherment" | "verify" | "issue"
@ -473,7 +494,7 @@ ocspStapling 检查更新时间间隔。 单位:秒
一个出站代理的标识。当值不为空时,将使用指定的 outbound 发出连接。 此选项可用于支持底层传输方式的链式转发。
::: danger
此选项与 PorxySettingsObject.Tag 不兼容
此选项与 ProxySettingsObject.Tag 不兼容
:::
> `acceptProxyProtocol`: true | false
@ -498,11 +519,20 @@ TCP 保持活跃的数据包发送间隔,单位为秒。~~该设置仅适用
> `tcpcongestion`: ""
TCP 开启内核的 bbr 拥塞控制 仅支持 linux。
TCP 拥塞控制算法。仅支持 Linux。
不配置此项表示使用系统默认值。
- bbr (推荐)
::: tip 常见的算法
- bbr推荐
- cubic
- reno (默认)
- reno
:::
::: tip
执行命令 `sysctl net.ipv4.tcp_congestion_control` 获取系统默认值。
:::
> `interface`: ""

View File

@ -18,6 +18,7 @@ gRPCHTTP/2内置多路复用不建议使用 gRPC 与 HTTP/2 时启用 m
- 请确定反向代理服务器开启了 HTTP/2
- 请使用 HTTP/2 或 h2c (Caddy)grpc_pass (Nginx) 连接到 Xray。
- 普通模式的 Path 为 `/${serviceName}/Tun`, Multi 模式为 `/${serviceName}/TunMulti`
- 如果需要接收客户端 IP可以通过由 Caddy / Nginx 发送 `X-Real-IP` header 来传递客户端 IP。
:::
::: tip
@ -35,7 +36,11 @@ gRPCHTTP/2内置多路复用不建议使用 gRPC 与 HTTP/2 时启用 m
```json
{
"serviceName": "name",
"multiMode": false
"multiMode": false,
"idle_timeout": 60,
"health_check_timeout": 20,
"permit_without_stream": false,
"initial_windows_size": 0
}
```
@ -44,8 +49,58 @@ gRPCHTTP/2内置多路复用不建议使用 gRPC 与 HTTP/2 时启用 m
一个字符串,指定服务名称,**类似于** HTTP/2 中的 Path。
客户端会使用此名称进行通信,服务端会验证服务名称是否匹配。
> `multiMode`: bool <Badge text="BETA" type="warning"/>
> `multiMode`: true | false <Badge text="BETA" type="warning"/>
一个布尔值。表示是否启用 `multiMode`。
`true` 启用 `multiMode`,默认值为: `false`。
这是一个 **实验性** 选项,可能不会被长期保留,也不保证跨版本兼容。此模式在 **测试环境中** 能够带来约 20% 的性能提升,实际效果因传输速率不同而不同。
::: tip
**只需**在**出站****客户端**)配置。
:::
> `idle_timeout`: number
单位秒,当这段时间内没有数据传输时,将会进行健康检查。如果此值设置为 `10` 以下,将会使用 `10`,即最小值。
::: tip
如果没有使用 Caddy 或 Nginx 等反向代理工具(**通常不会**),设为 `60` 以下,服务端可能发送意外的 h2 GOAWAY 帧以关闭现有连接。
:::
健康检查默认**不启用**。
::: tip
**只需**在**出站****客户端**)配置。
:::
::: tip
可能会解决一些“断流”问题。
:::
> `health_check_timeout`: number
单位秒,健康检查的超时时间。如果在这段时间内没有完成健康检查,且仍然没有数据传输时,即认为健康检查失败。默认值为 `20`
::: tip
**只需**在**出站****客户端**)配置。
:::
> `permit_without_stream`: true | false
`true` 允许在没有子连接时进行健康检查。默认值为 `false`
::: tip
**只需**在**出站****客户端**)配置。
:::
> `initial_windows_size`: number
h2 Stream 初始窗口大小。当值小于等于 `0` 时,此功能不生效。当值大于 `65535`动态窗口机制Dynamic Window会被禁用。默认值为 `0`,即不生效。
::: tip
**只需**在**出站****客户端**)配置。
:::
::: tip
通过 Cloudflare CDN 时,可将值设为 `35536` 及以上即禁用动态窗口机制Dynamic Window,可防止 Cloudflare CDN 发送意外的 h2 GOAWAY 帧以关闭现有连接。
:::

View File

@ -9,7 +9,7 @@
HTTP/2 内置多路复用,不建议使用 HTTP/2 时启用 mux.cool。
::: tip
当前版本的 HTTP/2 的传输方式并不强制要求服务端有 TLS 配置.
当前版本的 HTTP/2 的传输方式并不强制要求**入站****服务端**有 TLS 配置.
这使得可以在特殊用途的分流部署环境中,由外部网关组件完成 TLS 层对话Xray 作为后端应用,网关和 Xray 间使用称为 `h2c` 的明文 http/2 进行通讯。
:::
@ -27,7 +27,13 @@ HTTP/2 内置多路复用,不建议使用 HTTP/2 时启用 mux.cool。
```json
{
"host": ["xray.com"],
"path": "/random/path"
"path": "/random/path",
"read_idle_timeout": 10,
"health_check_timeout": 15,
"method": "PUT",
"headers": {
"Header": ["value"]
}
}
```
@ -37,8 +43,40 @@ HTTP/2 内置多路复用,不建议使用 HTTP/2 时启用 mux.cool。
客户端会随机从列表中选出一个域名进行通信,服务器会验证域名是否在列表中。
> `path` string
> `path`: string
HTTP 路径,由 `/` 开头, 客户端和服务器必须一致。
默认值为 `"/"`
> `read_idle_timeout`: number
单位秒,当这段时间内没有接收到数据时,将会进行健康检查。
健康检查默认**不启用**。
::: tip
**只需**在**出站****客户端**)配置。
:::
::: tip
可能会解决一些“断流”问题。
:::
> `health_check_timeout`: number
单位秒,健康检查的超时时间。如果在这段时间内没有完成健康检查,即认为健康检查失败。默认值为 `15`
::: tip
**只需**在**出站****客户端**)配置。
:::
> `method`: string
HTTP 方法。默认值为 `"PUT"`
设置时应参照[此处](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods)列出值。
> `headers`: map{ string: \[string\] }
自定义 HTTP 头,一个键值对,每个键表示一个 HTTP 头名称,对应值为一个数组。

View File

@ -48,38 +48,6 @@ WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"`。
默认值为空。
## Browser Dialer <Badge text="BETA" type="warning"/>
## Browser Dialer
### Background
[v2ray/discussion#754](https://github.com/v2ray/discussion/issues/754#issuecomment-647934994) 基于一年前的想法,原生 JS 实现了简洁的 WSS Browser Dialer真实浏览器的 TLS 指纹、行为特征。
不过 WSS 仍存在 ALPN 明显的问题,所以下一步是浏览器转发 HTTP/2、QUIC。
### Xray & JS
创造了一个非常简单、巧妙的通信机制:
- Xray 监听地址端口 A作为 HTTP 服务,浏览器访问 A加载网页中的 JS。
- JS 主动向 A 建立 WebSocket 连接成功后Xray 将连接发给 channel。
- 需要建立连接时Xray 从 channel 接收一个可用的连接,并发送目标 URL 和可选的 early data。
- JS 成功连接到目标后告知 Xray并继续用这个 conn 全双工双向转发数据,连接关闭行为同步。
- 连接使用后就会被关闭,但 JS 会确保始终有新空闲连接可用。
### Early data
根据浏览器的需求,对 early data 机制进行了如下调整:
- 服务端响应头会带有请求的 `Sec-WebSocket-Protocol`,这也初步混淆了 WSS 握手响应的长度特征。
- 用于浏览器的 early data 编码是 `base64.RawURLEncoding` 而不是 `StdEncoding`,服务端做了兼容。
- 此外,由于 [#375](https://github.com/XTLS/Xray-core/pull/375) 推荐 `?ed=2048`,这个 PR 顺便将服务端一处 `MaxHeaderBytes` 扩至了 4096。 ~~(虽然好像不改也没问题)~~
### Configuration <Badge text="v1.4.1" type="warning"/>
这是一个探索的过程,目前两边都是 Xray-core v1.4.1 时的配置方式:
- 准备一份可用的 WSS 配置,注意 address 必须填域名,若需要指定 IP请配置 DNS 或系统 hosts。
- 若浏览器的流量也会经过 Xray-core务必将这个域名设为直连否则会造成流量回环。
- 设置环境变量指定要监听的地址端口,比如 `XRAY_BROWSER_DIALER = 127.0.0.1:8080`
- 先运行 Xray-core再用任一浏览器访问上面指定的地址端口还可以 `F12``Console``Network`
- 浏览器会限制 WebSocket 连接数,所以建议开启 `Mux.Cool`
使用浏览器处理 TLS详见 [Browser Dialer](../features/browser_dialer.md)

View File

@ -1,7 +1,3 @@
---
sidebar: auto
---
# 开发指南
## 编译文档
@ -28,7 +24,7 @@ Xray 内核提供了一个平台,在其之上可以进二次开发。
Xray 用到了很多种协议, 您可以通过各种途径获得协议的详细描述。
### [mKCP 协议](./protocols/vless.md)
### [VLESS 协议](./protocols/vless.md)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。

View File

@ -11,16 +11,15 @@ project X 的代码被托管在 github 上:
- 配置模板 [Xray-examples](https://github.com/XTLS/Xray-examples)
- xray 文档 [Xray-docs-next](https://github.com/XTLS/Xray-docs-next)
您可以使用 [Git](https://git-scm.com/) 来获取代码.
您可以使用 [Git](https://git-scm.com/) 来获取代码
### 分支Branch
本项目的主干分支为 main, main 分支也是发布时所使用的代码分支, 因此需要确保 master 在任一时刻都是可编译可使用的。
如果需要开发新的功能
- 请新开分支进行开发, 在开发完成并且经过充分测试后, 合并回主干分支.
- 新开分支如没有必要再存在时, 可以去除.
- 本项目的主干分支为 main
- 本项目的发布主分支同为 main
- 需要确保 main 在任一时刻都是可编译,且可正常使用的。
- 如果需要开发新的功能,请新建分支进行开发,在开发完成并且经过充分测试后,合并回主干分支。
- 已经合并入主干且没有必要存在的分支,请删除。
### 发布Release
@ -42,7 +41,7 @@ project X 的代码被托管在 github 上:
### 写代码之前
发现任何问题,或对项目有任何想法,请创建 Issue 讨论以减少重复劳动和消耗在代码上的时间。
发现任何问题,或对项目有任何想法,请创建 [issue](https://github.com/XTLS/Xray-core/issues) 讨论以减少重复劳动和消耗在代码上的时间。
### 修改代码
@ -59,13 +58,13 @@ project X 的代码被托管在 github 上:
- 提交 PR 之前,请先运行 `git pull https://github.com/xray/xray-core.git` 以确保 merge 可顺利进行;
- 一个 PR 只做一件事,如有对多个 bug 的修复,请对每一个 bug 提交一个 PR
- 由于 Golang 的特殊需求Package pathGo 项目的 PR 流程和其它项目有所不同 ,建议流程如下:
1. 先 Fork 本项目,创建自己的 `github.com/your/Xray-core` 仓库;
2. 克隆自己的 Xray 仓库到本地:`git clone https://github.com/your/Xray-core.git`
3. 基于 `main` 分支创建新的分支;
4. 在自行创建的分支上作修改并提交修改(commit)
- 由于 Golang 的特殊需求Package pathGo 项目的 PR 流程和其它项目有所不同建议流程如下:
1. 先 Fork 本项目,创建自己的 `github.com/<your_name>/Xray-core.git` 仓库;
2. 克隆自己的 Xray 仓库到本地:`git clone https://github.com/<your_name>/Xray-core.git`
3. 基于 `main` 分支创建新的分支,例如 `git branch issue24 main`
4. 在创建的分支上作修改并提交修改(commit)
5. 在推送(push)修改完成的分支到自己的仓库前,先切换到 `main` 分支,运行 `git pull https://github.com/xray/xray-core.git` 拉取最新的远端代码;
6. 如果上一步拉取得到了新的远端代码,则切换到之前自己创建的分支,运行 `git rebase master` 执行分支合并操作。如遇到文件冲突,则需要解决冲突;
6. 如果上一步拉取得到了新的远端代码,则切换到之前自己创建的分支,运行 `git rebase main` 执行分支合并操作。如遇到文件冲突,则需要解决冲突;
7. 上一步处理完毕后,就可以把自己创建的分支推送到自己的仓库:`git push -u origin your-branch`
8. 最后,把自己仓库的新推送的分支往 `xtls/Xray-core``main` 分支发 PR 即可;
9. 请在 PR 的标题和正文中,完整表述此次 PR 解决的问题 / 新增的功能 / 代码所做的修改的用意等;

View File

@ -47,21 +47,23 @@ Mux.Cool 使用对称传输格式,即客户端和服务器发送和接收相
### 元数据
元数据有若干种类型,由状态 S 来区分。所有类型的元数据都包含 ID 和 Opt 两项,其含义为:
元数据有若干种类型。所有类型的元数据都包含 ID 和 Opt 两项,其含义为:
- ID: 子连接的唯一标识
- 对于一般 MUX 子链接ID 由 1 开始累加
- 对于 XUDPID 始终为 0
- Opt:
- D(0x01): 有额外数据
当选项 Opt(D) 开启时,额外数据格式如下:
| 2 字节 | L 字节 |
| ------ | ------ |
| 长度 L | 数据 |
| 2 字节 | X-2 字节 |
| -------- | -------- |
| 长度 X-2 | 数据 |
### 新建子连接 (New)
| 2 字节 | 1 字节 | 1 字节 | 1 字节 | 2 字节 | 1 字节 | X 字节 |
| 2 字节 | 1 字节 | 1 字节 | 1 字节 | 2 字节 | 1 字节 | A 字节 |
| ------ | ------ | -------- | ---------- | ------ | ---------- | ------ |
| ID | 0x01 | 选项 Opt | 网络类型 N | 端口 | 地址类型 T | 地址 A |
@ -88,6 +90,7 @@ Mux.Cool 使用对称传输格式,即客户端和服务器发送和接收相
| ID | 0x02 | 选项 Opt |
在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。
XUDP 在 Opt(D) 之后加 UDP 地址,格式同新建子链接
### 关闭子连接 (End)
@ -113,4 +116,4 @@ Mux.Cool 使用对称传输格式,即客户端和服务器发送和接收相
Mux.Cool 协议与底层协议无关,理论上可以使用任何可靠的流式连接来传输 Mux.Cool 的协议数据。
在目标导向的协议如 Shadowsocks 和 VMess 协议中,连接建立时必须包含一个指定的地址。
为了保持兼容性Mux.Cool 协议指定地址为“v1.mux.cool”。即当主连接的目标地址与之匹配时则进行 Mux.Cool 方式的转发,否则按传统方式进行转发。
为了保持兼容性Mux.Cool 协议指定地址为“v1.mux.cool”。即当主连接的目标地址与之匹配时则进行 Mux.Cool 方式的转发,否则按传统方式进行转发。这是一个程序内的标记VMess 和 VLESS 并不会在数据包中发送“v1.mux.cool”地址

View File

@ -49,7 +49,7 @@
1. 测试证书申请的命令如下(本文均以 `ECC` 证书为例,因为时至今日,实在没什么理由不用它):
```shell
acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256
```
::: warning 说明
@ -118,7 +118,7 @@
4. 如果这一步出错的话,你可以运行下面的命令,来查看详细的申请过程和具体的错误。(看不懂就隐藏掉敏感信息后,去 Xray 群里问吧)
```shell
acme.sh --issue --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
acme.sh --issue --server letsencrypt --test -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --debug
```
嗯没错,就是在命令的最后加了一个 `--debug` 参数
@ -129,6 +129,10 @@
1. 申请正式证书的命令如下(即删掉 `--test` 参数,并在最后加入 `--force`参数):
```shell
acme.sh --set-default-ca --server letsencrypt
```
```shell
acme.sh --issue -d 二级域名.你的域名.com -w /home/vpsadmin/www/webpage --keylength ec-256 --force
```

View File

@ -28,7 +28,11 @@
写本文时,安装脚本在使用非 root 账户时有一些小 bug所以我决定正好把这几步分开操作可以顺便说明一下 Linux 下的删除命令。
1. 小小白白 Linux 基础命令: | 编号 | 命令名称 | 命令说明 | |:--:|:--:|:--:| | `cmd-14` | `rm` | 删除命令 |
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
| :------: | :------: | :------: |
| `cmd-14` | `rm` | 删除命令 |
2. 将安装脚本下载至本地:
@ -88,7 +92,11 @@
5. `acme.sh` 会每 60 天检查一次证书并自动更新临期证书。但据我所知是它并不会自动将新证书安装给 `xray-core`,所以我们需要新增一个系统的自动周期任务来完成这一步。
1. 小小白白 Linux 基础命令: | 编号 | 命令名称 | 命令说明 | |:--:|:--:|:--:| | `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 |
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
| :------: | :----------: | :--------------------: |
| `cmd-15` | `crontab -e` | 编辑当前用户的定时任务 |
2. 建立一个脚本文件(`xray-cert-renew.sh`
@ -157,7 +165,10 @@
2. 建立日志文件及文件夹备用
1. 小小白白 Linux 基础命令: | 编号 | 命令名称 | 命令说明 | |:--:|:--:|:--:| | `cmd-16` | `touch` | 建立空白文件 |
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:|
| `cmd-16` | `touch` | 建立空白文件 |
2. 在`vpsadmin`的文件夹内建立一个【日志专用文件夹】
@ -268,6 +279,7 @@
"network": "tcp",
"security": "tls",
"tlsSettings": {
"alpn": "http/1.1",
"certificates": [
{
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt",
@ -322,7 +334,7 @@ sudo systemctl status xray
## 7.6 回顾 `systemd` 进行基本的服务管理
到现在为止,我们已经使用过了`systemctl`相关的`start`, `status`, `reload` 等命令,这些都是基于`systmed`管理模块对 Linux
到现在为止,我们已经使用过了`systemctl`相关的`start`, `status`, `reload` 等命令,这些都是基于`systemd`管理模块对 Linux
系统中各种服务进行管理的通用命令。现在正好熟悉一下相关的其他几个命令。
1. 若你需要暂时关闭 `Xray` 的服务,那就用`stop`命令
@ -553,7 +565,7 @@ sudo systemctl restart xray
## 7.9 服务器优化之三:更丰富的回落
如果你需要更丰富的回落功能,可以参考 [《回落 (fallbacks) 功能简析》](../../level-1/fallbacks-lv1/)
如果你需要更丰富的回落功能,可以参考 [《回落 (fallbacks) 功能简析》](../level-1/fallbacks-lv1/)
## 7.10 你的进度

View File

@ -68,10 +68,16 @@
- 请根据该客户端的说明进行设置
- **Qv2ray - 跨平台图形界面,适用于 Linux, Windows, macOS**
- 请从它的[GitHub 仓库 Release 页面](https://github.com/Qv2ray/Qv2ray/releases)获取最新版(还可以从它的[GitHub 自动构建仓库](https://github.com/Qv2ray/Qv2ray/actions)寻找更新的版本)
- 请从它的[项目主页](https://qv2ray.net/)学习文档
- 请根据该客户端的说明进行设置
- **V2RayXS - 基于 V2RayX 开发的一款使用 xray-core 的 macOS 客户端**
- 请从它的 [GitHub 仓库 Release 页面](https://github.com/tzmax/v2rayXS/releases) 获取最新版
- 支持一键导入 [VMessAEAD / VLESS 分享链接标准提案](https://github.com/XTLS/Xray-core/issues/91) 为标准的分享链接
- 请根据该客户端的说明进行设置
到这一步,你的全套配置就已经可以正常使用啦!
## 8.3 附加题 1在 PC 端手工配置 `xray-core`

View File

@ -6,27 +6,29 @@
如果你用了《小小白白话文》中的[Xray 配置](../level-0/ch07-xray-server.md#_7-4-配置xray),并完成了[HTTP 自动跳转 HTTPS 优化](../level-0/ch07-xray-server.md#_7-8-服务器优化之二-开启http自动跳转https),那么你已经有了基于 `VLESS` 协议的简易回落:
```json5
"inbounds": [
```json
{
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
...
],
"decryption": "none",
"fallbacks": [
{
"dest": 8080 // 默认回落到防探测的代理
}
]
},
"streamSettings": {
...
}
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
// ... ...
],
"decryption": "none",
"fallbacks": [
{
"dest": 8080 // 默认回落到防探测的代理
}
]
},
"streamSettings": {
// ... ...
}
}
]
]
}
```
这一段配置用人话要怎么解释呢?
@ -113,7 +115,7 @@
为什么又要再次认识回落呢? 因为,上面仅仅说清楚了基于“协议”的、抵抗【主动探测】的初版回落。
在 [RPRX](https://github.com/rprx) 不断开发迭代 `VLESS` 协议及 `fallback` 功能的过程,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗【主动探测】的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。(如 `path`, `alpn` 等)
在 [RPRX](https://github.com/rprx) 不断开发迭代 `VLESS` 协议及 `fallback` 功能的过程,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗【主动探测】的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。(如 `path`, `alpn` 等)
基于这个开发理念,【回落】功能才逐渐成长为现在的完全体,即完成了 `纯伪装 --> ws分流 --> 多协议多特征分流` 的进化。最终版甚至完全替代了以前要用 Web 服务器、其他工具才能完成的分流的功能。且由于上述的【回落/分流】处理都在首包判断阶段以毫秒级的速度完成、不涉及任何数据操作,所以几乎没有任何过程损耗。
@ -228,32 +230,32 @@
1. 后续处理回落至 `1310` 端口的流量,按照下面的配置验证、处理:
```json5
```json
{
port: 1310,
listen: "127.0.0.1",
protocol: "trojan",
settings: {
clients: [
"port": 1310,
"listen": "127.0.0.1",
"protocol": "trojan",
"settings": {
"clients": [
{
password: "", // 填写你的密码
level: 0,
email: "love@example.com",
},
"password": "", // 填写你的密码
"level": 0,
"email": "love@example.com"
}
],
fallbacks: [
"fallbacks": [
{
dest: 80, // 或者回落到其它也防探测的代理
},
],
},
streamSettings: {
network: "tcp",
security: "none",
tcpSettings: {
acceptProxyProtocol: true,
},
"dest": 80 // 或者回落到其它也防探测的代理
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true
}
}
}
```
@ -264,94 +266,94 @@
2. 后续处理回落至 `1234` 端口的流量,仔细看!它其实是 `vless+ws`
```json5
```json
{
port: 1234,
listen: "127.0.0.1",
protocol: "vless",
settings: {
clients: [
"port": 1234,
"listen": "127.0.0.1",
"protocol": "vless",
"settings": {
"clients": [
{
id: "", // 填写你的 UUID
level: 0,
email: "love@example.com",
},
"id": "", // 填写你的 UUID
"level": 0,
"email": "love@example.com"
}
],
decryption: "none",
},
streamSettings: {
network: "ws",
security: "none",
wsSettings: {
acceptProxyProtocol: true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
path: "/websocket", // 必须换成自定义的 PATH需要和分流的一致
},
"decryption": "none"
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
"path": "/websocket" // 必须换成自定义的 PATH需要和分流的一致
}
}
}
```
3. 后续处理回落至 `2345` 端口的流量,仔细看!它其实是 `vmess直连`
```json5
```json
{
port: 2345,
listen: "127.0.0.1",
protocol: "vmess",
settings: {
clients: [
"port": 2345,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
id: "", // 填写你的 UUID
level: 0,
email: "love@example.com",
},
],
},
streamSettings: {
network: "tcp",
security: "none",
tcpSettings: {
acceptProxyProtocol: true,
header: {
type: "http",
request: {
path: [
"/vmesstcp", // 必须换成自定义的 PATH需要和分流的一致
],
},
},
},
"id": "", // 填写你的 UUID
"level": 0,
"email": "love@example.com"
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none",
"tcpSettings": {
"acceptProxyProtocol": true,
"header": {
"type": "http",
"request": {
"path": [
"/vmesstcp" // 必须换成自定义的 PATH需要和分流的一致
]
}
}
}
}
}
```
4. 后续处理回落至 `3456` 端口的流量,再仔细看!它其实是是 `vmess+ws(+cdn)`
::: warning 说明
你没看错,这就是 v2fly 曾经的推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦!
你没看错,这就是 v2fly 曾经推荐组合之一,并可完整支持 `CDN`。现已加入完美回落套餐哦!
:::
```json5
```json
{
port: 3456,
listen: "127.0.0.1",
protocol: "vmess",
settings: {
clients: [
"port": 3456,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
id: "", // 填写你的 UUID
level: 0,
email: "love@example.com",
},
],
},
streamSettings: {
network: "ws",
security: "none",
wsSettings: {
acceptProxyProtocol: true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
path: "/vmessws", // 必须换成自定义的 PATH需要和分流的一致
},
"id": "", // 填写你的 UUID
"level": 0,
"email": "love@example.com"
}
]
},
"streamSettings": {
"network": "ws",
"security": "none",
"wsSettings": {
"acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS需要删掉这行
"path": "/vmessws" // 必须换成自定义的 PATH需要和分流的一致
}
}
}
```

View File

@ -51,18 +51,20 @@
下面的入站配置示例,用大白话说就是:数据按照 `socks` 协议,通过 `10808` 端口,从本机 `127.0.0.1` 流入`Xray`。同时,`Xray` 将这个入站用 `[tag]` 命名为 `inbound-10808`
```json5
"inbounds": [
```json
{
"inbounds": [
{
"tag": "inbound-10808",
"protocol": "socks",
"listen": "127.0.0.1",
"port": 10808,
"settings": {
"udp": true
}
"tag": "inbound-10808",
"protocol": "socks",
"listen": "127.0.0.1",
"port": 10808,
"settings": {
"udp": true
}
}
]
]
}
```
**2.2 出站**
@ -117,18 +119,18 @@
下面的路由配置示例,用大白话说就是:把所有通过 `[tag]="inbound-10808"` 入站流入 `Xray` 的流量,`100%` 全部流转导入 `[tag]="proxy-out-vless"` 的出站,没有任何分流或其他操作。
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": [
"inbound-10808"
],
"outboundTag": "proxy-out-vless"
}
{
"type": "field",
"inboundTag": ["inbound-10808"],
"outboundTag": "proxy-out-vless"
}
]
}
}
```
@ -205,21 +207,23 @@
在上例的基础上,我们已经有了 `[proxy]` 的出站 `"proxy-out-vless"`,所以它保持不变。显而易见,我们需要加入两个新的出站方式:`[block]``[direct]`,如下:
```json5
"outbounds": [
```json
{
"outbounds": [
{
"tag": "proxy-out-vless",
......
"tag": "proxy-out-vless"
// ... ...
},
{
"tag": "block",
"protocol": "blackhole"
"tag": "block",
"protocol": "blackhole"
},
{
"tag": "direct-out",
"protocol": "freedom"
"tag": "direct-out",
"protocol": "freedom"
}
]
]
}
```
上面的配置用大白话翻译如下:
@ -232,32 +236,28 @@
接下来就是见证奇迹的时刻了,我们可以用【路由】的配置把这些连接起来!
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct-out"
},
{
"type": "field",
"domain": [
"geosite:geolocation-!cn"
],
"outboundTag": "proxy-out-vless"
}
{
"type": "field",
"domain": ["geosite:category-ads-all"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct-out"
},
{
"type": "field",
"domain": ["geosite:geolocation-!cn"],
"outboundTag": "proxy-out-vless"
}
]
}
}
```
@ -366,21 +366,23 @@
是不是,非常地简单?
```json5
"outbounds": [
```json
{
"outbounds": [
{
"tag": "direct-out",
"protocol": "freedom"
"tag": "direct-out",
"protocol": "freedom"
},
{
"tag": "proxy-out-vless",
......
"tag": "proxy-out-vless"
// ... ...
},
{
"tag": "block",
"protocol": "blackhole"
"tag": "block",
"protocol": "blackhole"
}
]
]
}
```
此时,路由规则其实变成了:
@ -420,4 +422,4 @@
请确保你已经读懂了上面的内容,因为这样,你就已经理解了【路由】功能的工作逻辑。有了这个基础,我们就可以继续分析【路由】功能更多更详细的配置方式和匹配条件了。
等你看完后面的内容,就完全可以自由的定制属于自己的路由规则啦!还等什么,让我们一起进入 [《路由 (routing) 功能简析(下)》](./routing-lv1-part2) 吧!
等你看完后面的内容,就完全可以自由的定制属于自己的路由规则啦!还等什么,让我们一起进入 [《路由 (routing) 功能简析(下)》](./routing-lv1-part2.md) 吧!

View File

@ -2,7 +2,7 @@
欢迎继续学习 `Xray` 的【路由】功能!
在 [《路由 (routing) 功能简析(上)》](./routing-lv1-part1) 中,我们已经对【路由】功能的工作逻辑有了清晰的理解,也基于 `geosite.dat` 文件做了简单的域名分流配置。
在 [《路由 (routing) 功能简析(上)》](./routing-lv1-part1.md) 中,我们已经对【路由】功能的工作逻辑有了清晰的理解,也基于 `geosite.dat` 文件做了简单的域名分流配置。
如前面所说,域名分流仅仅是【路由】功能的牛刀小试而已。下面就让我们来看看除了域名之外,还什么可以用做分流依据的东西吧!
@ -50,35 +50,31 @@
上述配置如下:
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
// 指定子域名直连
{
"type": "field",
"domain": [
"full:direct.yourdomain.com"
],
"outboundTag": "direct-out"
},
// 指定子域名转发VPS
{
"type": "field",
"domain": [
"full:proxy.yourdomain.com"
],
"outboundTag": "proxy-out-vless"
},
// 指定泛域名转发VPS
{
"type": "field",
"domain": [
"yourdomain.com"
],
"outboundTag": "proxy-out-vless"
}
// 指定子域名直连
{
"type": "field",
"domain": ["full:direct.yourdomain.com"],
"outboundTag": "direct-out"
},
// 指定子域名转发VPS
{
"type": "field",
"domain": ["full:proxy.yourdomain.com"],
"outboundTag": "proxy-out-vless"
},
// 指定泛域名转发VPS
{
"type": "field",
"domain": ["yourdomain.com"],
"outboundTag": "proxy-out-vless"
}
]
}
}
```
@ -92,27 +88,25 @@
上述配置如下:
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
// 本机内部地址、局域网地址直连
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct-out"
},
// 国内IP集直连
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct-out"
}
// 本机内部地址、局域网地址直连
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct-out"
},
// 国内IP集直连
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct-out"
}
]
}
}
```
@ -125,27 +119,25 @@
上述配置如下:
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
// 指定IP地址直连
{
"type": "field",
"ip": [
"223.5.5.5"
],
"outboundTag": "direct-out"
},
// 指定IP地址转发VPS
{
"type": "field",
"ip": [
"1.1.1.1"
],
"outboundTag": "proxy-out-vless"
}
// 指定IP地址直连
{
"type": "field",
"ip": ["223.5.5.5"],
"outboundTag": "direct-out"
},
// 指定IP地址转发VPS
{
"type": "field",
"ip": ["1.1.1.1"],
"outboundTag": "proxy-out-vless"
}
]
}
}
```
@ -157,19 +149,19 @@
你需要打开入站代理中的 `sniffing` 才能使用此种方式分流。
:::
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
// 指定 BT 协议直连
{
"type": "field",
"protocol": [
"bittorrent"
],
"outboundTag": "direct-out"
}
// 指定 BT 协议直连
{
"type": "field",
"protocol": ["bittorrent"],
"outboundTag": "direct-out"
}
]
}
}
```
@ -205,69 +197,58 @@
`[1-block] --> [2-direct] --> [3-proxy] --> [4-first-outbound]`
:::
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
// [1-block 广告流量屏蔽]
// 1.1 广告域名集屏蔽
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
// [2-direct 国内流量直连]
// 2.1 国内域名集、指定子域名直连
{
"type": "field",
"domain": [
"geosite:cn",
"full:direct.yourdomain.com"
],
"outboundTag": "direct-out"
},
// 2.2 本机内部地址+局域网、国内IP、指定IP直连
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn",
"223.5.5.5"
],
"outboundTag": "direct-out"
},
// 2.3 BT协议流量直连
{
"type": "field",
"protocol": [
"bittorrent"
],
"outboundTag": "direct-out"
},
// [3-proxy 国外流量转发VPS]
// 3.1 国外域名集、指定子域名、指定泛域名转发VPS
{
"type": "field",
"domain": [
"geosite:geolocation-!cn",
"full:proxy.yourdomain.com",
"yourdomain.com"
],
"outboundTag": "proxy-out-vless"
},
// 3.2 指定IP转发VPS
{
"type": "field",
"ip": [
"1.1.1.1"
],
"outboundTag": "proxy-out-vless"
}
// [4-default-routing 第一条出站]
// 没有匹配到任何规则的流量,默认使用第一条出站处理
// [1-block 广告流量屏蔽]
// 1.1 广告域名集屏蔽
{
"type": "field",
"domain": ["geosite:category-ads-all"],
"outboundTag": "block"
},
// [2-direct 国内流量直连]
// 2.1 国内域名集、指定子域名直连
{
"type": "field",
"domain": ["geosite:cn", "full:direct.yourdomain.com"],
"outboundTag": "direct-out"
},
// 2.2 本机内部地址+局域网、国内IP、指定IP直连
{
"type": "field",
"ip": ["geoip:private", "geoip:cn", "223.5.5.5"],
"outboundTag": "direct-out"
},
// 2.3 BT协议流量直连
{
"type": "field",
"protocol": ["bittorrent"],
"outboundTag": "direct-out"
},
// [3-proxy 国外流量转发VPS]
// 3.1 国外域名集、指定子域名、指定泛域名转发VPS
{
"type": "field",
"domain": [
"geosite:geolocation-!cn",
"full:proxy.yourdomain.com",
"yourdomain.com"
],
"outboundTag": "proxy-out-vless"
},
// 3.2 指定IP转发VPS
{
"type": "field",
"ip": ["1.1.1.1"],
"outboundTag": "proxy-out-vless"
}
// [4-default-routing 第一条出站]
// 没有匹配到任何规则的流量,默认使用第一条出站处理
]
}
}
```
@ -325,21 +306,19 @@
为了实现上面的目标,他写出了以下路由规则:
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": [
"223.5.5.5"
],
"domain": [
"full:direct.yourdomain.com"
],
"outboundTag": "direct-out"
}
{
"type": "field",
"ip": ["223.5.5.5"],
"domain": ["full:direct.yourdomain.com"],
"outboundTag": "direct-out"
}
]
}
}
```
@ -357,25 +336,23 @@
正确示范,自然就是将不同的匹配依据独立出来:
```json5
"routing": {
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"ip": [
"223.5.5.5"
],
"outboundTag": "direct-out"
},
{
"type": "field",
"domain": [
"full:direct.yourdomain.com"
],
"outboundTag": "direct-out"
}
{
"type": "field",
"ip": ["223.5.5.5"],
"outboundTag": "direct-out"
},
{
"type": "field",
"domain": ["full:direct.yourdomain.com"],
"outboundTag": "direct-out"
}
]
}
}
```

View File

@ -10,6 +10,14 @@
基于 Xray 的透明代理TProxy配置完整教程。
[TProxy 透明代理ipv4 and ipv6配置教程](./tproxy_ipv4_and_ipv6.md) by <img src="https://avatars.githubusercontent.com/u/110686480?s=32" width="32" height="32" alt="a"/> [@SQLimit](https://github.com/SQLimit)
基于 Xray 的 TProxy 透明代理ipv4 and ipv6配置教程
[Nginx_TLS 隧道隐藏指纹](./Nginx_TLS_tunnel.md) by <img src="https://avatars.githubusercontent.com/u/110686480?s=32" width="32" height="32" alt="a"/> [@SQLimit](https://github.com/SQLimit)
双端使用 Nginx_TLS 隧道隐藏指纹
[[透明代理]通过 gid 规避 Xray 流量](./iptables_gid.md) by <img src="https://avatars2.githubusercontent.com/u/57820613?s=32" width="32" height="32" alt="a"/> [@kirin](https://github.com/kirin10000)
在 iptables/nftables 实现的透明代理中,一种新的规避 Xray 流量的方式。

View File

@ -0,0 +1,298 @@
---
title: Nginx_TLS隧道隐藏指纹
---
# 客户端服务端构建 Nginx 隧道隐藏指纹
网路结构:
xray_client ---tcp--- nginx_client ---tcp_TLS--- nginx_sever ---tcp--- xray_server
## 编译 nginx --with-stream
在客户端及服务端均编译
`curl -O -L http://nginx.org/download/nginx-1.22.1.tar.gz`
`tar -zxvf nginx-1.22.1.tar.gz`
`cd nginx-1.22.1`
`apt install gcc make` //编译依赖 gcc 以及 make
`./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-stream --with-stream_ssl_module` //此步需要依赖一些库,根据报错安装相应 lib
`make && make install`
编译之后 nginx 文件夹位于 `/usr/local/nginx`
## 配置 nginx
编辑 nginx 配置文件 nginx.conf
`vim /usr/local/nginx/conf/nginx.conf`
服务端加入如下配置
服务器申请证书不再赘述,参考[白话文](https://xtls.github.io/document/level-0/ch06-certificates.html)
```
stream {
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_protocols TLSv1.3;
ssl_certificate /path/to/cert/domain.crt; #crt文件位置
ssl_certificate_key /path/to/cert/domain.key; #key文件位置
proxy_pass unix:/dev/shm/vless.sock; #使用 domain socket
}
}
```
::: warning 注意
stream 部分与 http 模块并列,客户端可删除 http 部分,服务端可删除或搭建网页伪装回落
:::
客户端加入如下配置
```
stream {
server {
listen 6666;
listen [::]:6666;
proxy_ssl on;
proxy_ssl_protocols TLSv1.3;
proxy_ssl_server_name on;
proxy_ssl_name yourdomain.domain; #服务器域名
proxy_pass ip:443; #服务器 ip 形如 proxy_pass 6.6.6.6:443; 或 proxy_pass [2401:0:0::1]:443;
}
}
```
`/etc/systemd/system` 文件夹中创建 `nginx.service` 文件
`vim /etc/systemd/system/nginx.service`
写入如下
```
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
After=xray.service
[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
```
加入开机自启
`systemctl enable nginx`
## xray 配置
服务端 xray 配置
```
{
"log": {
"loglevel": "none"
},
"inbounds": [
{
"listen": "/dev/shm/vless.sock,0666",
"protocol": "vless",
"settings": {
"clients": [
{
"id": "uuid"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp"
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
```
客户端 xray 配置,此处以旁路由透明代理为例
```
{
"log": {
"loglevel": "none"
},
"inbounds": [
{
"tag": "tproxy-in",
"port": 12345,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
],
"routeOnly": true
},
"streamSettings": {
"sockopt": {
"tproxy": "tproxy",
"mark": 255
}
}
},
{
"tag": "http",
"port": 10808,
"listen": "127.0.0.1",
"protocol": "http",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
}
],
"outbounds": [
{
"tag": "nginxtls",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "127.0.0.1",
"port": 6666,
"users": [
{
"id": "uuid",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"sockopt": {
"mark": 255
},
"network": "tcp"
}
},
{
"tag": "direct",
"protocol": "freedom",
"streamSettings": {
"sockopt": {
"mark": 255
}
}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {
"response": {
"type": "http"
}
}
}
],
"routing": {
"domainMatcher": "mph",
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"port": 123,
"network": "udp",
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"protocol": [
"bittorrent"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"inboundTag": [
"tproxy-in"
],
"outboundTag": "nginxtls"
}
]
}
}
```
如果使用透明代理需要在 iptables 或 ip6tables 配置中加入
```
iptables -t mangle -A XRAY_MASK -d VSP_IPv4/32 -j RETURN
ip6tables -t mangle -A XRAY6_MASK -d VPS_IPv6/128 -j RETURN
```
## 客户端及服务端启动服务
`systemctl restart xray`
`systemctl restart nginx`
## 后记
客户端应该也是可以通过 domain socket 连接提高性能,但由于 xray outbound 不支持 ds 出站,想了半天没什么好的实现方法。如果 vnext 里支持 ds 就好了 (没有别的意思)。
从客户端 nginx 开始应该可以选择 http2 grpc ws 等传输方式。

View File

@ -340,7 +340,7 @@ Documentation=man:netfilter-persistent(8)
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start ; /usr/sbin/ip route add local default dev lo table 100 ; /usr/sbin/ip rule add fwmark 1 table 100
ExecStop=/usr/sbin/netfilter-persistent stop ; /usr/sbin/ip route del local default dev lo table 100 ; /usr/sbin/ip rule del table 100
ExecStop=/usr/sbin/netfilter-persistent stop ; /usr/sbin/ip route flush dev lo table 100 ; /usr/sbin/ip rule del table 100
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,581 @@
---
title: TProxy 透明代理 (ipv4 and ipv6)
---
# TProxy 透明代理ipv4 and ipv6配置教程
本配置参考了[TProxy 透明代理的新 V2Ray 白话文教程](https://guide.v2fly.org/app/tproxy.html)[透明代理TProxy配置教程](https://xtls.github.io/document/level-2/tproxy.html#%E5%BC%80%E5%A7%8B%E4%B9%8B%E5%89%8D)以及[透明代理通过 gid 规避 Xray 流量](https://xtls.github.io/document/level-2/iptables_gid.html),加入了透明代理对 ipv6 的支持,并且使用 VLESS-TCP-XTLS-RPRX-Vision 方案对抗封锁 (推荐使用 1.7.2 及之后版本)。
关于 Xray 的配置并不是本文重点,使用者可依实际情况进行修改,具体可以参考[官方文档示例](https://github.com/XTLS/Xray-examples)或其他优秀示例 比如[@chika0801](https://github.com/chika0801/Xray-examples) 又如[@lxhao61](https://github.com/lxhao61/integrated-examples)。
::: warning 注意
若使用其他配置,你需要着重注意客户端配置中 `outbound``tag``proxy` 的部分,其他部分不变
服务端配置也要同时改变
:::
此配置意在解决例如 Netflix 等默认使用 ipv6 连接的网站无法通过旁路由进行代理的问题,或对 ipv6 代理有需要。
本文网络结构为单臂旁路由
本文中所有配置已在 Arch Linux (Kernel: 6.0.10) 环境下测试成功,如在其它环境中同理
注意安装相应程序 `# sudo apt install iptables ip6tables``# sudo apt install nftables`
若旁路由未安装 xray 程序,可以手动下载相应 xray 程序如 [Xray-linux-64.zip](https://github.com/XTLS/Xray-core/releases/download/v1.7.0/Xray-linux-64.zip) ,然后复制 [install-release.sh](https://github.com/XTLS/Xray-install/blob/main/install-release.sh) 文件到旁路由,赋予可执行权限 `# chmod 700 install-release.sh`,然后使用 `# ./install-release.sh --local Xray-linux-64.zip` 根据提示进行本地安装。
## Xray 配置
### 客户端配置
```json
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "all-in",
"port": 12345,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp,udp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"]
},
"streamSettings": {
"sockopt": {
"tproxy": "tproxy",
"mark": 255
}
}
},
{
"port": 10808,
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"]
},
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
//此为默认outbound路由(routing)模块若未匹配到任何规则,则默认走此 proxy 出口,如果你希望直连国内优先请将下面 direct 出口放到 outbound 第一,看不懂可忽略
"tag": "proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "yourdomain.domain", //改为你自己的域名直接填写ipv4或ipv6地址也可以
"port": 443,
"users": [
{
"id": "uuid", //填写uuid可通过在终端中输入 xray uuid 生成此处也支持任意字符串https://xtls.github.io/config/inbounds/vless.html#clientobject
"encryption": "none",
"flow": "xtls-rprx-vision"
}
]
}
]
},
"streamSettings": {
"sockopt": {
"mark": 255
},
"network": "tcp",
"security": "tls", //注意使用 xtls-rprx-vision 流控此处需为 tls
"tlsSettings": {
//注意使用 xtls-rprx-vision 流控此处需为 tlsSettings
"allowInsecure": false,
"serverName": "yourdomain.domain", //改为你自己的域名
"fingerprint": "chrome" //此设置建议先看下Release, https://github.com/XTLS/Xray-core/releases/tag/v1.7.3
}
}
},
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIP"
},
"streamSettings": {
"sockopt": {
"mark": 255
}
}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {
"response": {
"type": "http"
}
}
},
{
"tag": "dns-out",
"protocol": "dns",
"streamSettings": {
"sockopt": {
"mark": 255
}
}
}
],
"dns": {
"hosts": {
"domain:googleapis.cn": "googleapis.com",
"dns.google": "8.8.8.8",
"你的VPS域名": "你的VSP IP" //如果 outbound 的 proxy 里 address 填的域名希望代理走ipv4这里 VPS IP 填VPS的ipv4, 希望代理走ipv6这里VPS IP 填VPS的ipv6outbound 的 proxy 里 address 填的 IP这行不用写。
},
"servers": [
"https://1.1.1.1/dns-query",
{
"address": "119.29.29.29",
"domains": ["geosite:cn"],
"expectIPs": ["geoip:cn"]
},
"https://dns.google/dns-query",
"223.5.5.5",
"localhost"
]
},
"routing": {
"domainMatcher": "mph",
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["geosite:category-ads-all"],
"outboundTag": "block"
},
{
"type": "field",
"inboundTag": ["all-in"],
"port": 123,
"network": "udp",
"outboundTag": "direct"
},
{
"type": "field",
"inboundTag": ["all-in"],
"port": 53,
"network": "udp",
"outboundTag": "dns-out"
},
{
"type": "field",
"ip": ["119.29.29.29", "223.5.5.5"],
"outboundTag": "direct"
},
{
"type": "field",
"protocol": ["bittorrent"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:private", "geoip:cn"], //此处可加入 VPS IP 避免 ssh 时被代理
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["1.1.1.1", "8.8.8.8"],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:geolocation-!cn",
"domain:googleapis.cn",
"dns.google"
],
"outboundTag": "proxy"
}
]
}
}
```
### 服务端配置
```json
{
"log": {
"loglevel": "warning"
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
//阻止 cnip 提高安全性,或者可以将 cn 流量导入 warp 中详见https://xtls.github.io/document/level-2/warp.html
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "block"
}
]
},
"inbounds": [
{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "uuid", //与客户端相同
"flow": "xtls-rprx-vision"
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 8080 //回落,需要 web 配合,参见白话文,不设置也行
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"certificates": [
{
"certificateFile": "/etc/ssl/private/fullchain.crt",
"keyFile": "/etc/ssl/private/crt.key" //参照小小白话文将生成的 fullchain.crt 以及 cert.key证书的路径相应填于此处(https://xtls.github.io/document/level-0/ch06-certificates.html#_6-4-%E6%AD%A3%E5%BC%8F%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7)
}
]
}
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
{
"protocol": "freedom",
"tag": "direct"
},
{
"protocol": "blackhole",
"tag": "block"
}
]
}
```
## Netfilter 配置
### 首先设置策略路由
```bash
# 设置策略路由 v4
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100
# 设置策略路由 v6
ip -6 rule add fwmark 1 table 106
ip -6 route add local ::/0 dev lo table 106
# 直连从主路由发出
ip route add default via 192.168.31.1 #写主路由 ipv4, 采用局域网设备上网设置方法一可不写此命令
ip -6 route add default via fd00:6868:6868::1 #写主路由 ipv6, 采用局域网设备上网设置方法一可不写此命令
```
::: tip 使用方法
直接将命令复制到旁路由终端执行
:::
::: tip 关于直连从主路由发出
在旁路由使用命令`ip route show`,如果使用下属方法一,则`default via`后应是主路由 ip无需更改如使用下述方法二`default via`后应是旁路由 ip此时直连网站 DNS 解析会回环,造成直连网站无法访问,因此需指定为主路由 ip。
:::
如果是在路由器上指定了默认网关为旁路由(亦即下述“局域网设备上网设置方法二”),那么就需要设置上述 `# 直连从主路由发出` ,除了通过 iproute2 命令行方式设置,也可以通过 dhcpcd 或者 systemctl-network 设置静态 IP这里以 dhcpcd 为例,编辑 `/etc/dhcpcd.conf` 文件,在最下方加入如下配置,具体 IP 根据你的实际情况修改,其中 `interface` 可以通过 `# ip link show` 查看要设定的网口或者无线设备。
```
interface enp0s25
static ip_address=192.168.31.100/24
static ip6_address=fd00:6868:6868::8888/64
static routers=192.168.31.1
static domain_name_servers=192.168.31.1 fd00:6868:6868::1
```
这样通过静态 IP 设置 IP 及网关后就无需每次开机设置 `# 直连从主路由发出`
::: warning 注意
以下 nftables 配置与 iptables 配置二选一,不可同时使用。
:::
### 使用 iptables
此处配置将 ipv4 与 ipv6 写在同一文件中。
```bash
# 代理局域网设备 v4
iptables -t mangle -N XRAY
iptables -t mangle -A XRAY -d 127.0.0.1/32 -j RETURN
iptables -t mangle -A XRAY -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A XRAY -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p tcp -j RETURN
iptables -t mangle -A XRAY -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A XRAY -j RETURN -m mark --mark 0xff
iptables -t mangle -A XRAY -p udp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
iptables -t mangle -A XRAY -p tcp -j TPROXY --on-ip 127.0.0.1 --on-port 12345 --tproxy-mark 1
iptables -t mangle -A PREROUTING -j XRAY
# 代理局域网设备 v6
ip6tables -t mangle -N XRAY6
ip6tables -t mangle -A XRAY6 -d ::1/128 -j RETURN
ip6tables -t mangle -A XRAY6 -d fe80::/10 -j RETURN
ip6tables -t mangle -A XRAY6 -d fd00::/8 -p tcp -j RETURN
ip6tables -t mangle -A XRAY6 -d fd00::/8 -p udp ! --dport 53 -j RETURN
ip6tables -t mangle -A XRAY6 -j RETURN -m mark --mark 0xff
ip6tables -t mangle -A XRAY6 -p udp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
ip6tables -t mangle -A XRAY6 -p tcp -j TPROXY --on-ip ::1 --on-port 12345 --tproxy-mark 1
ip6tables -t mangle -A PREROUTING -j XRAY6
# 代理网关本机 v4
iptables -t mangle -N XRAY_MASK
iptables -t mangle -A XRAY_MASK -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A XRAY_MASK -d 255.255.255.255/32 -j RETURN
iptables -t mangle -A XRAY_MASK -d 192.168.0.0/16 -p tcp -j RETURN
iptables -t mangle -A XRAY_MASK -d 192.168.0.0/16 -p udp ! --dport 53 -j RETURN
iptables -t mangle -A XRAY_MASK -j RETURN -m mark --mark 0xff
iptables -t mangle -A XRAY_MASK -p udp -j MARK --set-mark 1
iptables -t mangle -A XRAY_MASK -p tcp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -j XRAY_MASK
# 代理网关本机 v6
ip6tables -t mangle -N XRAY6_MASK
ip6tables -t mangle -A XRAY6_MASK -d fe80::/10 -j RETURN
ip6tables -t mangle -A XRAY6_MASK -d fd00::/8 -p tcp -j RETURN
ip6tables -t mangle -A XRAY6_MASK -d fd00::/8 -p udp ! --dport 53 -j RETURN
ip6tables -t mangle -A XRAY6_MASK -j RETURN -m mark --mark 0xff
ip6tables -t mangle -A XRAY6_MASK -p udp -j MARK --set-mark 1
ip6tables -t mangle -A XRAY6_MASK -p tcp -j MARK --set-mark 1
ip6tables -t mangle -A OUTPUT -j XRAY6_MASK
# 新建 DIVERT 规则,避免已有连接的包二次通过 TPROXY理论上有一定的性能提升 v4
iptables -t mangle -N DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT
# 新建 DIVERT 规则,避免已有连接的包二次通过 TPROXY理论上有一定的性能提升 v6
ip6tables -t mangle -N DIVERT
ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -I PREROUTING -p tcp -m socket -j DIVERT
```
::: tip 使用方法
将上述配置写入一个文件(如 `iptables.rules`),之后将该文件赋予可执行权限`# chmod 700 ./iptables.rules`
最后使用 root 权限执行该文件即可:`# ./iptables.rules``# source iptables.rules`
:::
### 使用 nftables
此处合并 ipv4 与 ipv6
```
#!/usr/sbin/nft -f
flush ruleset
table inet xray {
chain prerouting {
type filter hook prerouting priority filter; policy accept;
ip daddr { 127.0.0.0/8, 224.0.0.0/4, 255.255.255.255 } return
meta l4proto tcp ip daddr 192.168.0.0/16 return
ip daddr 192.168.0.0/16 udp dport != 53 return
ip6 daddr { ::1, fe80::/10 } return
meta l4proto tcp ip6 daddr fd00::/8 return
ip6 daddr fd00::/8 udp dport != 53 return
meta mark 0x000000ff return
meta l4proto { tcp, udp } meta mark set 0x00000001 tproxy ip to 127.0.0.1:12345 accept
meta l4proto { tcp, udp } meta mark set 0x00000001 tproxy ip6 to [::1]:12345 accept
}
chain output {
type route hook output priority filter; policy accept;
ip daddr { 127.0.0.0/8, 224.0.0.0/4, 255.255.255.255 } return
meta l4proto tcp ip daddr 192.168.0.0/16 return
ip daddr 192.168.0.0/16 udp dport != 53 return
ip6 daddr { ::1, fe80::/10 } return
meta l4proto tcp ip6 daddr fd00::/8 return
ip6 daddr fd00::/8 udp dport != 53 return
meta mark 0x000000ff return
meta l4proto { tcp, udp } meta mark set 0x00000001 accept
}
chain divert {
type filter hook prerouting priority mangle; policy accept;
meta l4proto tcp socket transparent 1 meta mark set 0x00000001 accept
}
}
```
::: tip 使用方法
将上述配置写入一个文件(如 `nftables.rules`),之后将该文件赋予可执行权限`# chmod 700 ./nftables.rules`
最后使用 root 权限执行该文件即可:`# ./nftables.rules``# source nftables.rules`
:::
其中,网关地址`192.168.0.0/16`, `fd00::/8`等可由`ip address | grep -w inet | awk '{print $2}'`以及`ip address | grep -w inet6 | awk '{print $2}'`[获得](https://xtls.github.io/document/level-2/iptables_gid.html#_4-%E8%AE%BE%E7%BD%AE-iptables-%E8%A7%84%E5%88%99)
或者在 windows 网络设置中查看。
又或者在路由器“上网设置”中查看。
如果前缀`192.168`, `fd00:`相同可不更改,若不同如 `fc00:`, `fe00:` 等则更改为相应值,写法可通过 Goolge 搜索得到如 `fc00::/7`, `fe00::/9`
### 开机自动运行 Netfilter 配置
首先确认已经运行过上述相应 Netfilter 命令,并且成功测试透明代理配置,以确保接下来输出正确的文件。
#### 若使用 iptables 配置
1. 首先通过 `# iptables-save > /root/iptables.rulesv4` `# ip6tables-save > /root/iptables.rulesv6` 将 iptables 配置写入 `iptables.rulesv4``iptables.rulesv6` 文件中
2. 然后在 `/etc/systemd/system/` 目录下创建一个名为 `tproxyrules.service` 的文件,添加以下内容并保存
```
[Unit]
Description=Tproxy rules
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; \
/sbin/ip -6 rule add fwmark 1 table 106 ; \
/sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route add local ::/0 dev lo table 106 ; \
/sbin/ip route add default via 192.168.31.1 ; \
/sbin/ip -6 route add default via fd00:6868:6868::1 ; \
/sbin/iptables-restore /root/iptables.rulesv4 ; \
/sbin/ip6tables-restore /root/iptables.rulesv6
ExecStop=/sbin/ip rule del fwmark 1 table 100 ; \
/sbin/ip -6 rule del fwmark 1 table 106 ; \
/sbin/ip route del local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route del local ::/0 dev lo table 106 ; \
/sbin/ip route del default via 192.168.31.1 ; \
/sbin/ip -6 route del default via fd00:6868:6868::1 ; \
/sbin/iptables -t mangle -F ; \
/sbin/ip6tables -t mangle -F
[Install]
WantedBy=multi-user.target
```
3. 最后执行 `systemctl enable tproxyrules` 命令。
#### 如果使用 nftables 配置
1. 首先通过 `# nft list ruleset > /root/nftables.rulesv46` 将 nftables 配置写入 `nftables.rulesv46` 文件中
2. 在 `/etc/systemd/system/` 目录下创建一个名为 `tproxyrules.service` 的文件,然后添加以下内容并保存
```
[Unit]
Description=Tproxy rules
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'
ExecStart=/sbin/ip rule add fwmark 1 table 100 ; \
/sbin/ip -6 rule add fwmark 1 table 106 ; \
/sbin/ip route add local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route add local ::/0 dev lo table 106 ; \
/sbin/ip route add default via 192.168.31.1 ; \
/sbin/ip -6 route add default via fd00:6868:6868::1 ; \
/sbin/nft -f /root/nftables.rulesv46 ;
ExecStop=/sbin/ip rule del fwmark 1 table 100 ; \
/sbin/ip -6 rule del fwmark 1 table 106 ; \
/sbin/ip route del local 0.0.0.0/0 dev lo table 100 ; \
/sbin/ip -6 route del local ::/0 dev lo table 106 ; \
/sbin/ip route del default via 192.168.31.1 ; \
/sbin/ip -6 route del default via fd00:6868:6868::1 ; \
/sbin/nft flush ruleset
[Install]
WantedBy=multi-user.target
```
3. 最后执行 `systemctl enable tproxyrules` 命令。
::: tip tproxyrules.service
注意其中主路由器 IP 地址,根据实际修改
`ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'` 命令为确保获得 IP 地址后再执行命令,否则会诡异报错,其中 IP 地址为主路由器地址,根据实际修改。
:::
::: warning 注意
如果通过 dhcpcd 等设置了静态 IP 及网关,则上述相关 `ip route add/del` 设置需删除
:::
## 局域网设备上网设置
此处假定旁路由 ipv4, ipv6 地址分别为`192.168.31.100`, `fd00:6868:6868::8866`, 旁路由的 ipv4, ipv6 地址可由命令`ip add`获得。
### 方法一
局域网设备上网有两种方式,第一种就是在使用设备上进行静态 IP 的配置,将网关指向旁路由 IP。注意绝大部分手机仅支持手动配置 ipv4 网关,不支持手动配置 ipv6 网关,除非 root 后进行相关设置。
以 windows 设备为例,可以先开启 DHCP 记录自动分配的 IP 以参考,然后手写静态配置。
::: tip DNS 设置
此配置劫持 DNS 流量DNS 可以随便写
:::
<img width="231" alt="image" src="https://user-images.githubusercontent.com/110686480/208310266-632e36b9-a23b-4b90-aa28-583b50e87c66.png"> <img width="238" alt="image" src="https://user-images.githubusercontent.com/110686480/208309659-e3172218-ef27-4a94-a017-225f8e05b611.png">
### 方法二
局域网设备上网的第二种方式,是在路由器上进行网关设置,这种方法对于连接到此路由器的设备无需做任何设置即可科学上网,但注意有些路由器不支持 ipv6 的网关设置,有 ipv6 需求的设备仍需在所需设备上单独手动配置 ipv6 相关设置参考方法一。
<img width="700" alt="image" src="https://user-images.githubusercontent.com/110686480/208310174-2245a890-eb6b-4341-899f-81c6ac8255ff.png">
## Finally
按照以上方法设置后设备即可双栈访问,进入测试网站比如 https://ipv6-test.com/ 可以看到如下结果 (需要代理此网站才能看到如下结果)
<img width="700" alt="image" src="https://user-images.githubusercontent.com/110686480/208743723-f8a2751b-43d0-4353-9383-5ae0e00e9449.png">
## 写在最后
如今 ipv6 并未完全普及,我们日常访问的流量 99%仍为 ipv4 流量;很多 VPS 商家虽然提供 ipv6 地址,但线路优化非常垃圾,甚至处于不可用状态,为何要加入 ipV6 的设置?
可以看到目前 ipv6 处于很尴尬的境地,各种设备对于 ipv6 的支持很烂,但是都在逐步完善,同时 Windows 系统对于 ipv6 的优先级也在提高,很多浏览器也会优先进行 ipv6 的解析以及访问,很多网站也开始默认使用 ipv6 进行访问(比如 Netflix, 如果没有配置 ipv6, 浏览器打开 Netflix 会显示 Not Available 是因为没有代理 Netflix 的 ipv6 请求,当然可以选择禁用 Windows 的 ipv6但支持 ipv6 的 pt 站就无法使用)
这种情况下 ipv4 无法完全胜任网络冲浪的需求,即使是那 1%的流量,遇到了也会让人头疼不已。
而可以预见 ipv6 也会逐步与 ipv4 分庭抗礼,所以有必要加入 ipv6 的设置。

View File

@ -71,7 +71,7 @@ _XRAY=/usr/local/bin/xray
apidata () {
local ARGS=
if [[ $1 == "reset" ]]; then
ARGS="reset: true"
ARGS="-reset=true"
fi
$_XRAY api statsquery --server=$_APISERVER "${ARGS}" \
| awk '{

View File

@ -9,10 +9,10 @@ Xray1.6.5+)新加入了 WireGuard 出站,虽然增加的代码和依赖
1. 通过近期的一些讨论和[实验](https://github.com/net4people/bbs/issues/129#issuecomment-1308102504),我们知道代理回国流量是不安全的。一种应对方式是将回国流量路由至黑洞,它的缺点是由于 geosite 和 geoip 更新的不及时或者新手不知道如何在客户端适当分流,结果流量进入黑洞,影响使用体验。
这时我们只需要将回国流量导入 Cloudflare Warp可以在不影响使用体验的情况下达到同样的安全性。
2. 众所周知,大部分机场会记录用户访问域名的日志,某些机场还会审计和阻断一些用户流量。保护用户私密性的一个方法,就是在客户端使用链式代理。
Warp 使用的 WireGuard 轻量级 VPN 协议会在代理层内增加一层加密。对于机场而言,用户所有流量的目标都是 Wrap从而最大程度保护自己的隐私。
Warp 使用的 WireGuard 轻量级 VPN 协议会在代理层内增加一层加密。对于机场而言,用户所有流量的目标都是 Warp从而最大程度保护自己的隐私。
3. 方便使用,只需要一个 core 即可完成分流Wireguard Tun链式代理的设置。
## 申请 Wrap 账户
## 申请 Warp 账户
1. 感谢 Cloudflare 推动自由的互联网,现在你可以免费使用 Warp 服务,连接的时候会根据出口自动选择最近的服务器
2. 使用一台 vps下载 [wgcf](https://github.com/ViRb3/wgcf/releases)
@ -42,6 +42,7 @@ Endpoint = engage.cloudflareclient.com:2408
"protocol": "wireguard",
"settings": {
"secretKey": "我的私钥",
"address": ["172.16.0.2/32", "2606:4700:110:8949:fed8:2642:a640:c8e1/128"],
"peers": [
{
"publicKey": "Warp公钥",
@ -53,6 +54,8 @@ Endpoint = engage.cloudflareclient.com:2408
}
```
路由策略推荐`IPIfNonMatch`
在现有路由中新增以下
```json