Xray-core新特性使用教程(Vision Seed、DNS优化)

Vision Seed(测试)

Xray-core此次的25.12.8更新中,推出了“Vision Seed”功能。基本上,它使得“XTLS Vision”中 填充策略的具体数值可自定义,以及加入“预连接”功能以改善使用体验。

可配置的“XTLS Vision”

“XTLS Vision”是1种解决“TLS中的TLS”特征的解决方案:为已由外部TLS隧道加密的,其内部TLS握手数据包 添加填充数据,且不再次加密已被内部TLS隧道 所加密的数据。不过,先前其填充策略并不是可配置的(此缺陷事实无伤大雅,大多数情况下,用户完全不必自定义具体数值)。因此,AnyTLS协议将基本与“VLESS+可配置的Vision+Raw+TLS”的使用效果无异呀。

此次更新允许用户更改“XTLS Vision”进行填充时的4个参数。不过,在此之前,或许需要了解“XTLS Vision”的部分逻辑呀。

使用“XTLS Vision”时,Xray-core将于收到数据包后 检查其“是否属于TLS协议”,以及“是否属于TLS协议的握手阶段”,若两者皆是,且实际数据长度大于某值,“XTLS Vision”将容许填充更多数据(被称为“长填充”);若仅前者满足,则仅容许正常的填充字节数。对于以上过程 有4个参数,便是此次允许用户配置的参数啦:

  • 长填充的触发阈值,默认值:900
  • 长填充的最大填充字节数,默认值:500
  • 长填充的额外填充字节数,默认值:900
  • 正常的最大填充字节数,默认值:256

“实际填充字节数最大值”可如此计算:

  • 当“实际数据长度”小于“长填充的触发阈值”,且能够进行“长填充”:
    • 实际填充字节数最大值 = 长填充的最大填充字节数 + 长填充的额外填充字节数。
  • 否则:
    • 实际填充字节数最大值 = 正常的最大填充字节数。

值得注意,“最大填充字节数”意味着“实际填充字节数将是随机生成的”,目前并不类似“VLESS加密”配置,允许用户设置“最小填充字节数”呀。

预连接(Pre-connecting

它基本上是1个十分简单的概念:“预先建立连接,以便未来的通讯能够快速开始”。无论是否需要通讯,客户端始终与服务器建立并维护1条或多条连接。它最初属于浏览器中对HTTP/2的优化机制[1],能够消除实际通讯前 TCP握手与TLS握手造成的延迟,是1个较为简单的功能。

请不要将其与“多路复用”[2]混淆——“多路复用”允许将多个代理连接[3]于单个实际连接(通常为TCP连接或QUIC连接)中传输,亦能够 部分消除TCP与TLS的握手延迟影响。但是,“多路复用”并不会预先建立连接。因此,当连接池中没有任何连接时,若需要传输更多数据,仍然需要经历TCP握手与TLS握手。不过,由于XHTTP传输方式的“多路复用”通常总是能够维持多个连接,因此“连接池没有连接”的情况通常较少发生,其使用时“降低延迟”效果 应当与此次的“预连接”更新几乎相同。

这里认为,此次更新的主要受益者为 大型机场节点:尽管XHTTP传输方式的“多路复用”已能够降低延迟,但是,XHTTP传输方式并不使用许多操作系统的“向量化IO(readvwritev)”API和“零复制数据移动(splice)”API,使得XHTTP传输方式的开销 相比Raw(TCP)传输方式更高。对于机场节点,此次更新意味着 单个服务器能够服务更多用户,并同时得到与XHTTP传输方式几乎同等的体验改善(不过,“通过CDN”仍然仅限于XHTTP、WebSocket和gRPC等传输方式呀)。

配置

当前的配置文件形式仍处于测试阶段,预期于下次更新中更改。

“XTLS Vision”基本上于“VLESS+Raw+Reality”组合中使用,便从此开始:

{
    "log": {
        "loglevel": "info"
    },
    "routing": {
        "domainStrategy": "IPIfNonMatch",
        "rules": [
            {
                "type": "field",
                "ip": [
                    "geoip:private"
                ],
                "outboundTag": "blackhole"
            }
        ]
    },
    "inbounds": [
        {
            "tag": "vless_vision_raw_reality",
            "listen": "0.0.0.0",
            "port": 443,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "UUID",
                        "flow": "xtls-rprx-vision"
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "raw",
                "security": "reality",
                "realitySettings": {
                    "target": "www.suny.edu:443",
                    "serverNames": [
                        "www.suny.edu"
                    ],
                    "shortIds": [
                        ""
                    ],
                    "privateKey": "X25519私钥",
                    "mldsa65Seed": "ML-DSA-65种子"
                },
                "sockopt": {
                    "tcpcongestion": "bbr",
                    "tcpMptcp": true
                }
            }
        }
    ],
    "outbounds": [
        {
            "tag": "freedom",
            "protocol": "freedom"
        },
        {
            "tag": "blackhole",
            "protocol": "blackhole"
        }
    ]
}

