V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qq316107934
V2EX  ›  宽带症候群

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

  •  
  •   qq316107934 · 2016-09-26 13:35:24 +08:00 · 8904 次点击
    这是一个创建于 2984 天前的主题,其中的信息可能已经有所发展或是发生改变。

    方案

    寝室里原来有一条 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 和软路由基本没戏。

    谢谢大家。

    46 条回复    2016-12-17 12:13:29 +08:00
    jasontse
        1
    jasontse  
       2016-09-26 13:40:09 +08:00 via iPad
    你现在这个就可以,调一下 MWAN3 的 Rules 。
    danili
        2
    danili  
       2016-09-26 14:05:45 +08:00
    为什么一定要做负载均衡呢,国内的电信好,访问国内用电信;国外联通好, shadowsock 忽略国内的 IP 走联通的不就 ok 啦?
    mhqschen
        3
    mhqschen  
       2016-09-26 14:08:28 +08:00
    听着不错,希望等 lz 弄好了能分享下。
    qq316107934
        4
    qq316107934  
    OP
       2016-09-26 14:17:48 +08:00 via Android
    @jasontse 是的,但是路由表有近万条(找到了稳定更新源), route add 会方便一些,还需要用 iptables 做 dns 的分流。
    @danili 因为负载均衡可以榨干 40M 带宽呀, P2P 会比较爽。
    @mhqschen 弄好了会把脚本放在 github 上,届时欢迎 star~
    jasontse
        5
    jasontse  
       2016-09-26 14:22:39 +08:00 via iPad   ❤️ 1
    @qq316107934 mwan3 支持 ipset 匹配,用这个效率高很多。
    terrancesiu
        6
    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
        7
    wwqgtxx  
       2016-09-26 14:34:12 +08:00 via iPhone
    歪个楼, 350 之内马云家还是能买到不少装着 ros 之类的 x86 软路由的
    qq316107934
        8
    qq316107934  
    OP
       2016-09-26 14:42:57 +08:00 via Android
    @terrancesiu 您的 DNS IP 段我猜是不在电信路由范围内的,如果是这样的话解析出来的应该是移动的 CDN,加上您国外网络走的也是移动,会不会造成移动负载严重高于电信的情况呢?
    aru
        9
    aru  
       2016-09-26 14:55:28 +08:00
    用静态路由吧
    电信 ip 走电信,其他走联通
    qq316107934
        10
    qq316107934  
    OP
       2016-09-26 15:01:36 +08:00 via Android
    @aru 我的意思是结合静态路由,靠 DNS 解析请求随机分配到不同 WAN 口得到不同 ISP 的 IP 做进一步负载均衡。
    jasontse
        11
    jasontse  
       2016-09-26 15:16:13 +08:00 via iPad   ❤️ 1
    @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
        12
    JamesR  
       2016-09-26 15:18:21 +08:00   ❤️ 1
    笔记本或台式机 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
        13
    qq316107934  
    OP
       2016-09-26 15:26:28 +08:00 via Android
    @jasontse 这个思路太棒了!多谢,我去试试!
    cyang
        14
    cyang  
       2016-09-26 15:33:33 +08:00   ❤️ 1
    https://ooo.0o0.ooo/2016/09/26/57e8ccb10dce9.png

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

    不要一直纠结于负载均衡,选择最优线路加快访问速度才比较适合
    qq316107934
        15
    qq316107934  
    OP
       2016-09-26 15:35:49 +08:00 via Android
    @JamesR 看完对 ROS 肃然起敬,对双线来说这个真的是神器,看描述它的分流效果就是我想要的,准备先试试手里硬路由效果,达不到预期的话就上 ROS 。十分感谢您的耐心解答!
    lanbing
        16
    lanbing  
       2016-09-26 15:43:15 +08:00
    出一台软路由,有 6 个口,现在装的爱快,应该可以刷海蜘蛛和 ros 。 350 块。 XD:
    qq316107934
        17
    qq316107934  
    OP
       2016-09-26 15:45:32 +08:00 via Android
    @cyang 😂😂这个不要太方便。但我在 newifi 刷写的 merlin 固件中的多拨与您的不同,只有部分功能不带 ISP 分流。您的固件是定制的吗?
    qq316107934
        18
    qq316107934  
    OP
       2016-09-26 15:46:10 +08:00 via Android
    @lanbing 可否说明型号?😳
    lanbing
        19
    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
        20
    KCheshireCat  
       2016-09-26 15:59:08 +08:00   ❤️ 1
    按连接来均衡啊,用 iptables 的 state 模块对链接做追踪,把所有 NEW 包按出口数均分,或随机分配,并打上标记

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

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

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

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

    自己目前就是这么用的,20 条 50M 宽带均衡负载.
    lanbing
        21
    lanbing  
       2016-09-26 15:59:44 +08:00
    Ansonyi
        22
    Ansonyi  
       2016-09-26 16:01:30 +08:00
    @cyang 梅林的那个版本呢?求一个。
    ryd994
        23
    ryd994  
       2016-09-26 16:04:05 +08:00   ❤️ 1
    建议还是要判断 7 层协议,至少区分端口
    游戏有固定端口, fq 也有固定协议和端口,你的主要需求是完全可以满足的。

    至于 bt ,除非双开,否则效果无论怎样都不会好,因为 tracker 每个 peer 只记录一个 ip ,而不双开 peerid 是一样的。 DHT 只会从默认路由上出去,所以反之也是一样。而且如果你用随机路由的办法,来回跳,只会给其他 DHT 客户端带来困扰。 BT 指定端口范围就行,这样也可以匹配。

    剩下的可以考虑 geoip 外国网站走联通

    国内基本上还是电信快

    软路由的话,找师兄买旧电脑,找不到就网上买个二手商务本, CPU 够就行,很便宜的, 350 以内完全可以。
    laoyuan
        24
    laoyuan  
       2016-09-26 16:05:21 +08:00
    我嗅到了淡淡的蛤意
    qq316107934
        25
    qq316107934  
    OP
       2016-09-26 16:13:32 +08:00 via Android
    @ryd994 全方位解答了我的所有疑惑,谢谢!现在考虑入 ROS 坑了,想来想去还是软路由区分协议,然后用 both address and ports 分流靠谱。
    qq316107934
        26
    qq316107934  
    OP
       2016-09-26 16:22:29 +08:00 via Android
    @KCheshireCat 20 条...给壕跪了。是一种好方案, mark 一下,但还是准备上软路由。话说这么宽的水管用这种方案效率真的不会出问题吗?
    qq316107934
        27
    qq316107934  
    OP
       2016-09-26 16:31:35 +08:00 via Android
    @lanbing 想详细问下风扇噪音和 CPU 型号,如果谈妥可以走某鱼吗?
    KCheshireCat
        28
    KCheshireCat  
       2016-09-26 16:35:45 +08:00   ❤️ 1
    @qq316107934

    这个还是有硬伤的.把链接分配到不同路由表的话,对网关,也就是路由器本身的发起连接是无效的.从网关发起的连接是不经过打标记的那些 iptables 表的.

    虽然大部分情况下 http/https 连接会支持 keep-alive,也就是一个请求完了会保持 tcp 连接以便之后请求复用,只要连接还没断开就不会分配新的出口,session 就不会有问题.

    但是遇上不支持 keep-alive 的服务器,就很有可能没法保持 session 了.

    再有就是虽然是按连接均分或随机分配,但每条连接有多少流量是不确定的,如果偶然的把大流量的连接都分配到一个出口了,还是会出现流量叠加不理想的情况.
    lanbing
        29
    lanbing  
       2016-09-26 16:37:10 +08:00
    @qq316107934


    CPU : Intel(R) Celeron(R) CPU 1037U @ 1.80GHz | 2048 KB | 1795.753 MHz | x2
    硬盘: ATA CF Card Ver2 (2.01 GB/1.87 GiB)
    内存: 1940 MB


    主板芯片 Intel Corporation Device 0154 (rev 09)
    PCI 桥 Intel Corporation Device 0151 (rev 09)
    显卡 Intel Corporation Device 0156 (rev 09)
    USB 控制器 Intel Corporation Cougar Point USB Enhanced Host Controller #2 (rev 04)
    PCI 桥 Intel Corporation Cougar Point PCI Express Root Port 1 (rev b4)
    PCI 桥 Intel Corporation Cougar Point PCI Express Root Port 2 (rev b4)
    PCI 桥 Intel Corporation Cougar Point PCI Express Root Port 3 (rev b4)
    PCI 桥 Intel Corporation Cougar Point PCI Express Root Port 4 (rev b4)
    PCI 桥 Intel Corporation Cougar Point PCI Express Root Port 5 (rev b4)
    PCI 桥 Intel Corporation Cougar Point PCI Express Root Port 6 (rev b4)
    USB 控制器 Intel Corporation Cougar Point USB Enhanced Host Controller #1 (rev 04)
    ISA 桥 Intel Corporation Device 1c49 (rev 04)
    IDE 接口 Intel Corporation Cougar Point 4 port SATA IDE Controller (rev 04)
    SMBus Intel Corporation Cougar Point SMBus Controller (rev 04)
    IDE 接口 Intel Corporation Cougar Point 2 port SATA IDE Controller (rev 04)
    网卡 Intel Corporation 82583V Gigabit Network Connection (eth0 08 70 27 e8 2c f6)
    网卡 Intel Corporation 82583V Gigabit Network Connection (eth1 08 70 27 e8 2c f7)
    网卡 Intel Corporation 82583V Gigabit Network Connection (eth2 08 70 27 e8 2c f8)
    网卡 Intel Corporation 82583V Gigabit Network Connection (eth3 08 70 27 e8 2c f9)
    网卡 Intel Corporation 82583V Gigabit Network Connection (eth4 08 70 27 e8 2c fa)
    网卡 Intel Corporation 82583V Gigabit Network Connection (eth5 08 70 27 e8 2c fb)

    可以走咸鱼,但是不包邮。。。很重。。。。
    lanbing
        30
    lanbing  
       2016-09-26 16:39:14 +08:00
    @qq316107934 没什么噪音,放在办公室内,有轻微的声音,我都自动忽略了。
    qq316107934
        31
    qq316107934  
    OP
       2016-09-26 16:57:09 +08:00 via Android
    @lanbing 哎:-(,硬盘再大一点就好了,不过价格也挺实惠了~ 给下地址吧,大概邮费要多少钱?
    lanbing
        32
    lanbing  
       2016-09-26 17:16:12 +08:00
    @qq316107934 有硬盘接口,可以接个硬盘。你要什么快递,目测大概有个五六斤的样子。(顺丰的话就贵一些, EMS 或者邮政包裹便宜)有个 32G 的金胜, 50 出。你可以考虑一起带走。。。 这种,稍后放咸鱼。 https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.1.C1hq9A&id=525523255515&areaId=370800&cat_id=2&rn=360315d7ad59fd86d3cf72c631d5269b&user_id=2739901298&is_b=1
    lanbing
        33
    lanbing  
       2016-09-26 17:19:45 +08:00
    cyang
        34
    cyang  
       2016-09-26 20:52:06 +08:00
    @qq316107934 @Ansonyi KoolShare 改版固件
    lun10439547
        35
    lun10439547  
       2016-09-26 21:17:45 +08:00
    @cyang 你好 问下两条线都在 68 路由器上面拨号? 我 r7000 刷的梅林, wan2 就是无法拨号,然后前面又加了一个路由拨号, 开启策略路由非常不稳定不说,而且很多国内网站会通过移动访问。。。
    cyang
        36
    cyang  
       2016-09-26 21:26:26 +08:00
    @lun10439547 电信的自己拨号 移动的是固定 IP 。稳定性还好...
    terrancesiu
        37
    terrancesiu  
       2016-09-26 21:31:58 +08:00 via iPhone
    @qq316107934 不会,dns 是 bgp 线路,详细描述在这 https://www.dnspod.cn/Products/Public.DNS
    dlsflh
        38
    dlsflh  
       2016-09-27 00:47:16 +08:00 via Android
    感觉我们是一个学校的
    qq316107934
        39
    qq316107934  
    OP
       2016-09-27 00:59:49 +08:00 via Android
    @dlsflh 应该不一样,其实我们学校电信宽带是需要天翼客户端的,投诉后才能用的 PPPOE 。
    dlsflh
        40
    dlsflh  
       2016-09-28 01:54:00 +08:00 via Android
    @qq316107934 明故宫
    skylancer
        41
    skylancer  
       2016-09-28 09:30:13 +08:00
    谁告诉你 350 就没法玩 RouterOS 的.. 你自己去看看产品价格啊
    woyaojizhu8
        42
    woyaojizhu8  
       2016-09-29 19:27:37 +08:00
    我的想法是内网建个代理( ss server 或者 ssh -D ),这个代理服务器连联通,默认路由连电信,然后浏览器装代理切换扩展来管理。如果是软路由可以虚拟化;如果用 arm 或者 mips 的路由,可以买两个便宜的,也可以在自己电脑上再虚拟一个路由。
    woyaojizhu8
        43
    woyaojizhu8  
       2016-09-29 19:39:32 +08:00
    哦,看错了,原来联通是用来挂梯子的,那我的操作是多余的了。可惜删不了回复,忽略我吧。
    fool
        44
    fool  
       2016-12-17 09:31:44 +08:00
    @qq316107934

    你好,请问你现在的负载均衡是对每个连接走不通线路的负载吗,如果一个客户端在 wget 下载某个大文件,那它的流量能同时走两条链路吗?

    网络情况是,学校内,某私有网段,想在笔记本上创建多个 macvlan 虚拟接口结合 namespace 做软路由

    目前的问题是,如果是访问网页是可以负载的,但下载与视频并不可以
    fool
        45
    fool  
       2016-12-17 10:04:49 +08:00
    不过我觉得这样是有问题的,因为我还要经过一次 nat ,另外我是用 iptables ntb 分流的
    qq316107934
        46
    qq316107934  
    OP
       2016-12-17 12:13:29 +08:00 via Android   ❤️ 1
    @fool 我最后购买了 x86 路由器,然后采用了会话分流(原 ip+目的 ip+端口做标识)。因为我的环境是不同运营商,若按照数据包分流效果会很差。大概你是想校园网多拨吧,按照数据包来均衡可以达到单线程负载均衡,但是不推荐... 挂 qq ,玩游戏和一些实时性比较强的程序会出问题。建议还是使用按连接均衡。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1091 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:38 · PVG 03:38 · LAX 11:38 · JFK 14:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.