Xray-core新特性使用教程(固定服务器证书、更改XHTTP填充查询参数名称、路由规则缓存)

固定服务器证书

Xray-core已经于26.2.6版本移除出站streamSettingstlsSettings对象中的allowInsecure字段,被26.1.23版本推出的pinnedPeerCertSha256verifyCertByName字段取代。此变更意味着Xray-core已经无法关闭对TLS证书的验证

此更改将影响“服务器正在使用自签名证书”用户与部分机场节点用户(部分机场节点需求用户开启allowInsecure)。它并不意味着“完全禁止自签名证书”,而是提供1种更加安全的路径,以防止潜在的中间人攻击。

TLS证书的签发与验证

于“配置”部分之前,了解TLS证书的签发与验证流程,或许更易于理解呀。

当需要签发1个证书,首先需要自行生成1对密钥,即“私钥”与“公钥”;而后需要生成“证书签名请求(Certificate Signing Request)”(通常为.csr文件),并寻找1个“证书权威机构(Certificate Authority)”为它签名。“证书权威机构”将使用“请求”中的信息并附加其它信息(例如“证书过期时间”),根据以上信息生成散列值,再使用“证书权威机构”自身私钥对此散列值进行加密,与以上信息一同置入最终的“叶子证书(Leaf Certificate)”中(通常为.pem文件)。

当客户端需要验证1个证书时,它能够将证书信息与已签名的散列值分离,并计算前者的散列值,并根据自身所拥有“证书权威机构”的“根证书(Root Certificate)”/“中间证书(Intermediate Certificate)”验证(解密)后者,若能够解密且与前者的散列值匹配成功,则意味着验证成功。

配置

pinnedPeerCertSha256verifyCertByName分别用于指定“单个或多个证书的SHA256散列值”与“叶子证书签发的域名”,它们是单独的字段,无需同时使用。

[!attention] 注意
对于前者,若服务器提供证书链,则对其中每个叶子证书进行验证,任意叶子证书的散列值匹配便意味着验证成功。

若此字段包含根证书的散列值,将不再使用系统CA证书进行验证。

为使用pinnedPeerCertSha256,需要得知证书的SHA256。假设拥有任意类型证书cert.pem,可通过以下命令计算其散列值:

> xray tls leafCertHash --cert cert.pem
f4c9c39e7a0718d80b5b8eacf1d86d3d94ddd2f17a7ec127369352f8b9003e13

若本地没有存储证书而位于服务器(此处的示例域名为abc.edu),则可通过此命令得到其证书的散列值:

> xray tls ping abc.edu
TLS ping:  abc.edu
Using IP:  18.244.214.51:443
-------------------
Pinging without SNI
Handshake failure:  remote error: tls: handshake failure
-------------------
Pinging with SNI
Handshake succeeded
TLS Version:  TLS 1.3
TLS Post-Quantum key exchange:  true (X25519MLKEM768)
Certificate chain's total length:  3767 (certs count: 3)
Cert's signature algorithm:  SHA256-RSA
Cert's publicKey algorithm:  RSA
Cert's allowed domains:  [abc.edu *.abc.edu]
Cert's leaf SHA256:  e6ae979404739f57ed5400ed9afa6df4f5cc5e162d88a57c9e03e5670d1e9484
-------------------
TLS ping finished

通常地,只需使用Pinging with SNICert's leaf SHA256后的散列值呀。

若需要固定多个证书,则需要使用,分隔:

{
    "security": "tls",
    "tlsSettings": {
        "pinnedPeerCertSha256": "f4c9c39e7a0718d80b5b8eacf1d86d3d94ddd2f17a7ec127369352f8b9003e13,e6ae979404739f57ed5400ed9afa6df4f5cc5e162d88a57c9e03e5670d1e9484"
    }
}

更改XHTTP填充查询参数名称

26.2.6版本开始,Xray-core允许用户更改XHTTP传输方式中,URL中用于填充的查询参数名称,以防止部分CDN对XHTTP传输方式的检测(检查是否存在查询参数x_padding)。

