利用CDN对单条私有线路负载均衡
需求
自有线路,服务器有业务在跑,顺带做个自用机场。在特殊时期希望隐匿服务器 IP,所以考虑挂 CDN 使用。
免费的方案一般是套 CloudFlare 减速云,少部分使用 Asians.Group。瓶颈主要在单服限速(CloudFlare 的测速工具只能保证连通,很难稳定维持)。所以我希望本地可以做负载均衡。我预期的传输方式是,客户端 - 多台 CDN - 落地机。因为出口是同一台服务器,所以 url hash 不合适,最好是轮询。
寻找解决方案
v2ray 本身支持 轮询 和随机两种调度方式,问题在于 Gui 管理。v2rayN 只能通过导入 .json 文件的方式使用复杂配置,因为 ip 不稳定,配置格式使得频繁修改 ip 比较麻烦。而 Clash for Windows 默认是高可用模式,除非自己修改源码 才能支持轮询,所以也只能放弃。
最终找到 nadoo/glider,本身是代理链工具,它正好拥有以下特性:
- 支持 vmess / vless / trojan 等协议
- 配置结构简单,一行一条线路
- 支持 round robin 策略
具体配置
协议方式:vm(l)ess + lts + websocket
客户端: glider + v2rayN / Clash for Windows
glider 说明中有很多示例,以下是针对 CDN 的具体配置。
以 vless 为例,服务器配置如下:
"inbounds": [ { "port": local-port, "listen": "127.0.0.1", "protocol": "vless", "settings": { "decryption": "none", "clients": [ { "id": "put-your-uuid-here", "level": 0 } ] }, "streamSettings": { "network": "ws", "wsSettings": { "path": "/ws" } } } ...
glider 本地配置:
以 vmess 为例,服务器配置如下:
"inbounds": [ { "port": local-port, "listen": "127.0.0.1", "protocol": "vmess", "settings": { "clients": [ { "id": "put-your-uuid-here", "alterId": 0 } ] }, "streamSettings": { "network": "ws", "wsSettings": { "path": "/wss" } } } ...
glider 本地配置:
wss 是后来增加的,也可以用最原始的写法,以 vmess 为例:
复制多行,策略选择 rr,以后只修改 CDN_IP 部分即可。
没有特殊需求,就已经可以通过默认 http / socks 端口 8443 使用,之后在 v2rayN 中加入一个 127.0.0.1:8443 的 socks 线路即可。
关于 Clash 的小麻烦
Clash for windows 的分流策略还是挺好用的,但是加入 socks5 有点麻烦。问题来自 subconverter 的 Bug,无法直接导入 socks5,所以需要手工改配置。有两个办法解决。
方案一
将 glider 中的监听改为 code>listen=ss://aes-128-gcm:p@:8443,然后在 Clash 订阅工具中填入 code>ss://[email protected]:8443#Local。这会损失一部分性能,因为客户端不支持 ss 协议 none 加密,不过总体而言,PC 也不差这点性能。
方案二
转换订阅链接填写 clash
,然后修改本地的 parser。
parsers: # array - url: your-sub-url yaml: prepend-proxies: - name: "Local" type: socks5 server: 127.0.0.1 port: 8443
clash
不是一个合法地址,所以转换时会被丢弃,同时 parser 会在导入时加入一个 socks5 服务器。具体可以参考 配置文件预处理。
小结
以上方案仍然不能突破单服务器带宽限制,个人体验,打开一般网站已经很流畅,多线程下载也很顺畅,4K 视频比较吃力。另外,glider 不支持 v2ray 的 mux,算是一点遗憾。
至于如何测速和寻找稳定的 CDN IP,又是一个麻烦的问题。