在使用Xray的过程中,fallback(回落)功能是非常强大的。本文简要说明一下这个功能的逻辑以及使用方式。

认识回落

以下面这段配置代码为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
"inbounds": [
    {
        "port": 443,
        "protocol": "vless",
        "settings": {
            "clients": [
                ...
            ],
            "decryption": "none",
            "fallbacks": [
                {
                    "dest": 8080 // 默认回落到防探测的代理
                }
            ]
        },
        "streamSettings": {
            ...
        }
    }
]

这段配置解释如下:

  1. Xray的入站端口[inbound port]443,即由Xray负责监听443端口的HTTPS流量。

  2. Xray的入站协议[inbound protocol]vless,只有vless协议的流量才会流入Xray中做后续处理。(VLESS这个轻量协议开发的初衷就是给xrayv2fly等核心引入回落功能、并同时减少冗余校验/加密。目前为止,xray中的trojan协议也已完整支持回落功能。)

  3. 回落目标端口[fallback dest]8080Xray接受443端口的访问流量后,属于vless协议的流量,由Xray进行内部处理并转发至出站模块。而其他非vless协议的流量,则转发至8080端口。

  4. 回落给8080端口的流量,由后续程序处理,通常由NginxCaddy处理。

完整数据路线如下:

基于上面的示例,可以了解什么是回落(What)和怎么回落(How),简单地说就是下面这几个要素:

  1. 回落的时间是流量进入Xray监听端口后;
  2. 回落的依据是协议类型等流量特征;
  3. 回落的目标是某个端口
  4. 被回落的流量由监听回落端口的后续程序接手。

为什么要回落

最初,是为了防御主动探测(Active Probing)。

主动探测: 简单粗暴的理解,就是指外部通过发送特定的网络请求,并解读服务器的回应内容,来推测服务器端是否运行了xray, v2fly, shadowsocks等代理工具。一旦可以准确认定,则服务器可能受到干扰或阻断。

之所以可以根据服务器回应内容进行解读,就是因为一次完整的数据请求,其实有很多数据交换的步骤,每一个步骤,都会产生一些软件特征。也说就是:

  • 正常的网站的回应,一定会有类似Nginx, Apache, MySQL的Web服务、数据库等工具的特征。
  • 正常的网站的回应,一定不会有类似xray, v2fly, shadowsocks等代理工具的特征。

于是,当我们给Xray提供了回落功能后(如上例,回落给 Nginx),面对任何用来探测的请求,产生的结果是:

  • 探测流量无法掌握你的VLESS要素,故都会被回落至Nginx
  • 探测流量全都回落进入Nginx,故VPS服务器的回应一定会有Nginx的特征。
  • 因为Xray本身不对探测流量做任何回应,所以VPS的回应一定不会有Xray的特征。

至此,回落功能就从数据交互逻辑上解决了服务器被主动探测的安全隐患。

重新认识回落

为什么要再次认识回落呢?因为上面仅仅说清楚了基于协议的,抵抗主动探测的回落。

rprx不断开发迭代VLESS协议及fallback功能的过程种,逐渐发现,回落完全可以更加灵活强大,只要在保证抵抗主动探测的前提下,充分利用数据首包中的信息,其实可以做到多元素、多层次的回落。

基于这个开发理念,回落功能逐渐完善,完成了纯伪装 --> ws分流 --> 多协议多特征分流的进化。最终版甚至完全替代了以前要用Web服务器、其他工具才能完成的分流的功能。且由于上述的回落/分流处理都在首包判断阶段以毫秒级的速度完成,不涉及任何数据操作,所以几乎没有任何过程损耗。

因此,现在完整的回落功能,同时具备下述属性:

  • 安全: 充分抵御主动探测攻击
  • 高效: 几乎毫无性能损失
  • 灵活: 数据灵活分流、常用端口复用(如443)

多层回落示例及解读

理解了完整的回落功能,就可以配置多层回落了。其实,项目已经提供了非常完整的示例,即官方模板中的VLESS-TCP-XTLS-WHATEVER