欲为单个用户设置以上所述的4个参数,只需按序置入testseed数组中:

{
    "flow": "xtls-rprx-vision",
    "testseed": [
        800,
        300,
        700,
        300
    ]
}

为以上入站编写1段 用于客户端的配置:

{
    "log": {
        "loglevel": "info"
    },
    "inbounds": [
        {
            "tag": "socks",
            "listen": "::1",
            "port": 10000,
            "protocol": "socks",
            "settings": {
                "udp": true
            }
        }
    ],
    "outbounds": [
        {
            "tag": "vless_vision_raw_reality",
            "protocol": "vless",
            "settings": {
                "address": "代理服务器地址",
                "port": 443,
                "id": "UUID",
                "flow": "xtls-rprx-vision"
            },
            "streamSettings": {
                "network": "raw",
                "security": "reality",
                "realitySettings": {
                    "serverNames": "www.suny.edu",
                    "shortId": "",
                    "fingerprint": "edge",
                    "password": "X25519公钥",
                    "mldsa65Verify": "ML-DSA-65验证(可选)"
                }
            }
        }
    ]
}

对于出站,同样能够自定义上述4个参数:

{
    "settings": {
        "flow": "xtls-rprx-vision",
        "testseed": [
            900,
            400,
            900,
            256
        ]
    }
}

对于“预连接”,只需于出站的settings对象中,设置testpre字段为“期望预连接的连接数量”便可:

{
    "settings": {
        "testpre": 5
    }
}

以上配置意味着:当Xray-core开启时,向代理服务器预先建立并维护5个连接。

DNS优化

25.12.8版本中,贡献者@Meo597提供了数个DNS与路由相关的优化。性能优化包括“DNS缓存重构”“路由匹配器优化”,而增加的配置项如下所示:

并行查询(Parallel Query

当配置文件中的dns对象 存在多个DNS服务器配置时,先前首先请求第1个符合需求的DNS服务器;若回应的IP地址不符合需求[4],则尝试进行回落,使用其它服务器。基本上,对于“使用DNS配置进行境内/境外IP地址分流”使用者,此方案可能显著增加 进行DNS查询所消耗的时间。

若开启此次更新的“并行查询”功能,Xray-core将根据配置项 对所有DNS服务器进行分类,基本上,它将拥有相同配置(通常使用domainsexpectedIPs配置)的服务器分为1组。当进行DNS查询时,对每个DNS服务器发起查询请求,并于其所在的组内进行竞速,首先响应且响应符合规则者 将被采纳,能够很好地改善DNS查询的速度呀。

配置

开启“并行查询”十分简单,只需于dns对象中,将enableParallelQuery的值设置为true

{
    "dns": {
        "enableParallelQuery": true
    }
}

乐观缓存(Optimistic Caching

对于DNS查询,几乎所有DNS客户端在其缓存过期前,采纳先前缓存的结果;当查询请求域名的缓存过期,将首先请求DNS服务器,再进行响应。若启用“乐观缓存”,即便发现缓存过期,依然首先使用缓存,同时请求DNS服务器并更新缓存。

配置

它为dns对象与其中servers数组的对象增加2个字段:

  • serveStale:设置为true意味着“开启乐观缓存”。默认值为false
  • serveExpiredTTL:缓存存活时间(单位:秒),0意味着永远存活。默认值为0

例如以下配置文件:

{
    "dns": {
        "servers": [
            {
                "address": "https://1.1.1.1/dns-query",
                "serveStale": true,
                "serveExpiredTTL": 86400
            }
        ],
        "serveStale": true,
        "serveExpiredTTL": 3600
    }
}

serveExpiredTTL位于servers数组的对象中时,其默认值将为dns对象中的serveExpiredTTL,否则为0


  1. 此处具体指<link rel="preconnect">元素,“早期提示(Early Hints)”的1部分。 ↩︎

  2. 它存在于HTTP/2与QUIC协议中;Xray-core中 XHTTP传输方式的XMUX,与先前的“Mux.Cool”。 ↩︎

  3. “子连接(Sub-connection)”。 ↩︎

  4. 大多数时候,由expectedIPs配置项决定,它将排除DNS响应中“不属于此配置项中的IP地址”。 ↩︎