Featured image of post 『Blog』TUIC 敏捷部署

『Blog』TUIC 敏捷部署

TUIC Protocol 双端敏捷部署

摘要

本文先介绍基于 TUIC 实现的双端代理敏捷部署方案,以 Ubuntu20.04 为例介绍服务端代理架设的步骤,再分别介绍在 Windows(V2RayN/NekoRay),Android(SagerNet/Matsuri) 以及 iOS(Shadowrocket) 启动客户端代理的方案。最后介绍 TUIC 协议的特性、适用场景以及与 Hysteria 协议的区别。

本文涉及的开源项目如下:

项目名发行版本号备注
EAimTY/tuicv0.8.5双端代理核心
acmesh-official/acme.shv3.0.4证书申请
2dust/v2rayNv5.36核心承载客户端(Windows)
MatsuriDayo/nekorayv2.3核心承载客户端(Windows)
SagerNet/SagerNetv0.8.1-rc03核心承载客户端(Android)
MatsuriDayo/Matsuriv0.5.2暂不支持

服务端配置

Step1: 下载预编译的 tuic-server

创建工作目录 /home/tuic/,拉取预编译的 tuic-server v0.8.5,安装 ACME,调整默认 CA letsencrypt

1
2
3
4
5
6
7
mkdir --parents /home/tuic \
&& wget -O /home/tuic/tuic https://github.com/EAimTY/tuic/releases/download/0.8.5/tuic-server-0.8.5-x86_64-linux-gnu \
&& chmod +x /home/tuic/tuic \
&& apt install -y socat \
&& curl https://get.acme.sh | sh \
&& ~/.acme.sh/acme.sh --upgrade --auto-upgrade \
&& ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

Step2: 申请证书

申请证书,将证书移至 /home/tuic/ 工作目录。

一个 A 域名每 170h 最多申请 5 次证书,如果你玩的太花被限制了,开一个新的 A 域名到本机 IPv4 即可。

1
2
3
read -p "请输入解析到本机 IPv4 的域名:" DOMAIN \
&& ~/.acme.sh/acme.sh --issue -d $DOMAIN --standalone --keylength ec-256 \
&& ~/.acme.sh/acme.sh --install-cert --ecc -d $DOMAIN --fullchain-file /home/tuic/fullchain.crt --key-file /home/tuic/private.key

Step3: 编辑服务配置文件

1
vim /home/tuic/config.json

添加配置信息:

1
2
3
4
5
6
7
8
{
    "port": 16387,
    "token": ["how-dare-you"],
    "certificate": "/home/tuic/fullchain.crt",
    "private_key": "/home/tuic/private.key",
    "congestion_controller": "bbr",
    "alpn": ["h3"]
}

Step4: 添加系统服务

1
vim /etc/systemd/system/tuic.service

创建并编辑配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[Unit]
Description=TUIC
Documentation=https://github.com/EAimTY/tuic
After=network.target

[Service]
User=root
ExecStart=/home/tuic/tuic -c /home/tuic/config.json
Restart=on-failure

[Install]
WantedBy=multi-user.target

更新系统服务缓存,允许 tuic service 开机自启

1
systemctl daemon-reload && systemctl enable tuic

启动系统服务

1
systemctl start tuic

其他常用命令

1
2
3
4
5
6
7
8
# 查看运行状态
systemctl status tuic
# 实时日志
journalctl -u tuic --output cat -f
# 查看服务端配置
cat /home/tuic/config.json
# 查看证书,其中 "~/.acme.sh/acme.sh" 可替换为别名 "acme.sh"
~/.acme.sh/acme.sh --info --ecc -d [YOUR_DOMAIN]

客户端配置

配置模版