服务器配置的443监听段摘抄如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{
    "port": 443,
    "protocol": "vless",
    "settings": {
        "clients": [
            {
                    "id": "", // 填写你的 UUID
                    "flow": "xtls-rprx-direct",
                    "level": 0,
                    "email": "love@example.com"
            }
        ],
        "decryption": "none",
        "fallbacks": [
            {
                "dest": 1310, // 默认回落到 Xray  Trojan 协议
                "xver": 1
            },
            {
                "path": "/websocket", // 必须换成自定义的 PATH
                "dest": 1234,
                "xver": 1
            },
            {
                "path": "/vmesstcp", // 必须换成自定义的 PATH
                "dest": 2345,
                "xver": 1
            },
            {
                "path": "/vmessws", // 必须换成自定义的 PATH
                "dest": 3456,
                "xver": 1
            }
        ]
    },
    "streamSettings": {
        "network": "tcp",
        "security": "xtls",
        "xtlsSettings": {
            "alpn": [
                "http/1.1"
            ],
            "certificates": [
                {
                    "certificateFile": "/path/to/fullchain.crt", // 换成你的证书,绝对路径
                    "keyFile": "/path/to/private.key" // 换成你的私钥,绝对路径
                }
            ]
        }
    }
},

这段配置解释如下:

  1. Xray的入站端口(inbound port)443,即由Xray负责监听443端口的HTTPS流量,并使用certificates项下设定的TLS证书来进行验证。

  2. Xray的入站协议(inbound protocol)vlessvless协议流量直接流入Xray中做后续处理。

  3. VLESS协议流量有4个不同的回落目标:

    a. pathwebsocket的流量,回落给端口1234后续处理; b. pathvmesstcp的流量,回落给端口2345后续处理; c. pathvmessws的流量,回落给端口3456后续处理; d. 其它所有流量,回落给端口1310后续处理。

  4. xver1表示开启proxy protocol功能,向后传递来源真实IP。

上述回落结构如下图所示:

后续监听处理的配置段摘抄如下:

1、后续处理回落至1310端口的流量,按照下面的配置验证、处理:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
    "port": 1310,
    "listen": "127.0.0.1",
    "protocol": "trojan",
    "settings": {
        "clients": [
            {
                "password": "", // 填写你的密码
                "level": 0,
                "email": "love@example.com"
            }
        ],
        "fallbacks": [
            {
                "dest": 80 // 或者回落到其它也防探测的代理
            }
        ]
    },
    "streamSettings": {
        "network": "tcp",
        "security": "none",
        "tcpSettings": {
            "acceptProxyProtocol": true
        }
    }
},

这里trojan协议又出现了一个新的fallbacks。前面已经说过,xray中的trojan协议也具有完整的回落能力,此时trojan协议可以再次做判断和回落:

  • 所有trojan协议的流量,流入Xray中做后续处理;
  • 所有非trojan协议的流量,转发至80端口,完成主动探测的防御。

2、后续处理回落至1234端口的流量,它其实是vless+ws

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "port": 1234,
    "listen": "127.0.0.1",
    "protocol": "vless",
    "settings": {
        "clients": [
            {
                "id": "", // 填写你的 UUID
                "level": 0,
                "email": "love@example.com"
            }
        ],
        "decryption": "none"
    },
    "streamSettings": {
        "network": "ws",
        "security": "none",
        "wsSettings": {
            "acceptProxyProtocol": true, // 提醒:若你用 Nginx/Caddy 等反代 WS,需要删掉这行
            "path": "/websocket" // 必须换成自定义的 PATH,需要和分流的一致
        }
    }
},

3、后续处理回落至2345端口的流量,它其实是vmess+TCP

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
    "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,需要和分流的一致
                    ]
                }
            }
        }
    }
},

4、后续处理回落至3456端口的流量,它其实是是vmess+ws(+cdn)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
    "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,需要和分流的一致
        }
    }
}

至此,模板的完整回落路线为:

以上就是Xray的回落功能介绍。