2023-03-04 11:39:44 -05:00

101 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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](../transport.md#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](../transport.md#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 功能简析](../../document/level-1/fallbacks-lv1)
## Fallbacks 设计理论 <Badge text="WIP" type="warning"/>