建议在开始配置之前将客户端升级到最新版本。在文档中未出现的 field 将保持默认设置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
    "relay": {
        "server": "YOUR SERVER DOMAIN",
        "port": 16387,
        "token": "how-dare-you",
        "ip": "YOUR SERVER IP",
        "congestion_controller": "bbr",
        "alpn": ["h3"],
        "reduce_rtt": true
    },
    "local": {
        "port": %socks_port%
    },
    "log_level": "off"
}

NekoRay[推荐]

如果你是首次使用 NekoRay,可看这篇文章以及官方文档快速上手。

  1. 下载预编译的 tuic-client(windows-gnu),放置到 NekoRay config 目录下。务必下载 client,而不是 server。

  2. 「首选项 - 基本设置 - 核心」添加自定义核心,命名「tuic」,添加 tuic-client 的绝对路径,如果你已将核心放置在 config 目录下,点击「选择」可以直接看见。

「首选项 - 基本设置 - 核心」

  1. 在空白处右键「手动输入配置 - 编辑」在「类型」中选择「自定义(其他核心)」,模版配置如下图所示。替换掉占位符 YOUR SERVER DOMAIN以及 YOUR SERVER IP。如果你改变了上文给出的服务端口 ip 以及身份令牌 token,则此处对照改变即可。

「手动输入配置 - 编辑 - tuic 代理核心」

V2RayN

  1. 下载预编译的 tuic-client(windows-gnu),放置到 V2RayN 工程根目录下。
  2. 添加自定义配置服务器,复制粘贴配置模版,替换掉占位符 YOUR SERVER DOMAIN以及 YOUR SERVER IP,修改 local port 为 50001。如果你改变了上文给出的服务端口 ip 以及身份令牌 token,则此处对照改变即可。

「V2RayN - 自定义配置服务器」

SagerNet

  1. 从 Google Play 下载软件(搜索关键词 SagerNet),或从项目仓库拉取 apk 程序

  2. 添加服务器配置「手动输入 - TUIC」,对照配置模版填入必要信息:

「SagerNet - 手动添加 TUIC 服务器」

  1. 首次使用时根据提示下载 SagerNet - TUIC 插件,主流安卓设备选择 arm64-v8a 的版本。参考这篇文章的软件配置,解除插件和主程序的限制。首先,长按 SagertNet,设置应用信息,提供自启动,联网控制和无限制省电的权限,然后再通过「系统设置 - 应用管理」查找 TUIC Plugin,给予自启动和无限制省电的权限。

网络对比测试

使用 NekoRay 对同一服务器上监听不同端口的代理服务进行对比测试,核心版本及客户端配置如下:

1
2
3
4
5
6
7
{
    "relay": {
        "congestion_controller": "bbr",
        "alpn": ["h3"],
        "reduce_rtt": true
    },
} 

下方对比中,选用来自 PacificRack 提供商的网络环境较有挑战的云服务器,本地带宽 300Mbps,调整 Hysteria down_mbps: 110YouTube 4K 视频,大文件下载速度测试选用 Open Images Dataset V7 的 Boxes 训练集。

  • Speedtest :两种协议均能跑满理论上限,微量损耗误差忽略不计。
  • YouTube4K:两种协议连接速度均溢出(一般认为连接速度超过 2W Kbps 即可流畅播放)。其中,Hysteria 略有优势,但实测中连接速度不稳定,出现「间接抽风」的情况,波动非常大。
  • FileDownload:Hysteria 下载速度接近down_mbps理论上限,而 TUIC 的下载速度则稳定在 3~5 MB/s。
来源/协议TUICHysteria
Speedtestimgimg
YouTube Connection Speedimage-20221110101649533image-20221110101315538
Downloadimage-20221110100624503image-20221110100734660

现将服务器调整为 V.PS 提供的线路质量较好的 Tokyo Micro Pro 服务器,调整 Hysteria down_mbps: 187,其他环境条件不变。

  • Speedtest:趋势相同。
  • YouTube4K:连接速度同样已溢出,但 Hysteria 已能跑出一倍之差的测试成绩
  • FileDownload:Hysteria 下载速度接近down_mbps理论上限,而 TUIC 的下载速度稳定在 9MB/s 左右。

