跨境组网—三层互联加速方案

2026年4月5日 0 条评论 11 次阅读 0 人点赞

一、前言

本文仅用于技术交流,请勿使用技术从事任何用违法违规活动。

二、背景

有个朋友在国外,他想和国内的朋友进行局域网联机玩一款游戏。

很明显双方在异地需要构建虚拟局域网进行互联互通。显然使用 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 的功能。

我实现的架构如下

这种下应该是稳了。

四、杂言

其实上面的架构就是游戏加速器的原型了。国内和海外跨境企业组建虚拟局域网依然可以使用这种办法。

当然里面还有很多动态路由的调度上的事情。都是需要在应用层上做探测,选择优的线路,让客户端之间无感切换。

兰陵美酒郁金香

大道至简 Simplicity is the ultimate form of sophistication.

文章评论(0)

你必须 登录 才能发表评论