1 整体方案

我的各种服务器都放在了实验室里面,可以蹭教育网的政策优惠(貌似没备案也不会有人来管),用来挂自己专用的工作网站,也不会给学校添加意外的麻烦。不过教育网的问题在于,如果同市还好,跨地区时教育网转到教育网的速度实在是太慢,而且延时很高。这两天折腾出一个方案来做加速访问。当然了,我的方案还是限于自用,如果有人想给自己的公共网站加速,用我这个方法就不行了。

我这个方法的核心就在于使用一个和我的教育网服务器同地区的云服务器做中转。因为国家政策限定,如果你在云服务器主机上直接跑 HTTP 的流量而不备案的话,很快你的云服务主机就会被ban掉。因此我将我的教育网主机,跳板服务器和我的客户端环境都接入了 Zerotier 网络。然后在跳板机上使用 Haproxy 建立 TCP 代理,将跳板机上的 80 和 443 端口的 TCP 流量都转发到教育网主机的对应端口。注意这里的流量转发全程我们都是用的 Zerotier 私有地址,而不使用公网 IP。那么我们的流量在这三个节点之间流通的时候,就都是经过加密的代理流量,而不是 HTTP 流量,从而避开 HTTP 协议检测。

使用 Zerotier 的好处是这个 VPN 网络是 P2P 的,不需要建立中央服务器,自然也不会受到中央服务器的性能制约。不然的话,这个方案就需要在跳板服务器上搭建 VPN 服务器并将教育网主机和客户端都加入到这个 VPN 网络。这个方案从操作层面就比 Zerotier 麻烦多了。

2 建立路由

我这里麻烦一点是因为我的网络架构比较复杂。我的教育网主机并不是直接加入的 Zerotier 网络,而是我的实验室里的路由器加入了 Zerotier 网络。假设实验室内网网段是 192.168.2.0/24,Zerotier 内网网段是 172.10.0.0/16。这时在跳板服务器或者客户端上是无法直接访问 192.168.2.0/24 这个网段的。我们需要在 Zerotier 网络设置中建立路由:

1
192.168.2.0/24 via 172.10.**.**

这里的 172.10.**.** 是实验室路由器,即加入 Zerotier 网络的节点的地址。这条设置告诉了网络中的所有的节点,如果一个包的目的地址是 192.168.2.0/24 这个网段的,那么先把包发送给 172.10.**.** 这个节点,它知道如何处理这个包。等这个包被实验室路由器收到之后,实验室路由器是知道这个网段的,因此可以完成转发。

在 Zerottier 中设置之后,要将这条路由信息推送到客户端,还需要我们在客户端能运行下面的代码:

1
sudo zerotier-cli set <network-id> allowGlobal=true

其中 <network-id> 是指你的 Zerotier 私网ID。这条设置会让 Zerotier 为客户端设置全局路由。设置完成之后我们可以运行

1
sudo ip -4 route

查看客户端路由表确认是否有对应 192.168.2.0/24 作为目标网段的路由记录。确认存在以后我们可以 ping 一下教育网主机的私有地址做最后的验证。

3 建立端口转发

使用 Haproxy 来做 TCP 转发非常方便。使用 sudo apt install haproxy 安装 Haproxy 之后,编辑 /etc/haproxy/haproxy.cfg 文件,首先修改默认设置中的工作模式,从 http 修改成 tcp。

1
2
defaults
mode tcp

然后在末尾添加:

1
2
3
listen jump
bind *:443
server srv1 192.168.2.X:443

这里 192.168.2.X 是教育网主机的私有地址。

jump, srv1 等都是自定义名称,可以随便定义,按照一般编程语言的变量命名标准即可。

完成设置以后重启 Haproxy

1
sudo systemctl restart haproxy。

4 修改 Host

在客户端修改 Host 文件:

1
192.168.2.X yourdomain.com



至此我们就完成了全部的设置。访问 yourdomain.com,流量会先发送给跳板服务器,然后跳板服务器转发给教育网主机。客户端和跳板机在同一运营商网络之下,因此即便异地,速度也还可以。跳板机和教育网主机在同一个地区,跨网通信损失也小。因此总的链路质量是要好于客户端与教育网主机直连的。

这时候的性能瓶颈,就在跳板机的带宽了。国内 VPS 主机的带宽还真的是贵啊!