值得一提的是,先前 Hysteria 在 YouTube 测试中的抖动情况不再出现。

来源/协议TUICHysteria
Speedtestimgimg
YouTube Connection Speedimage-20221111234649105image-20221111235300137
Downloadimage-20221112010449698image-20221112010520098

TUIC

协议简介

REF: https://github.com/EAimTY/tuic/tree/dev/protocol

TUIC 是一个基于 QUIC 的有状态协议,目前的版本是 0x04

协议特性

REF: https://github.com/EAimTY/tuic#design

  • 1-RTT TCP 中继
  • 0-RTT UDP 中继,且 NAT 类型为 FullCone
  • 在用户空间的拥塞控制,也就是说可以在任何系统平台实现双向的 BBR
  • 两种 UDP 中继模式: native (原生 UDP 特性,数据仍被 TLS 加密)和 quic (100% 送达率,每个包单独单独作为一个 QUIC 「流」,一个包的确认重传不会阻塞其它包)
  • 完全多路复用,服务器和客户端之间始终只需要一条 QUIC 连接,所有任务作为这个连接中的 “流” 进行传输(一个流的暂时阻塞不会影响其它流),所以除连接第一个中继任务外的其它任务都不需要经过 QUIC 握手和 TUIC 的鉴权
  • 网络切换时的会话平滑转移,例如在从 Wi-Fi 切换到移动数据时连接不会像 TCP 一样直接断开
  • 0-RTT 、与中继任务并行的鉴权
  • 支持 QUIC 的 0-RTT 握手(开启之后能达到 真・ 1 -RTT TCP 和 0-RTT UDP ,但是就算不开启,多路复用的特性也能保证在绝大多数情况下 1-RTT 和 0-RTT )

总结对比

TUIC 设计目标是「尽可能减少握手造成的网络往返时延」,相比之下,更加适合「湍流」应用场景,即,快速响应的持续不断的小流量请求,如快速加载 YouTube/TikTok/Twitter 首帧内容,访问素材网站快速加载缩略图等。

Hysteria 的设计目标是「最大化数据吞吐量」,相比之下,社区更加活跃,协议完成度更高,例如:已于 1.3.0 支持 port-hopping,可在一定程度上缓解 UDP 单端口长连接被运营商丢包的风险;支持 obfs 流量混淆;内部实现 TUN 以及ACL路由;相比之下,Hysteria 更加适合「激流」应用场景,即,非即时响应的高速流量,如数据集拉取,YouTube 8K 视频播放。

总得来说,TUIC 更适合移动端(蜂窝流量)使用场景。TUIC 的较低的网络往返时延,性能损耗以及带宽开销能够在短视频,即时通信等应用场景带来不错的体感升级,而当 VPS 线路质量较差时(如骨干网晚高峰)TUIC 发挥的作用非常有限。

Hysteria 更适合大流量应用场景,绝大多数的单节点 VPS 直连线路质量都很一般,Hysteria 微调后的拥塞控制策略的确能给劣质网络环境带来质变,但也需警惕错误的客户端配置带来的负优化。在服务器带宽盈余时,Hysteria 更符合大多数普通用户的综合需求,尤其在链路拥堵时段,代理中继延时在用户层面感知不强,反倒是数倍之差的下载速度体验成为矛盾焦点。

最后,在条件允许的情况下,直连线路搭配使用 QUIC 变种协议簇而非 VMESS,Trojan,VLESS 是更加明智的选择。如果你喜欢或依赖 CDN/Relay 则可以选择 「Shadowsocks + ShadowTLS」 或 「VMESS + TLS + WS + CDN」 等更加复杂的解决方案。

Reference

基于 QUIC 的代理软件:TUIC - EAimTY 的博客

chika0801/tuic-install: TUIC安装指南

You will to enjoy grander sight / By climing to a greater height.