服务端

服务端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 来使用回落这一特性。

  1. 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 证书列表。

sniffing 官方文档有很好解释,我这样写肯定没错。


fallbacks 配置完成后就是websocket传输协议的配置,具体参数跟之前的写fallbacks的配置一样。需要注意的几点是:

  • network 参数为 ws
  • 需要配置wsSettings 参数,简洁的只需要写path就行。
  • 不需要配置security参数,因为在客户端正确配置后传入服务器的加密数据在之前通过10240已经在fallbacks进行解密了,意思是这其实是vless+tcp+tls😜
  1. 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;
        }
}

逻辑

未命名绘图.drawio

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 平台

  • v2rayNG - 适用于 Android 平台

  • Shadowrocket - 适用于 iOS, 基于苹果 M 芯片的 macOS

    • 你需要注册一个【非中国区】的 iCloud 账户
    • 你需要通过 App Store 搜索并购买
    • 请根据该客户端的说明进行设置
  • Qv2ray - 跨平台图形界面,适用于 Linux, Windows, macOS

游戏客户端

  • 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,从BiliBiliVPS(Xray服务端)的流量,和从VPSXray客户端的流量在时间上和大小上是几乎相同的。出入相同性 是所有代理的通病,目前还没有太好的伪装方法,但是因为VPS不在大陆,如果不是被特别关注的对象,一般不会被审查。

既然使用Xray进行代理的全部流量都将伪装成访问这个网站的流量,那么我们选择伪装网站就是要尽量选择流量特征与Xray代理的流量特征相同的网站

  1. Cloudreve 和 Nextcloud

他们都是个人网盘,个人网盘可以理解为使用自己的VPS搭建起来的百度网盘,区别就是文件都存放在VPS中,并且自己是网盘的管理员。

个人网盘与上面所说特征的吻合数最多,包括 单点性大流量性GO-TLS指纹特性长时间性 等,建议选择。

关于GO-TLS指纹特性在不伪装浏览器指纹的前提下,将alpn设置为http/1.1,可以伪装成GO语言实现的WebDav客户端。

Cloudreve 与 Nextcloud 的区别如下:

优点缺点
Nextcloud功能更多更强大,用的人更多需要安装php,安装php需要额外很多时间,同时也比Cloudreve占用更多系统资源,因此不建议小机使用。
Cloudreve轻量化、安装快(不需要php)、占用系统资源少功能较少,使用的人较少
  1. 403页面

基本上所有大网站都有网站后台。比如哔哩哔哩的网址是www.bilibili.com。但是在播放视频时,提供视频文件的却是另外一个网址,在播放视频时右键点击视频统计信息,其中的Video Host就是。这类网址只有打开特定的url后缀才有内容,如果url不对,返回的就是一个错误页面。而403页面就是伪装成一个网站后台。

也就是说伪装成403页面,除了你自己,没人知道你的网站到底有没有东西。

  1. 自定义静态网站

可以放置自己的静态网站源代码,不建议小白选择。

  1. 自定义反向代理网站

不建议选择,因为反向代理往往只是反向代理几个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 链接的建立大概需要以下四步:

  1. DNS 查询

    浏览器在建立链接之前,需要将域名转换为互联网 IP 地址。一般默认是由你的 ISP DNS 提供解析。ISP 通常都会有缓存的,一般来说花费在这部分的时间很少。

  2. TCP 握手( 1 RTT)

    和服务器建立 TCP 连接,客户端向服务器发送 SYN 包,服务端返回确认的 ACK 包,这会花费一个往返(1 RTT)

  3. TLS 握手 (2 RTT)

    该部分客户端会和服务器交换密钥,同时设置加密链接,对于 TLS 1.2 或者更早的版本,这步需要 2 个 RTT

  4. 建立 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

  1. 客户端、服务端均升至 Xray-core v1.4.0+,注意不需要改服务端的任何配置
  2. 只需在客户端的 path 后加上 ?ed=2048 即可减少 1-RTT,2048 代表 early data 的长度上限,目前建议写 2048

旧的客户端虽然不支持 early data,但仍然可以正常使用节点

  1. 对于新客户端,?ed=2048 在本地就会被解析,不会被发到服务端,到服务端的是 Sec-WebSocket-Protocol
  2. 对于旧客户端,?ed=2048 在本地不会被解析,且会被发到服务端,但只是多了个参数,不会影响正常使用

参考

  1. Xray教程:https://xtls.github.io/Xray-docs-next/
  2. Xray-TLS+Web搭建/管理脚本:https://github.com/kirin10000/Xray-script/blob/main/README.md
  3. Necth:https://github.com/netchx/netch
  4. SNI配置:https://www.chengxiaobai.com/trouble-maker/trojan-shared-443-port-scheme
  5. websocket 0-RTT:https://github.com/XTLS/Xray-core/pull/375 https://cloud.tencent.com/developer/article/1426901
  6. Xray-examples:https://github.com/XTLS/Xray-examples

仅供交流学习使用,请勿行违法之事。网络非法外之地,行非法之事,必将接受法律制裁!!!!

标签: none

添加新评论