此特性由俄罗斯贡献者@paqx提出,因为位于俄罗斯的部分CDN已经开始检测并封锁XHTTP传输方式:

paqx
CDNVideo started to block any POST requests whose query string matches the pattern x_padding=XXXXX . Also, some requests included an X-Padding header. Both the query param and header have a very unusual name and can be easily spotted.

CDNVideo已经开始封锁 包含x_padding=XXXXX...查询参数模式的POST请求,以及包含X-Padding请求头的请求。它们两者均拥有十分不常见的名称。

配置

xhttpSettingsextra对象中配置xPaddingQueryParam即可:

{
    "network": "xhttp",
    "xhttpSettings": {
        "extra": {
            "xPaddingQueryParam": "password"
        }
    }
}

路由规则缓存

Xray-core于26.2.6版本允许预先构建路由规则缓存,并于实际路由规则匹配中使用缓存,而非于Xray-core开启时构建。基本上,“使用缓存”能够减少Xray-core的内存占用,对于大规模路由规则与大型GeoSite文件尤为显著。

该特性主要考虑路由器与iOS操作系统,前者通常仅拥有少量内存,而后者赋予Network Extension进程的内存极其有限(iOS 15前为15MB,iOS 15后为50MB)。

使用

以如下示例配置文件开始:

{
    "log": {
        "loglevel": "info"
    },
    "dns": {
        "hosts": {
            "doh.pub": [
                "1.12.12.12",
                "120.53.53.53"
            ],
            "dns.cloudflare.com": [
                "1.1.1.1",
                "1.0.0.1",
                "2606:4700:4700::1111",
                "2606:4700:4700::1001"
            ],
            "dns.google": [
                "8.8.8.8",
                "8.8.4.4",
                "2001:4860:4860::8888",
                "2001:4860:4860::8844"
            ]
        },
        "servers": [
            {
                "tag": "doh_pub",
                "address": "https://doh.pub/dns-query",
                "domains": [
                    "geosite:cn"
                ],
                "expectedIPs": [
                    "geoip:cn"
                ]
            },
            {
                "tag": "dns_cloudflare_com",
                "address": "https://dns.cloudflare.com/dns-query"
            },
            {
                "tag": "dns_google",
                "address": "https://dns.google/dns-query"
            }
        ],
        "enableParallelQuery": true
    },
    "routing": {
        "rules": [
            {
                "type": "field",
                "ip": [
                    "geoip:private"
                ],
                "outboundTag": "freedom"
            },
            {
                "ruleTag": "direct_domains_local_ips_resolved",
                "type": "field",
                "domain": [
                    "geosite:private"
                ],
                "outboundTag": "freedom"
            },
            {
                "type": "field",
                "network": "udp",
                "port": 443,
                "outboundTag": "blackhole"
            },
            {
                "ruleTag": "block_ad_domains",
                "type": "field",
                "domain": [
                    "geosite:category-ads-all"
                ],
                "outboundTag": "blackhole"
            },
            {
                "type": "field",
                "ip": [
                    "geoip:cn"
                ],
                "outboundTag": "freedom"
            },
            {
                "ruleTag": "direct_china_domains",
                "type": "field",
                "domain": [
                    "geosite:cn"
                ],
                "outboundTag": "freedom"
            }
        ]
    },
    "outbounds": [
        {
            "tag": "freedom",
            "protocol": "freedom"
        },
        {
            "tag": "blackhole",
            "protocol": "blackhole"
        }
    ]
}

应当能够注意到,所有包含domain数组的路由规则已经被ruleTag字段命名,而所有DNS服务器亦被tag字段命名,此步骤是使用与构建缓存之前必要的

使用此命令,从配置文件config.json构建GeoSite缓存至domain.cache文件:

xray buildMphCache -c config.json -o domain.cache

欲使用缓存,需要于XRAY_MPH_CACHE环境变量指定domain.cache的路径(相对路径的起点为Xray-core所在文件夹):

export XRAY_MPH_CACHE="/home/xray/domain.cache"
# $env:XRAY_MPH_CACHE="C:/ProgramData/xray-core/domain.cache"

而后启动Xray-core便可呀。

1 Like