WireGuard 跨国组网失败后,一个新工具的诞生

236 天前
 lanthora

TL;DR

一个可靠,低延迟,反审查的组网工具

背景

我在国外有一台性能非常弱但是有公网 IP 的 VPS. 国内有一台 7*24 小时开机的 mini 主机.让 mini 主机作为 VPS 的后端,不在 VPS 上存放任何数据,解决了 VPS 性能弱的问题,也解决了替换 VPS 供应商时迁移数据的问题(当然也包括对 VPS 供应商的信任问题).

最初选择的组网方案是 WireGuard, 它平静的陪伴了我几个年头,直到 2023 年某此会议的召开.原因为会议开完我的 WireGuard 就能继续用,一个月后证明我想多了.

于是决定解决这个问题.调研了一系列项目后,没有找到天生隐藏协议特征的组网工具(可能设计者设计之初也没有考虑这种问题把).把 VPN 套到 Proxy 里的这种诡异方案也称试过,虽然能用,但是很不喜欢

整体设计思路

设计的宗旨是简洁.在不牺牲性能和核心功能的情况下,用最少的代码量和最简单的概念完成设计.

降低配置复杂度

WireGuard 在 VPN 里配置已经相对较简单了,但对我来说依旧过于复杂.回忆一下你用多长时间完成的第一次 WireGuard 组网. WireGuard 需要强制指定虚拟地址,不适用于想要灵活接入多个客户端并动态分配地址的场景.

用 WSS(Web Socket Secure) 处理通信,在保证链路数据安全的情况下,免去了配置公私钥的过程. 用口令校验客户端,可以轻松的让新客户端加入网络,这样就能由服务端实现地址动态分配.

高效的断线重连

在某些情况下 WireGuard 会断线,只有重启客户端才能解决.此时对于一个无人值守的设备,就意味着彻底失联. 曾经为了解决这个问题,给设备配置每天重启一次,这显然是一种很丑陋的解决方案.

使用 WSS 通信,就可以用 Ping/Pong 完成 TCP 保活,即使 TCP 连接异常断开,应用也可以及时发现,迅速处理.

支持内网穿透的对等连接

虽然 WireGuard 支持对等连接,但要求设备之间能够直接访问,对于双方都在 NAT 后面的情况无能为力. 增加内网穿透功能,可以节约服务端转发的流量,同时还能降低通信延迟.

内网穿透通过 STUN 服务器获取本地 UDP Socket 被映射后的公网地址和端口,通过服务端与其他客户端交换地址和端口信息,并尝试建立连接.

高速的中继路由

有时候两个客户端之间无法直连,但它们都能与另一个客户端直连.此时可以以这个客户端作为中继相互访问.

这实际上是路由的问题.本项目实现的是距离向量算法.

局域网对等连接

通过 STUN 查到的用于对等连接的地址是公网地址,对于局域网内能够直连的设备来说,绕到最外层的路由器再回来是浪费了时间的,并且还会受到公网带宽的限制.

通过用户配置或主动探测本机的局域网地址,可以优先尝试本地直连.

总结

其实最初的版本只有 WSS 中继功能,后来在用户的反馈中加上了 P2P 和利用网络中的其他客户端做中继的功能.新增的功能我自己也能用得上,体验上也有巨大的提升.

有一些其他的组网工具有着极其丰富的功能,而我的设计初衷是让两台装了客户端的机器能够简单快速稳定的通信,因此舍弃了很多功能,甚至用"口令"这种在现代视角看上去不够零信任的方式鉴权.

13142 次点击
所在节点    宽带症候群
86 条回复
lanthora
236 天前
@chairuosen 这是个只能用来组网的工具,应该还不用隐藏自己的信息吧.
wskymark
236 天前
wireguard 要重启确实麻烦
echoless
236 天前
@lanthora 隐藏自己信息总没有坏处

不懂网络 感觉很牛批 准备试试 多谢
Fish1024
236 天前
好,收藏。
wuruxu
236 天前
@wskymark wireguard 不是有 keepalive 的吗? 我一直也没有遇到 wireguard 断开的情况
Damn
236 天前
在某些情况下 WireGuard 会断线,只有重启客户端才能解决。
----------
比如?
我国内互联似乎还没遇到过,只遇到过宽带重新拨号导致 IP 变化了,需要更新 endpoint 的 ip:port 。
frencis107
236 天前
@Damn 国内某些地区,使用 wg 跨运营商连接时,会出现一段时间(一分钟内)后自动断开的问题,只能重启重连解决。ip 没变,keepalive 参数也有设置
lanthora
236 天前
@Damn @wuruxu 在两边都开 keepalive 的情况下还是会断,不开 keepalive 更容易断,wg 的 keepalive 貌似只是周期性的发包,不考虑对方会不会回.

从现象上来说就是我连不会去了,而重启可以解决.国内互联没有遇到过说不定也是防火墙导致的.
deerpine
236 天前
试一试
Damn
236 天前
@frencis107 我移动联通跨省互联的,wg 运行在原版 openwrt 上,没有遇到过你描述的情况。
@lanthora 重启换 ip 没有呢?如果换了,是不是反向墙?有很多帖子提到过。
lanthora
236 天前
@Damn 不确定有没有换 IP,不过从出问题的时间间隔上来看像是 NAT 换了 IP. 我已经一年多不用 WG 了,具体情况不是很清楚
wuruxu
236 天前
@lanthora 是的 wireguard keepalive 是单向的,只是用来标记 Peer 是否还活着
国内七八台 openwrt 路由器组成一个 wireguard group, 这两年用下来也还正常
跨国的 wireguard 一般都是 节点丢包率太高了,一般只要没有丢包,都挺正常的
等你的包移植到 openwrt 上,我也去试试
coffeesun
236 天前
我不太懂网络,意思是可以替换掉我 zerotier 组网,并可以使组成的局域网设备通过国外的机子转发流量并翻墙么?这个能长期稳定如 v2ray 么
andytao
236 天前
@GeekGao 感谢楼主分享,袋鼠数据库工具 准备把隧道支持从 ssh/plink(PuTTY) 替换为 wstunnel 。
wuruxu
236 天前
@Damn 路由器重启 换了 ip , 这个目前有什么好的办法吗?
目前我就是通过 ddns 上报新的公网 IP ,然后在其他 Peer 上,定时去 set wireguard 的 peer 域名地址,一般需要 10 分钟才可以恢复
lanthora
236 天前
@coffeesun

> 替换掉我 zerotier 组网

理论上可以替换,但是如果你现在 zerotier 用着很爽,完全没有换的必要.

> 使组成的局域网设备通过国外的机子转发流量并翻墙

不能,没有翻墙的功能.
Damn
236 天前
@wuruxu 你是有机器没有 ipv6 且 v4 在 nat 后面么?
如果各 peer 都有公网 ip 并配置独立的二级域名的话,除非同时换 ip 了,不然重启或者重拨都会触发解析 ip 地址这个动作,然后可以成功连接的。
nat 后面的话原版 wg 似乎确实没什么高效的解决方法,可以选择各种修改版。
Damn
236 天前
@wuruxu 我刚刚试了一下手动重拨远端的 pppoe ,大约 10s 就恢复了。
blankmiss
236 天前
用 tailscale 不就行了
KanVivii
236 天前
哈喽 方便给个联系方式嘛!
有个 SD-WAN 类似的项目想一起合作一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1035681

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX