我一直是将我的多个服务器以及本地的设备通过VPN网络连接起来,使他们处于同一个内网之中。这样能使服务器之间共用一些服务,数据不在公网传输,安全性更高,配置维护更容易。同时我家中没有公网IP的设备,在外部可以通过VPN的内网便利访问。
之前我使用SoftEther VPN的site to site方式+级联,搭建VPN网络。但是这样组建的网络属于标准的树状网,缺点也是众所周知的可靠性差,一旦某一级节点和上一级出现问题,下级统统遭殃。而我的网络的根节点在国内,部分服务器在国外,这个缺点造成的影响相对也更大了。
所以,我将我的网络改为网状网络的方式,中心节点节点之间增加冗余连接,次要分支节点继续使用普通的site to site方式连接。虽然组网配置成本更高了,但是可靠性能够得以大大提升。通过SoftEther VPN的site to site方式组建的网络是工作在网络模型的第二层,如果组建环形网络,必须要解决广播风暴的问题,因此也就离不开生成树协议,而Linux下的网桥是可以支持生成树协议的,所以我就通过Linux下的网桥来组建我期望的带有冗余连接的环形网络。下面的操作是我基于Debian sid
的Linux环境对中心节点进行相关配置的过程。
首先我通过site to site方式将A节点同B、C两个节点连接起来。然后桥接出tap设备。此时每个tap设备相当于一个物理网卡,而每个VPN连接就相当于一条网线。这里我桥接出了三个tap设备。tap_vpn
、tap_a2b
、tap_a2c
,分别用于接受其他节点连接、A到B的连接、B到C的连接。
然后安装bridge-utils
这个包,用于创建网桥。然后依次执行下面的命令:
brctl addbr br0
创建一个名为br0
的网桥。
brctl addif br0 tap_vpn tap_a2b tap_a2c
将三个端口桥接在一起
brctl stp br0 on
开启STP协议,也就是生成树协议,也就是用来支持冗余连接的关键一步
然后通过 brctl showstp br0
,可以看到网桥工作的状态。
网桥工作正常后,可以通过ifconfig br0 10.0.0.1
来配置当前节点所使用的IP地址。
此时这个节点就相当于一个支持生成树协议
然后在各个节点重复上述步骤组建出完整的网络结构。此时,就组建出了一个具有冗余连接的VPN网络。
现在回头看网桥的工作状态,可以看到部分接口的state
已经为block
,即已经基于生成树协议断开此条链路。效果如下图所示:
![](https://blog.sdlsj.net/wp-content/uploads/2021/08/image-1.png)
最后,还可以将相关配置保存在/etc/network/interfaces中,这样就不需要每次开机都重复配置。配置如下所示:
auto br0
iface br0 inet static
address 10.0.0.1
netmask 255.255.255.0
bridge_waitport 60
bridge_ports tap_vpn tap_a2b tap_a2c
bridge_stp on