一、前言
本文仅用于技术交流,请勿使用技术从事任何用违法违规活动。
二、背景
有个朋友在国外,他想和国内的朋友进行局域网联机玩一款游戏。
很明显双方在异地需要构建虚拟局域网进行互联互通。显然使用 WireGuard 是最简单的。
但基于 UDP 协议的 WireGuard 在跨境场景下并不是那么友好。
UDP 在跨境的时候被限制并不是什么稀奇的事情。
此外 WireGuard 的流量特征也是很明显, DPI 深度包解析一扫就出来了。不说你应该都知道这意味着很容易被拦截
有什么办法可以解决?
我想到了用 Trojan-Go 的协议去封装 WireGuard 。大致流程用文字形容就如下
国内用户 ----WireGuard 客户端接入----> 国内服务器----Trojan-Go 封装 (wg的报文)--------> 海外服务器(卸载 Trojan-Go 协议) -------> WireGuard 服务。
三、如何实现?
3.1 开始折腾
这里有个问题,就是如何将 WireGuard 的报文喂给 Trojan-Go 客户端?
起初想的是使用 udp2raw 这种客户端,将 WrieGuard 的 UDP 报文变更为 TCP 通过 Trojan-Go 自带的 socks5 协议将转换后的 TCP 版本的 WrieGuard 报文喂给 Trojan-Go。
折腾了很久,效果并不好,丢包严重
udp2raw 实现的比较底层,是基于 raw socket 做的。 他将 UDP 转换成了 TCP 报文,还要考虑 MTU 的大小。 看了 Github 上的 Issue 好多个人都遇见 WireGuard + udp2raw 出现高丢包的问题,基本上都是要把 Wireguard 的 MTU 改小。 难搞的是我基于的 wg-easy 搭建的 wireguard 不支持 WrieGuard 服务端修改 MTU 。每次手动修改完,docker 重启容器都会还原为原始的 MTU:1420
3.2 架构落地与自研
我比较懒,我并不追求极致性能也不想踩太多坑。给智谱喂了几十块钱让 AI 帮我写了个 udp2tcp 的功能。
我实现的架构如下

这种下应该是稳了。
四、杂言
其实上面的架构就是游戏加速器的原型了。国内和海外跨境企业组建虚拟局域网依然可以使用这种办法。
当然里面还有很多动态路由的调度上的事情。都是需要在应用层上做探测,选择优的线路,让客户端之间无感切换。
文章评论(0)