OpenWrt 双宽带负载均衡:mwan3 配置实战

家里装了两条宽带,结果第二条常年闲置吃灰?很多人以为双宽带就是"一条断了另一条顶上",其实玩好了还能让两条线路同时出力,下载更快、游戏更稳。本文就以 OpenWrt 的 mwan3 为例,从零开始把双宽带负载均衡配通,全程有验证步骤,跟着做就行。

双宽带的两种玩法:叠加还是主备

先想清楚你要什么。双宽带有两种基本用法,mwan3 都能实现:

玩法效果适合场景
负载均衡(叠加)两条线路同时跑,总带宽接近两者之和多人同时上网、下载、看视频
故障转移(主备)平时只用主线,主线断了自动切备线对稳定性要求高、不差那点带宽

注意一个常见误解:负载均衡不是让单个下载任务的速度翻倍。一个 TCP 连接只走一条线路,叠加效果体现在"多任务并发"上——比如一台电脑下载、一台手机看视频,mwan3 会把它们分到不同线路。

mwan3 的四个核心概念,一句话讲清

mwan3 的配置看起来层层嵌套,其实只有四个概念,理顺了就通了:

概念一句话解释
接口(Interface)你的物理宽带线路,如 wan、wanb,mwan3 会定时检测它通不通
成员(Member)给接口包一层"权重和优先级"的外衣,决定它在策略里分量多重
策略(Policy)一组按权重排好的成员名单,定义流量怎么在多条线路间分配
规则(Rule)"什么样的流量用哪个策略",比如游戏流量走策略 A、其他走策略 B

数据包的旅程是:规则 → 策略 → 成员 → 接口。记不住就背这条链。

准备工作:安装 mwan3

SSH 登录路由器,先安装 mwan3 及 LuCI 界面:

opkg update
opkg install mwan3 luci-app-mwan3
/etc/init.d/mwan3 enable

装完后 LuCI 菜单里会出现"网络 → 负载均衡"。mwan3 依赖 iptables-mod-conntrack-extra 等内核模块,一般会自动装好,如果启动报错缺模块,再单独 opkg install 补上。

另外确认两条宽带都已经拨号成功,在"网络 → 接口"里能看到 wan 和 wanb(名字可能不同)都拿到了 IP。如果第二条线还没配好,先去把 PPPoE 或 DHCP 配通,这是 mwan3 的前置条件。

步骤一:给两个 WAN 接口设置 metric

mwan3 用接口的 metric 值判断优先级。编辑 /etc/config/network,给两个 wan 接口加上 metric:

config interface 'wan'
    option proto 'pppoe'
    option username '你的宽带账号'
    option password '你的宽带密码'
    option metric '10'

config interface 'wanb'
    option proto 'dhcp'
    option metric '20'

metric 数字越小优先级越高。想做负载均衡,两条线路的 metric 要设成一样(比如都是 10);想做主备,才让主线 metric 更小。改完重启网络:

/etc/init.d/network restart

顺带一提:有些地区光猫默认是路由模式,想让 OpenWrt 直接拨号需要改桥接,具体以当地运营商政策为准,改之前先确认你的宽带账号密码。

步骤二:创建成员(Member)

成员是"接口 + 权重"的组合。在"网络 → 负载均衡 → 成员"里新建两个:

成员名绑定接口MetricWeight(权重)
wan_m1_w1wan11
wanb_m1_w1wanb11

Metric 决定优先级(数字小的先用),Weight 决定同优先级下的流量比例。比如两条都是 500M 宽带,权重都设 1 就是五五开;如果一条 1000M 一条 200M,可以把权重设为 5 和 1,让流量按带宽比例分配。权重不是一成不变的,上线后观察一周两条线路的实际负载,如果某条线长期空闲就调大它的权重,找到最适合你家用网习惯的比例。

对应的配置文件写法(/etc/config/mwan3):

config member 'wan_m1_w1'
    option interface 'wan'
    option metric '1'
    option weight '1'

config member 'wanb_m1_w1'
    option interface 'wanb'
    option metric '1'
    option weight '1'

步骤三:创建策略(Policy)

策略就是把成员排成名单。建两个常用策略:

1. balanced(负载均衡):两个成员都放进来,权重决定比例。

config policy 'balanced'
    option last_resort 'unreachable'
    list use_member 'wan_m1_w1'
    list use_member 'wanb_m1_w1'

2. wan_only(主备/故障转移):只放主线成员,备线成员 metric 设大一档:

