WireGuard 在 i-HDU 之死

突然集体下线了

前几天接到悲报,说是 Vidar-Team 300b 节点从 DN11 下线了

校园网需要走web认证登陆,所以起初我以为是校园网的登陆脚本炸了,找个人把自己账号登上去救一下急就好了

后来派煎包去看看,他回来告诉我,Vidar 的 WiFi 有网,网很好校园网也登着

这就很让人迷惑了,按理说有网的情况下,万万不该这么多隧道一起炸了

由于是暑假,Vidar 没有网管在学校里,连不进去无能为力,这件事就这么搁置了好几天

SSTP 你怎么活着?

自爆炸后,一转眼就过了好几天,因为前两天刚刚冲了一手新版本 RouterOS,搞得我以为这个是 RouterOS 的 bug

直到… Liki 发现他的 sstp 依旧稳如老狗,我赶紧找了台 frp 穿透出来的机器测了一下校园网的 WireGuard 情况

这个案子破了,WireGuard 被校园网拦截了。

缝缝补补

原来只是封杀了一个协议而已,不算什么大事情,得赶紧去修网了

于是在校园网里扫了一下 ip,把路由器的 WAN IP 先扫出来,然后借着上面提到的这台 frp 穿透出来的校园网机器作为跳板,起了新的 frp 内网穿透

现在总算能连上路由器了,果然 WireGuard 全部掉线了,SSTP 还健在。

赶紧找了 potat0 把他最爱的 WireGuard in VLess 先部署了上去,临时恢复了网络。

转生成为 WireGuard-mix

WireGuard 是寄了,但是我确实很喜欢 WireGuard,不然我也不会 ALL IN

救一下 WireGuard 吧,还是很简单的啦

gogogo

WireGuard 有一个用户态版本,叫做 WireGuard-go,是 go 实现的

而 go 的编译是出了名的简单,又是我的主要技术栈,很方便我修改

一般防火墙识别 WireGuard 靠的是握手包里的一段 0x01000000 指纹,我只要做改个常量就可以解决掉他了。

wg-mix

就是这四个常量,他们在 WireGuard-go 的实现里是四个小端序的 uint32, 只要把这四个常量改成四个随机的 uint32 就好了

wgmixtest

这网简直不能再通了,轻松解决问题

wg-quick

wg 实例魔改好了下面得魔改一下 wg-quick 了

wg-quick 本质就是一个 bash 脚本,这下魔改起来更方便了

我们照猫画虎地给他添加了一个 WgBin 字段,用来指定 wireguard-mix 的文件路径

然后修改了一下起接口这一块的逻辑,如果这个字段非空就优先生效这个

# 添加在配置文件解析部分
WgBin) WG_BIN="$value"; continue ;;

# 添加在 add_if 最前面
if [[ "$WG_BIN" != "" ]]; then
    cmd "$WG_BIN" "$INTERFACE"
    return;
fi

这里有一点坑,版本号为 1.0.2020xxx 的 wireguard-tools 对 wireguard-go 的兼容性不好,直接影响了我 wireguard-mix 的使用

实测版本号 1.0.20210914-1ubuntu2 的没有问题,估计是一点小 bug, 用新版本就是了

wgmixtest

以上小把戏全部公开在 github, 如果喜欢的话可以考虑给个 Star? 就一点点小改动,收 Star 收起来也有点愧疚啊 https://github.com/BaiMeow/wireguard-mix

我主路由是 ros 我怎么玩?

上面提到,主路由是 RouterOS,这也就意味着我很难很难把我的魔改 wg 放到上面去跑

那其实我个人能想得出来的其实还有两种方案

  • wireguard in wireguard-mix
  • ibgp

权衡了一下还是选择了 ibgp 这个方案,我也不喜欢到处洞里打洞

具体怎么做呢,在内网开一台虚拟机,上面跑我的 wireguard-mix,然后把这台机器装个 bird 拿去和主路由配 IBGP,最后修改 bgp_local_pref 让他选路到这台虚拟机上出网。

思路还是很清晰的,虽然复杂了一点但是总体还是比较清真的

烂网大师

配网的时候能一定一定要开 Safe Mode 啊

0.0.0.0/0

ros 打错勾了,把 0.0.0.0/0 宣告了出去,导致一台服务器 reboot

IGP

bird 没有配 igp table 导致 IBGP 路由全部 unreachable

这个问题算是比较常见了,bird 的 mail list 里也能看见一个

三个解决方案

  • 真的起一个 IGP
  • 写静态
  • 写 filter

我选择写一个静态路由到 igp 路由表,有点不太清真,但是改动比较小

The End

我需要反思,我不应该 ALL in WireGuard 的,对付不好的网络环境用一种隧道技术寄了就是全部寄,这样的网络非常需要多种协议作为备份

经过一波大修,现在已经同时有四条不同协议的隧道在运行,这下安如磐石了吧?

One More Things 顺便突破一下多终端上网检测?

做了一些小试验,试验还在进行中。

查阅了一下网上的资料,对于多终端上网检测,主流就两种

  • 检测 HTTP 的 User-Agent
  • 检测 TTL

TTL 在 RouterOS 里还是方便修改的,HTTP 流量说实话,已经没那么多了,大多数 web 都是 HTTPS 的流量,于是这次实验性地做了一点改动

  • HTTP 流量通过隧道转发
  • 出WAN口前,TTL全部修改为 64

还在试验中,不知道效果如何。

备用方案

其实配个主备也不是不可以,搞俩 WAN 出来,然后 dhcp 拿俩,登俩号上去,备线没有流量肯定不会被多终端检测,一旦主线断开就可以切换到备线了。

这个方案的问题在于,真的不好检测断开,得写脚本检测然后拿脚本操作 RouterOS API 去切换