关于多 WAN 多线无冲突负载均衡一点微小的想法

2016-09-26 13:35:24 +08:00
 qq316107934

方案

寝室里原来有一条 20M 的电信宽带,今年又办了一条 20M 的联通宽带,发现联通梯子用着顺畅,电信国内游戏延迟低,于是想做个双 WAN 合并,刷好了 OpenWRT 并配置了 MWAN3 ,上网找了一些方案,都不是很满意。目前据我所知道的多线负载均衡解决方案有:

1.基于单包的负载均衡:随机将包发送到多个 WAN 口上达到负载均衡的目的,缺点很明显,很容易造成某些应用的掉线,对于网银和 QQ 的支持不是很好, IP 会经常变化。

2.基于静态路由的负载均衡:就是针对 ISP 特定的 IP 段进行静态路由,达成了哪家 ISP 走哪家线的优点。但是问题也是存在的: DNS 会被直接分配给某一个固定 WAN 口,解析出来的 IP 的 ISP 来源是固定的,基本达不到负载均衡的目的。

3.基于 session 的负载均衡:流量特征识别,然后负载均衡,这个方案倒是比较好用,但是搜了下全网 1000 以下的路由基本没有,大部分是企业级的路由器,对于穷学生来说用不起,就不再考虑这个方案了。

想法

刚刚午休时冒出的想法:结合上文 1 和 2 ,利用静态路由表做 ISP 分流,然后 DNS 解析的时候对 DNS 的 IP 做基于包的负载均衡,让支持多线的不同网站解析出不同 ISP 的 IP ,既能达到负载均衡的目的,又不会因为包被分散发送而影响某个会话。

大家对此有何见解?或者有什么更好的方案吗? PS:预算在 350 以内, RouterOS 和软路由基本没戏。

谢谢大家。

8889 次点击
所在节点    宽带症候群
46 条回复
jasontse
2016-09-26 13:40:09 +08:00
你现在这个就可以,调一下 MWAN3 的 Rules 。
danili
2016-09-26 14:05:45 +08:00
为什么一定要做负载均衡呢,国内的电信好,访问国内用电信;国外联通好, shadowsock 忽略国内的 IP 走联通的不就 ok 啦?
mhqschen
2016-09-26 14:08:28 +08:00
听着不错,希望等 lz 弄好了能分享下。
qq316107934
2016-09-26 14:17:48 +08:00
@jasontse 是的,但是路由表有近万条(找到了稳定更新源), route add 会方便一些,还需要用 iptables 做 dns 的分流。
@danili 因为负载均衡可以榨干 40M 带宽呀, P2P 会比较爽。
@mhqschen 弄好了会把脚本放在 github 上,届时欢迎 star~
jasontse
2016-09-26 14:22:39 +08:00
@qq316107934 mwan3 支持 ipset 匹配,用这个效率高很多。
terrancesiu
2016-09-26 14:31:40 +08:00
我在 ros 这样做的,我是电信移动 2 条线,去 APNIC 弄出中国大陆的所有 ip 然后排除移动和铁通的,导入到 ros 里,做路由标记再 ip 列表里的目标 ip 都走电信,其他都走移动, dns 用 119.29.29.29 ,访问淘宝等 cdn 大站都很快。梯子的 ip 都不属于大陆的 ip 自然全部走移动了。 routeos 可以的 350 可以买个 rb750gr2 了,你一共 40m 的带宽,应该跑的过!
wwqgtxx
2016-09-26 14:34:12 +08:00
歪个楼, 350 之内马云家还是能买到不少装着 ros 之类的 x86 软路由的
qq316107934
2016-09-26 14:42:57 +08:00
@terrancesiu 您的 DNS IP 段我猜是不在电信路由范围内的,如果是这样的话解析出来的应该是移动的 CDN,加上您国外网络走的也是移动,会不会造成移动负载严重高于电信的情况呢?
aru
2016-09-26 14:55:28 +08:00
用静态路由吧
电信 ip 走电信,其他走联通
qq316107934
2016-09-26 15:01:36 +08:00
@aru 我的意思是结合静态路由,靠 DNS 解析请求随机分配到不同 WAN 口得到不同 ISP 的 IP 做进一步负载均衡。
jasontse
2016-09-26 15:16:13 +08:00
@qq316107934
你这个问题没那么麻烦,路由表还是按照运营商做。 dnsmasq 中转发到两个 dns 上游,哪个返回结果快取哪个。
```
# 删光系统默认设置
uci set dhcp.@dnsmasq[0].noresolv=1
uci delete dhcp.@dnsmasq[0].server
# 设置 dnsmasq
cat <<-EOF >/etc/dnsmasq.conf
all-servers
server=223.5.5.5
server=223.6.6.6
EOF
# 重启 dnsmasq
/etc/init.d/dnsmasq restart
```

