Xray 搭建及配合Netch使用组成游戏加速器
服务端
服务端Xray搭建
搭建分为了常用稳定安全的vmess+websocket+tls 和用于游戏通道的 vless+grpc+tls两种配置。
Vmess+ws+tls
配置文件
Xray 配置
{
"log": {
"error": "/var/log/xray/error.log",
"access": "/var/log/xray/access.log",
"loglevel": "info"
},
"inbounds": [
{
"port": 10240,
"listen": "127.0.0.1",
"protocol": "vless",
"settings": {
"clients": [
{
"id": ""
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 5000,
"xver": 0
},
{
"path": "/path",
"dest": 5001,
"xver": 0
}
]
},
"streamSettings": {
"security": "tls",
"tlsSettings": {
"alpn": [
"h2",
"http/1.1"
],
"certificates": [
{
"certificateFile": "",
"keyFile": ""
}
]
},
"network": "tcp"
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
},
{
"port": 5001,
"listen": "127.0.0.1",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": ""
}
],
"decryption": "none"
},
"streamSettings": {
"security": "none",
"network": "ws",
"wsSettings": {
"path": "/path"
}
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}这里采用了Xray 的Fallback 回落机制,Xray监听从Nginx四层转发到127.0.0.1:10240的数据。
fallback 为Xray 提供了高强度的防主动探测性,可以将不同类型的流量根据 path 进行分流, 从而实现一个端口, 多种服务共享。
目前可以在使用 VLESS 或者 trojan 协议时, 通过配置 fallbacks 来使用回落这一特性。
inbounds入站配置
监听从本地10240端口传入的vless协议(protocol)的数据.
通过setting-clients用户组里的id来辨别用户。
clients是一个数组,代表每一个服务端认可的id用户。decryption现阶段必须填写none,不能为空。fallbacks也是个数组,是Xray的落回功能dest可以是字符串string也可以是数字number,决定了TLS解密之后TCP流量的去向。- 字符串
string是指Unix domain socket,绝对路径; - 数组
number是指TCP格式的地址,如 127.0.0.1:1234。
- 字符串
xver为数字number,指发送 PROXY protocol,专用于传递请求的真实来源IP和端口,按版本分1和 2,默认为0,即不发送。官方文档建议1。(目前填 1 或 2,功能完全相同,只是结构不同,且前者可打印,后者为二进制。)path为字符串string,分流其它 inbound 的 WebSocket 流量或 HTTP 伪装流量,没有多余处理、纯粹转发流量,文档说理论性能比Nginx强。(注意:fallbacks 所在入站本身必须是 TCP+TLS,这是分流至其它 WS 入站用的,被分流的入站则无需配置 TLS。)
streamSettings 底层传输方式,配置传输协议
security是否启用传输层加密,支持的选项有"none"表示不加密(默认值)。"tls"表示使用 TLS。"xtls"表示使用 XTLS。
network连接的数据流所使用的传输方式类型。因为fallbacks要求必须是TCP+TLS,所以这里是TCP。类型很多:"tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic" | "grpc"。tlsSettings TLS配置
- alpn 一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为
["h2", "http/1.1"]。 - certificates 证书列表。
- alpn 一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为
sniffing 官方文档有很好解释,我这样写肯定没错。
fallbacks 配置完成后就是websocket传输协议的配置,具体参数跟之前的写fallbacks的配置一样。需要注意的几点是:
network参数为ws。- 需要配置
wsSettings参数,简洁的只需要写path就行。 - 不需要配置security参数,因为在客户端正确配置后传入服务器的加密数据在之前通过10240已经在fallbacks进行解密了,意思是这其实是vless+tcp+tls😜
outbounds出站配置照着写就对了。这里没配置
routing项,所以出站全都是freedom!!!(i‘m free是🤣)
nginx配置
===========================================
# /etc/nginx/nginx.conf
===========================================
#其他保持不变,在文件最后添加
stream{
#这里就是SNI识别。将域名映射成一个配置名
map $ssl_preread_server_name $backend_name{
www.vmess.com vmess;
# 域名都不匹配时的默认值
default web;
}
#vmess转发详情,匹配到vmess配置的域名时转发到127.0.0.1:10240
upstream vmess{
server 127.0.0.1:10240;
}
#监听443并开启ssl_preread
server{
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $backend_name;
ssl_preread on;
}
}
===========================================
# /ect/nginx/conf.d/vmess+ws+tls.conf
===========================================
server {
listen 5000 http2; #IPv4,监听xray回落的5000端口,并开启HTTP2支持。
server_name v2.zengjt.com;
client_max_body_size 1024M;
ssl_certificate /www/wwwroot/your.domain.com/yourdomain.crt;
ssl_certificate_key /www/wwwroot/your.domain.com/yourdomain.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
#伪装网页代理,或者配置成静态页面,或者404也行
location / {
proxy_pass http://127.0.0.1:5212;
}
}逻辑

Vless+grpc+tls
配置文件
vless+grpc+tls的Xray配置文件跟上文vmess+ws+tls配置差别不大,需要⚠注意⚠的是:
⚠⚠⚠
- gRPC 不支持指定 Host。请在出站代理地址中填写 正确的域名 ,或在
(x)tlsSettings中填写ServerName,否则无法连接。- gRPC 不支持回落到其他服务。
- gRPC 服务存在被主动探测的风险。建议使用 Caddy 或 Nginx 等反向代理工具,通过 Path 前置分流。
如果您使用 Caddy 或 Nginx 等反向代理,请注意下列事项:
- 请确定反向代理服务器开启了 HTTP/2
- 请使用 HTTP/2 或 h2c (Caddy),grpc_pass (Nginx) 连接到 Xray。
- 普通模式的 Path 为
/${serviceName}/Tun, Multi 模式为/${serviceName}/TunMulti如果你正在使用回落,请注意下列事项:
- 不建议回落到 gRPC,存在被主动探测的风险。
- 请确认
h2位于 (x)tlsSettings.alpn 中的第一顺位,否则 gRPC(HTTP/2)可能无法完成 TLS 握手。- gRPC 无法通过进行 Path 分流。
⚠⚠⚠
Xray配置
{
"port":5002,
"listen":"127.0.0.1",
"protocol":"vless",
"settings": {
"decryption":"none",
"clients": [
{
"id": ""
}
]
},
"streamSettings": {
"network": "grpc",
"security": "tls",
"tlsSettings":{
"alpn":[
"h2",
"http/1.1"
],
"certificates":[
{
"certificateFile": "/www/wwwroot/your.domain.com/yourdomain.crt",
"keyFile": "/www/wwwroot/your.domain.com/yourdomain.key"
}
]
},
"grpcSettings": {
"serviceName": ""
}
},
"sniffing":{
"enabled":true,
"destOverride":[
"http",
"tls"
]
}
}Nginx配置
server{
listen 80;
server_name your.domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2; #开启HTTP/2
server_name your.domain.com;
ssl_certificate /www/wwwroot/your.domain.com/yourdomain.crt;
ssl_certificate_key /www/wwwroot/your.domain.com/yourdomain.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
client_header_timeout 1071906480m;
keepalive_timeout 1071906480m;
location /{serviceName}/Tun { #普通模式的 Path 为 /${serviceName}/Tun, Multi 模式为 /${serviceName}/TunMulti
if ($request_method != "POST") {
return 404;
}
client_body_timeout 1h;
client_max_body_size 0;
grpc_intercept_errors on;
grpc_read_timeout 1h;
grpc_send_timeout 1h;
grpc_socket_keepalive on;
grpc_pass grpcs://127.0.0.1:5002;
#未TLS加密 grpc://127.0.0.1:5002
#TLS加密 grpcs://127.0.0.1:5002
}
location / {
proxy_pass http://127.0.0.1:1234;
}
}
客户端
多平台客户端
v2rayN - 适用于 Windows 平台
- 请从它的GitHub 仓库 Release 页面获取最新版
- 请根据该客户端的说明进行设置
v2rayNG - 适用于 Android 平台
- 请从它的GitHub 仓库 Release 页面获取最新版
- 请根据该客户端的说明进行设置
Shadowrocket - 适用于 iOS, 基于苹果 M 芯片的 macOS
- 你需要注册一个【非中国区】的 iCloud 账户
- 你需要通过 App Store 搜索并购买
- 请根据该客户端的说明进行设置
Qv2ray - 跨平台图形界面,适用于 Linux, Windows, macOS
- 请从它的GitHub 仓库 Release 页面获取最新版(还可以从它的GitHub 自动构建仓库寻找更新的版本)
- 请从它的项目主页学习文档
- 请根据该客户端的说明进行设置
游戏客户端
Netch
- 请从它的GitHub 仓库 Release 页面获取最新版
若想实现Fullcone(NAT类型开放),需要达成以下条件:
- 确保客户端核心为 Xray v1.3.0+"
- 若您正在使用Netch作为客户端,请不要使用模式 [1] 连接 (可使用模式 [3] Bypass LAN )"
- 如果测试系统为Windows,并且正在使用透明代理或TUN/Bypass LAN,请确保当前网络设置为专用网络"
一些资料
关于伪装网站
伪装网站的作用
这个网站是用你的域名搭建的一个网站,搭建完成后可以直接在浏览器上输入你的域名访问。
你使用Xray进行代理的全部流量都将伪装成访问这个网站的流量。
注意伪装网站不是万能的,据部分人的经验,只要你的月流量超过一定限度运营商就会把你封喽,不管你的伪装网站是什么。也就是说哪怕你完全不代理,只是正常访问你的网站访问了太多的流量,也可能被封。
伪装网站的选择
使用VPS自建Xray代理在流量的常见特征有 单点性 、 大流量性 、 长时间性 、 GO-TLS指纹特性 、 出入相同性 等。
- 单点性 指使用的人少,一般只有自己,即使分享给朋友,一般也不会太多。
- 长时间性 不单指时间长,也指坚持一个月或一年每天都使用代理。
- GO-TLS指纹特性 在不伪装浏览器指纹的前提下,从TLS握手信息中可以判断出客户端是GO程序。
- 出入相同性 指入VPS和出VPS的流量在时间和大小上几乎相同,比如使用Xray代理浏览
BiliBili,从BiliBili到VPS(Xray服务端)的流量,和从VPS到Xray客户端的流量在时间上和大小上是几乎相同的。出入相同性 是所有代理的通病,目前还没有太好的伪装方法,但是因为VPS不在大陆,如果不是被特别关注的对象,一般不会被审查。
既然使用Xray进行代理的全部流量都将伪装成访问这个网站的流量,那么我们选择伪装网站就是要尽量选择流量特征与Xray代理的流量特征相同的网站。
- Cloudreve 和 Nextcloud
他们都是个人网盘,个人网盘可以理解为使用自己的VPS搭建起来的百度网盘,区别就是文件都存放在VPS中,并且自己是网盘的管理员。
个人网盘与上面所说特征的吻合数最多,包括 单点性 、 大流量性 、 GO-TLS指纹特性 、 长时间性 等,建议选择。
关于GO-TLS指纹特性,在不伪装浏览器指纹的前提下,将alpn设置为http/1.1,可以伪装成GO语言实现的WebDav客户端。
Cloudreve 与 Nextcloud 的区别如下:
| 优点 | 缺点 | |
|---|---|---|
| Nextcloud | 功能更多更强大,用的人更多 | 需要安装php,安装php需要额外很多时间,同时也比Cloudreve占用更多系统资源,因此不建议小机使用。 |
| Cloudreve | 轻量化、安装快(不需要php)、占用系统资源少 | 功能较少,使用的人较少 |
- 403页面
基本上所有大网站都有网站后台。比如哔哩哔哩的网址是www.bilibili.com。但是在播放视频时,提供视频文件的却是另外一个网址,在播放视频时右键点击视频统计信息,其中的Video Host就是。这类网址只有打开特定的url后缀才有内容,如果url不对,返回的就是一个错误页面。而403页面就是伪装成一个网站后台。
也就是说伪装成403页面,除了你自己,没人知道你的网站到底有没有东西。
- 自定义静态网站
可以放置自己的静态网站源代码,不建议小白选择。
- 自定义反向代理网站
不建议选择,因为反向代理往往只是反向代理几个html和js文件,网站里面的大部分内容依然是网站后台提供的。不符合大流量特点。
关于TLS握手、TLS指纹和ALPN
虽然TLS是一项加密技术,但在TLS握手的过程中会有一些明文的信息传输,其中包括SNI信息(由serverName参数指定)、ALPN、加密套件等。
目前TLS的标准中并没有对这些明文做严格的要求,所以在不同的TLS实现下这些明文信息的格式可谓五花八门,这些不同TLS实现所具有的不同的明文特征就是TLS指纹。
通过TLS指纹可以反推你所使用的TLS实现,比如Chrome的TLS,FireFox的TLS,GO语言官方库的TLS等。
Xray默认使用的是GO语言官方提供的TLS库,这也是几乎所有GO语言程序所使用的TLS库。Xray也可以模拟Chrome、FireFox、Safari的指纹,但目前只有TCP协议支持。
当使用TCP且不伪装浏览器指纹时,可以自由指定义ALPN。建议设置为http/1.1,这样可以将Xray客户端伪装成GO语言实现的WebDav客户端(如 gowebdav)。WebDav是网盘特有的协议,且该协议基于HTTP/1.1,详见: WebDav 。
若选择伪装浏览器指纹,客户端配置中的alpn参数失效,且ALPN将被固定为h2,http/1.1。同样,当使用WebSocket时,ALPN将被固定为http/1.1;当使用gRPC时,ALPN将被强制添加h2。因此,使用WebSocket还是可以伪装成GO语言WebDav客户端的,gRPC则不行。
关于gRPC与WebSocket
当正在使用的CDN同时支持gRPC与WebSocket时,两者之间改如何选择呢?他们的主要区别体现在以下三个方面:ALPN、延迟和性能。
关于延迟,gRPC自带mux,因此延迟更低。注意这里指的是打开网站的延迟,mux并不能降低游戏延迟。
关于性能,WebSocket的性能更强,如果你的设备性能较弱的话,如家用普通路由器,用WebSocket速度会快一些。
关于Early Data
传输延迟(Transmission Latency)是 Web 性能的重要指标之一,低延迟意味着更流畅的页面加载以及更快的 API 响应速度。而一个完整的 HTTPS 链接的建立大概需要以下四步:
DNS 查询
浏览器在建立链接之前,需要将域名转换为互联网 IP 地址。一般默认是由你的 ISP DNS 提供解析。ISP 通常都会有缓存的,一般来说花费在这部分的时间很少。
TCP 握手( 1 RTT)
和服务器建立 TCP 连接,客户端向服务器发送 SYN 包,服务端返回确认的 ACK 包,这会花费一个往返(1 RTT)
TLS 握手 (2 RTT)
该部分客户端会和服务器交换密钥,同时设置加密链接,对于 TLS 1.2 或者更早的版本,这步需要 2 个 RTT
建立 HTTP 连接(1 RTT)
一旦 TLS 连接建立,浏览器就会通过该连接发送加密过的 HTTP 请求。
假设 DNS 的查询时间忽略不计,那么从开始到建立一个完整的 HTTPS 连接大概一共需要 4 个 RTT,如果是浏览刚刚已经访问过的站点的话,通过 TLS 的会话恢复机制,第三步 TLS 握手能够从 2 RTT 变为 1 RTT。
总结:
建立新连接 :4 RTT + DNS 查询时间
访问刚浏览过的连接:3 RTT + DNS 查询时间
TLSv1.2 需要 2 个 RTT 完成 TLS 协商,TLSv1.3 只需要一个。而重复连接 TLSv1.2 需要 1RTT,TLSv1.3 Early data 就可以 0RTT 重复连接,也就是说 TLSv1.3 比 TLSv1.2 少了一个 0RTT,TLSv1.3 比 TLSv1.2 快就主要快在这里了。
如果你的站点开启了 CDN 加速服务的话,要让所有客户端访问都采用 TLSv1.3 就需要CDN本身也支持 TLSv1.3 才可以的。
在Xray上实现websocket 0-RTT
- 客户端、服务端均升至 Xray-core v1.4.0+,注意不需要改服务端的任何配置
- 只需在客户端的 path 后加上
?ed=2048即可减少 1-RTT,2048 代表 early data 的长度上限,目前建议写 2048
旧的客户端虽然不支持 early data,但仍然可以正常使用节点
- 对于新客户端,
?ed=2048在本地就会被解析,不会被发到服务端,到服务端的是Sec-WebSocket-Protocol - 对于旧客户端,
?ed=2048在本地不会被解析,且会被发到服务端,但只是多了个参数,不会影响正常使用
参考
- Xray教程:https://xtls.github.io/Xray-docs-next/
- Xray-TLS+Web搭建/管理脚本:https://github.com/kirin10000/Xray-script/blob/main/README.md
- Necth:https://github.com/netchx/netch
- SNI配置:https://www.chengxiaobai.com/trouble-maker/trojan-shared-443-port-scheme
- websocket 0-RTT:https://github.com/XTLS/Xray-core/pull/375 https://cloud.tencent.com/developer/article/1426901
- Xray-examples:https://github.com/XTLS/Xray-examples