config member 'wanb_m2_w1'
    option interface 'wanb'
    option metric '2'
    option weight '1'

config policy 'wan_only'
    option last_resort 'unreachable'
    list use_member 'wan_m1_w1'
    list use_member 'wanb_m2_w1'

last_resort 设为 unreachable 表示所有成员都挂了就直接拒绝,避免流量黑洞。

步骤四:配置规则(Rule),把流量分到策略上

规则决定"什么流量走哪个策略"。mwan3 自带一条 default_rule,把默认策略指向 balanced 即可让全屋流量参与均衡。在此基础上加两条实用规则:

按源 IP 分流:比如孩子的学习机固定走 wanb,避免跟你的主力线路抢带宽:

config rule 'kid_device'
    option src_ip '192.168.1.100'
    option proto 'all'
    option use_policy 'wanb_only'

按目标端口分流:游戏流量对延迟敏感,固定走延迟更低的那条线:

config rule 'game_low_latency'
    option dest_port '27015,27016'
    option proto 'udp'
    option use_policy 'wan_only'

规则是从上往下匹配的,越具体的规则放越上面。每改完一次配置,执行:

mwan3 restart

验证与排障:mwan3 status 是你的好朋友

配置完先看状态:

mwan3 status

正常应该看到两个接口都是 online,并列出各自的策略和权重。接着做三个验证:

  1. 连通性:ping -I pppoe-wan 223.5.5.5 和 ping -I pppoe-wanb 223.5.5.5 分别走两条线 ping,看都通不通。
  2. 均衡效果:多开几个下载任务,用 mwan3 status 观察 active 连接是否分布在两个接口上。
  3. 故障转移:拔掉主线网线,等约 30 秒(检测间隔),看状态是否变成备线 online、主线 offline,再插回去看是否恢复。

常见坑:

  • 接口一直 offline:检查 /etc/config/network 里两个 wan 的 metric 是否都已设置,mwan3 靠 metric 识别多线。
  • 规则不生效:确认规则顺序,具体的放前面;确认 mwan3 restart 已执行。
  • 某些网站登录掉线:看下一节的粘性规则。

注意事项:银行、支付类网站要用粘性规则

https 的银行、证券、支付网站会对"同一个会话中途换 IP"非常敏感,负载均衡可能导致频繁掉登录。解决办法是给这类流量加粘性(sticky)规则,让同一内网 IP 的连接在一段时间内固定走一条线:

config rule 'https_sticky'
    option proto 'tcp'
    option dest_port '443'
    option sticky '1'
    option timeout '600'
    option use_policy 'balanced'

timeout 600 表示 10 分钟内同一来源的 443 流量都走第一次选定的线路。这样既保留了均衡,又不影响网银体验。

另外建议把双宽带环境下的 DNS 统一设为公共 DNS(如 223.5.5.5、119.29.29.29),而不是用运营商下发的 DNS。原因是运营商 DNS 往往只对自家线路的解析做优化,另一条线路用它解析可能拿到绕路的结果。统一用公共 DNS,两条线路的解析质量才一致,分流规则的效果也更可预测。

进阶:mwan3 的线路检测机制调优

mwan3 靠 mwan3track 进程定时 ping 检测目标来判断线路通断。默认参数对大多数家庭够用,但了解下面几个配置项,排障时会省很多时间:

参数含义建议值
track_ip检测目标 IP运营商网关或国内公共 DNS
interval检测间隔20 秒左右
reliability判离线前允许的失败次数2~3 次
timeout单次 ping 超时4 秒

三条调优经验:

  • 检测 IP 别选太远的目标:默认的国外 IP 在国内可能丢包误判,换成运营商网关或 223.5.5.5 这类国内公共 DNS 更准;
  • 检测间隔别设太短:5 秒 ping 一次在性能弱的设备上是负担,家庭用 20 秒完全够用;
  • 两条线用不同的 track_ip:如果双拨同一运营商、两个接口检测同一个 IP,一次网络抖动可能把两条线同时判离线,分开检测更稳。

改完执行 mwan3 restart,再用 mwan3 status 观察几分钟,确认没有频繁的 online/offline 跳变,检测机制就算调稳了。

总结

mwan3 的双宽带配置可以浓缩成一条链:接口设 metric → 成员定权重 → 策略排名单 → 规则分流量,最后 mwan3 status 验证。建议先配 balanced 跑几天观察,再按需加游戏、网银这类精细规则。双宽带的钱已经花了,别让第二条线继续吃灰。