最后把 223.5.5.5 和 223.6.6.6 路由到不同出口就行了。
JamesR
2016-09-26 15:18:21 +08:00
笔记本或台式机 VMware 虚拟机装海蜘蛛或 ROS , 0 元。最好用 ROS , PCC 负载均衡比较好。设置参考 YuSong 的“ RouterOS 入门到精通”。

PCC ( Per connection classified ):
PCC 是通过判断源地址或者目的地址、源端口或者目的端口对数据迚行分类来实现负载均衡,对每个连接迚行分类大多保持了连续性,这样大大弥补了 NTH 的不足。

1.both-address(双向地址)是以源地址和目的地址作为输入值。如果数据包的源地址和目的地址相同,则连接被分为一组,将得到相同的哈希值。然后把所有组进行平分标记(当然也可以不平分标记)。这些数据包将被分配到同一条外网链接上。 both-address 是比较稳定的一种设置方法,但不是很平均。

2.src-address and port 对相同源地址和相同源端口的数据包来说,将会被分配到同一条线路上。 这样的话,对于目的地址相同的数据包,也有可能分别走不同的线路,这在对安全性要求比较高的环境中,是不能被接受的。

3.src address 这种是负载均衡里面最稳健的。在某些环境中,甚至用 both adress 都会出现问题。但是 src-address 是所有模式里面均衡效果最差的, 因为兼容性和均衡效果不可得兼。

4.both addrss and ports 是均衡效果最好的。因为带有 port 的输入参数,引入了 port ,而 port 数值从 1-65535 ,因而 hash 的输入样本大大增加,使数据包平均分流到各条线路的概率也就大大增加了!
qq316107934
2016-09-26 15:26:28 +08:00
@jasontse 这个思路太棒了!多谢,我去试试!
cyang
2016-09-26 15:33:33 +08:00
https://ooo.0o0.ooo/2016/09/26/57e8ccb10dce9.png

一条电信 一条移动
1.移动的网站优先使用移动线路
2.除此之外的国内网站都使用电信线路
3.国外网站使用移动线路

不要一直纠结于负载均衡,选择最优线路加快访问速度才比较适合
qq316107934
2016-09-26 15:35:49 +08:00
@JamesR 看完对 ROS 肃然起敬,对双线来说这个真的是神器,看描述它的分流效果就是我想要的,准备先试试手里硬路由效果,达不到预期的话就上 ROS 。十分感谢您的耐心解答!
lanbing
2016-09-26 15:43:15 +08:00
出一台软路由,有 6 个口,现在装的爱快,应该可以刷海蜘蛛和 ros 。 350 块。 XD:
qq316107934
2016-09-26 15:45:32 +08:00
@cyang 😂😂这个不要太方便。但我在 newifi 刷写的 merlin 固件中的多拨与您的不同,只有部分功能不带 ISP 分流。您的固件是定制的吗?
qq316107934
2016-09-26 15:46:10 +08:00
@lanbing 可否说明型号?😳
lanbing
2016-09-26 15:53:22 +08:00
@qq316107934 不知道型号,应该是组装的。跟这种很像,稍后我发图片。 https://detail.tmall.com/item.htm?spm=a230r.1.14.92.ipmFAG&id=536909054273&ns=1&abbucket=17
KCheshireCat
2016-09-26 15:59:08 +08:00
按连接来均衡啊,用 iptables 的 state 模块对链接做追踪,把所有 NEW 包按出口数均分,或随机分配,并打上标记

然后对后续的 RELATED,ESTABLISHED 包按连接恢复标记

在 ip rule 按标记分配到不同路由表.

实现效果应该是介于 1,3 之间,但重点是实现简单方便,透明,只有有完整的 iptables,然后写个脚本就可以做到,完全不需要额外装什么包.

而且需要特殊按 IP 或其他条件来路由的话,只要调整 iptables 打上不同标记就好,很方便

自己目前就是这么用的,20 条 50M 宽带均衡负载.

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

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

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

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

© 2021 V2EX