这里主要是介绍怎么利用 macvlan 创建虚拟网卡,怎么配置mwan3等,比较基本的配置,难度不是很大。
主包的系统是比较新的 25.12 Snapshot,大伙呢也肯定知道 OpenWRT 也是从老旧的 swconfig (基于 VLAN 的交换机配置,比如接口是eth0等) 慢慢转换成使用 DSA (Distributed Switch Architecture,分布式交换机架构,接口变成wan,lan1,lan2……),所以如果你的系统是比较老的话这些操作可能对应不上,所以各位要以自己的实际情况为准。
前置条件
系统要有这两玩意:
kmod-macvlan
作用是网卡虚拟化,我们在创建虚拟网卡时候需要用到。
luci-app-mwan3
常用的多拨负载均衡实现方法。和 ECMP (Equal-Cost Multi-Path) —— 等价多路径路由 相比,mwan3能够实现根据源 MAC 地址、目的端口、甚至特定的数据包大小设定路由规则,同时具备粘滞性(防止网银、游戏等因为 IP 频繁跳动而掉线)和故障转移的功能。对于玩多拨的老吃家来说肯定是必不可少的。
kmod-macvlan 是内核模块,luci-app-mwan3 也同样依赖 kmod-ip6tables 等一系列底层模块。这就意味着,除非你用的是官方 Release 固件,否则如果你刷的第三方固件在编译时没有勾选这些模块,后期你是绝对不可能通过 opkg install / apk add强行装上的(会疯狂报 Kernel Hash 内核哈希值不匹配的错)。
博主使用的25.12 Snapshot 固件编译时候恰好没加上 luci-app-mwan3 ,因此主包要去 fork 一份仓库,重新GitHub编译一份。这就是上边提到的麻烦事,,,,,,,,,
不过该说不说他家的固件还是挺好用的,可以了解以下:https://github.com/laipeng668/openwrt-ci-roc/releases/tag/JDCloud
补充一句:要论 Wi-Fi 信号,肯定是闭源驱动的 QWRT 最猛,但是系统底层太老,玩不了很多新玩意,所以主包果断投入了新版 Snapshot 的怀抱。
虚拟网卡创建与拨号链接建立
完成我们前置任务,我们正式进入多拨设置流程。这里假设你需要 N 拨,除去原本有的 WAN 口,你需要新增利用 N - 1 个虚拟接口。
🛠️ 第一步:捏“虚拟网卡”并修改 MAC
- 在路由器后台,进入 网络 -> 接口。
- 注意看页面顶部的标签页,点击 「设备 (Devices)」(就在“接口”标签的旁边)。
- 点击左下角的 「添加设备配置」。
- 设备类型:下拉选择
MAC VLAN。
- 基础设备:选择你原本插网线的物理 WAN 口(通常叫
eth1、wan 或者类似的底层接口),我这边是 wan 。
- 设备名称:起个好记的名字,比如
macvlan1
- MAC 地址:一般来说你把原来物理 WAN 口的 MAC地址稍微改一改填进去
- 点击右下角 「保存」。
如法炮制你剩下的N - 2 个接口。
🚀 第二步:让 PPPoE 用新的 MACVLAN 虚拟网卡拨号
切换回 网络 -> 接口 的第一个标签页。
左下角 添加新接口,名称起 vwanX,协议选择 PPPoE,设备选择刚刚创建的 以太网适配器:macvlan1 。
同样填写 PPPoE 用户名和密码。
极其关键的一步:切换到 高级设置 (Advanced Settings),找到 “使用网关跃点 (Use gateway metric)”。
这里必须给每一个拨号接口分配不同的数值!
比如:主 wan 填 10,vwan1 填 20,vwan2 填 30。如果不填不一样的值,默认路由会混乱,后续的 mwan3 也会直接罢工!
- 创建好后切换到 防火墙设置 ,把新创建的 vwanX 加入之前的wan区域中。
继续如法炮制,直到所有的 vwanX 都拨号成功,获取到独立的 IPv4 地址。
注:如果你的有线连接是有线连接,其实你也可以进行尝试,你去电脑浏览器打开认证页面,过一遍认证流程,F12 看一下发包过程,然后写一个脚本,让路由器在不同 MACVLAN 口向认证页发送带你的用户名、密码的post请求。
MWAN3配置
光拨上号没用,路由器默认只会走一条线。我们需要用 mwan3 把它们拧成一股绳。
进入 网络 -> MultiWAN 管理器。接口,成员,策略里面会有原有的一些设置,可以全部删掉删掉重建。注意在我的方案里面,IPv6流量不使用mwan3进行分流,我们需要另外配置路由。IPv6 流量多路叠加可能会出现一些问题,校园网分配到同前缀v6地址,各位可以尝试一下NAT66 叠加,看看有没有很好的配置方法。
接口 (Interfaces):把你所有的拨号接口(wan, vwan1, vwan2等)都添加进去,并设置好跟踪 IP(比如填 114.114.114.114,223.5.5.5),用来检测线路是否断线。检测的各种细节各位可以自行去设置。
成员 (Members):为每个接口创建一个成员,一般命名格式是 [网口数][权重数][跃点数] 比如 wan_m1_w1 。最关键的是:把它们的“跃点数 (Metric)”和“权重 (Weight)”设置成完全一样(比如权重都设为 1,代表 33.33% 均分流量)。
注:主包这里的 _6 分流实际没用mwan3,只是调试过程中创建了。
策略 (Policies):新建一个名为 balanced 的策略,把刚才创建的所有成员都加进去。备用成员 选 不可达(拒绝)
- 规则 (Rules):修改底部的 default_rule,将它的目标策略指向你刚才创建的 balanced。
基于即使是多拨的情况,校园网的上游的分流策略肯定也是一样,因此访问网站时候IP并不会像外部不同宽带聚合时候发生改变,因此我们不需要为https流量配置粘滞性。
(可选)智能配置 vwan2 的启用关闭
你是不是还记得,我说过我这边的总设备数限制为 3,如果我需要外出链接 WiFi 时候肯定会占用一个设备额度,我们把拨号数拉满了之后就必定导致某一个 PPPoE 拨号链接被踢出,究竟是哪个端口被踢出我也不好说。另外,如果这个端口会自动重新拨号的话,也会把我的手机给踢下去,造成一个反复横跳的情况。因此,为了更加可控,采用 ping手机+时间段的 两重判断方式,发现在上课期间、手机的静态IP 连续5min ping不通了之后,我们判断可能有通过WiFi使用校园网的需求,然后自动ifdown vwan2 。这样使得整个流程可控。
以下是我们的代码 :
#!/bin/sh
# 1. 在这里填入你手机的固定局域网 IP
PHONE_IP="172.27.0.188"
# 2. 在这里填入你要释放/开启的第3拨接口名
VWAN_IF="vwan2"
# 3. 容错时间:连续离线几分钟后才踢掉接口?
MAX_OFFLINE_MINUTES=5
# 4. 记仇小本本的文件路径
COUNT_FILE="/tmp/phone_offline_count"
# 获取当前小时 (00-23,比如晚上10点就是22,早上7点就是07)
CURRENT_HOUR=$(date +%H)
# 🌟 新增:夜间深度休眠保活机制 (22:00 - 次日 08:00 之前)
if [ "$CURRENT_HOUR" -ge 22 ] || [ "$CURRENT_HOUR" -lt 8 ]; then
# 检查 vwan2 是否未启动,如果是,则启动它
STATUS=$(ifstatus $VWAN_IF | grep '"up": true')
if [ -z "$STATUS" ]; then
logger -t "Auto-Dial" "夜间模式激活 (当前 ${CURRENT_HOUR} 点),默认人在宿舍,强制满血开启 $VWAN_IF..."
ifup $VWAN_IF
fi
# 夜间直接跳过后续探测,脚本结束
exit 0
fi
# --- 以下为白天时段的 Ping 探测逻辑 ---
# 用 Ping 探测手机是否在线 (发3个包,超时设为2秒)
if ping -c 3 -W 2 "$PHONE_IP" > /dev/null 2>&1; then
# 【情况A:手机在线】
# 立刻撕毁记仇小本本(清零计数器)
rm -f "$COUNT_FILE"
# 检查 vwan2 是否未启动,如果是,则启动它
STATUS=$(ifstatus $VWAN_IF | grep '"up": true')
if [ -z "$STATUS" ]; then
logger -t "Auto-Dial" "探测到手机回家,正在满血开启 $VWAN_IF..."
ifup $VWAN_IF
fi
else
# 【情况B:手机离线】
# 读取小本本上的当前离线分钟数,如果没有小本本,就当做是 0
if [ -f "$COUNT_FILE" ]; then
OFFLINE_COUNT=$(cat "$COUNT_FILE")
else
OFFLINE_COUNT=0
fi
# 离线分钟数 + 1,并写回小本本
OFFLINE_COUNT=$((OFFLINE_COUNT + 1))
echo "$OFFLINE_COUNT" > "$COUNT_FILE"
# 检查是否忍到了极限(达到指定分钟数)
if [ "$OFFLINE_COUNT" -ge "$MAX_OFFLINE_MINUTES" ]; then
# 检查 vwan2 是否还连着,连着就断开它
STATUS=$(ifstatus $VWAN_IF | grep '"up": true')
if [ -n "$STATUS" ]; then
logger -t "Auto-Dial" "手机已连续 $MAX_OFFLINE_MINUTES 分钟离线,判定已出门,正在释放 $VWAN_IF 名额..."
ifdown $VWAN_IF
fi
# 把计数器维持在最大值,防止数字无限膨胀
echo "$MAX_OFFLINE_MINUTES" > "$COUNT_FILE"
fi
fi
我们保存到 /root/auto_vwan.sh 然后 chmod +x /root/auto_vwan.sh 给运行权限。
然后我们去计划任务里面 添加 每分钟执行一次* * * * * /root/auto_vwan.sh
到此,我们三倍快乐的 IPv4 多拨负载均衡配置就圆满结束了。