利用 dns 负载均衡提高宽带多拨状态下的上行并发能力

终于如愿以偿的用上了软路由。体验到了飞一般的 $$ 速度,也体会到了单线多拨的好处,我电信宽带 100M 小水管 4 拨之后瞬时变成了大几百M的高速公路。

多拨的另外一个副产品就是一下子多了几个公网 IP,我想到有没有办法用上这几条多拨出来的线路,来提高家庭宽带的上行带宽呢?毕竟每条线路只有30M的上行带宽,在外边有多个终端连接进来时,可以并发的使用这些线路来提高负载能力。

koolshare 的改版 LEDE 中自带了一个软件中心,其中有一个很有用的插件 koolddns,可以用它来实现动态 dsn 绑定。并且在多拨的情况下,可以根据虚拟网卡来指定不同的 wan 口绑定到不同的域名。

我将我的四条线路分别绑定到 4 个不同的域名:

1
2
3
4
wan0 --> a0.xxx.com
wan1 --> a1.xxx.com
wan2 --> a2.xxx.com
wan3 --> a3.xxx.com

这样我们就有了 4 个指向了不同 IP 的域名,而这 4 个 IP 都指向我们的路由器出口。在路由器后面我有一系列的机器,最主要的就是运行了各种网络服务的 NAS。

为了访问方便,我给重要的服务都申请了单独的子域名,比如:

1
2
3
4
git.xxx.com
nas.xxx.com
db.xxx.com
......

以前没有多拨的时候我是直接通过 DDNS 把这些域名绑定到动态的宽带 IP 上,那么现在有了 4 条线路,该怎么绑定才可以让外边访问这些服务的时候访问不同的线路呢?

DNS的解析服务提供了给一个域名配置多条解析记录的功能 (我用的阿里云的解析服务,其他服务商可以自行查阅服务商的文档)。在配置了多条解析记录后,不同的终端访问该域名,域名服务商会将域名随机的解析到一个 IP 上,这就达到了一个负载均衡的效果。

koolddns 是不支持将多个 wan 口的 IP 设置到一个相同的域名的,所以我们上边为每个 wan 口设置了一个单独的域名。剩下的工作我们在域名解析服务上的后台来配置。

比如我要解析 git.xxx.com 这个域名,我需要在域名配置后台设置 4 条 cname 解析记录:

1
2
3
4
git  --cname--> a0.xxx.com
git --cname--> a1.xxx.com
git --cname--> a2.xxx.com
git --cname--> a3.xxx.com

这样,当访问 git.xxx.com 的时候,会随机的解析到 a0-a3之中的一个 cname 域名,进而指向一个特定的 wan 口的 IP。

这种方式对于单一终端访问的带宽是没有提升的,因为一次只能连接一条线路,单条线路的带宽是固定的;但是对于多终端并发访问却是有提升的,因为不同的终端会分配不同的线路,多条线路之间的带宽是互不影响的。