006-在 OpenWrt 中使用 mwan3 设置链路切换

笔者在使用 mwan3 的过程中遇到了一个非常低级的问题,深感自己的网络基础知识还是不够扎实,特此记录。

问题描述

在 OpenWrt 系统中使用 mwan3 软件进行链路管理,设备连接 Wi-Fi 和 USB 模块进行拨号上网。

需设置移动网络的优先级为高,Wi-Fi 的优先级低,若此时移动网络断开连接,应无缝切换到 Wi-Fi。

测试指标为 ping 外网的过程中不应断开。

实际测试中发现,断开移动网络,无法实现无缝切换,且 Wi-Fi 接口已经连接的情况下,无法手动 ping 通外网。

网络拓扑图

问题排查

首先看一下我的配置文件吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
root@openwrt:~# cat /etc/config/mwan3 

config globals 'globals'
option mmx_mask '0x3F00'
option rtmon_interval '5'

config interface 'wan'
option enabled '0'
option family 'ipv4'
option reliability '1'
option count '1'
option timeout '4'
option interval '10'
option down '3'
option up '2'
option seamless '1'
list track_ip '8.8.8.8'
list flush_conntrack 'ifup'
list flush_conntrack 'ifdown'

config interface 'wwan'
option family 'ipv4'
option reliability '1'
option count '1'
option timeout '4'
option interval '10'
option down '3'
option up '2'
option seamless '1'
option enabled '1'
option add_track_route '0'
list track_ip '8.8.8.8'
list flush_conntrack 'ifup'
list flush_conntrack 'ifdown'

config interface 'wwlan'
option family 'ipv4'
option reliability '1'
option count '1'
option timeout '4'
option interval '10'
option down '3'
option up '2'
option seamless '1'
option enabled '1'
list track_ip '8.8.8.8'
option add_track_route '0'
list flush_conntrack 'ifup'
list flush_conntrack 'ifdown'

config member 'wan_mw'
option interface 'wan'
option metric '1'
option weight '3'

config member 'wwan_mw'
option interface 'wwan'
option metric '2'
option weight '3'

config member 'wwlan_mw'
option interface 'wwlan'
option metric '3'
option weight '3'

config policy 'default'
option last_resort 'default'
list use_member 'wan_mw'
list use_member 'wwan_mw'
list use_member 'wwlan_mw'

config rule 'https'
option sticky '1'
option dest_port '443'
option proto 'tcp'
option use_policy 'default'

config rule 'default_rule'
option dest_ip '0.0.0.0/0'
option use_policy 'default'

我配置了优先走移动网络,移动网络断口后无缝切换为 Wi-Fi,但发现断开移动网络后,网络直接就断开了。

此时查看路由表发现,没有默认路由:

1
2
3
4
5
root@openwrt:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 0.0.0.0 255.255.255.0 U 11 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan

这就奇怪了,且禁用移动网络,重启 Wi-Fi 试试看:

1
2
3
4
5
6
7
root@openwrt:~# ifup wwlan
root@openwrt:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 11 0 0 wlan0
192.168.0.0 0.0.0.0 255.255.255.0 U 11 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan

是有默认路由的,那开启移动网络,再次查看路由表:

1
2
3
4
5
6
7
root@openwrt:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.137.155.2 0.0.0.0 UG 11 0 0 usb0
10.137.155.2 0.0.0.0 255.255.255.254 U 11 0 0 usb0
192.168.0.0 0.0.0.0 255.255.255.0 U 11 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan

发现居然 Wi-Fi 的默认路由没了???

原来是移动网络和 Wi-Fi 的跃点相同了,都是 11,导致只会存在 1 个默认路由。

什么是跃点?

引用自百度百科:

跃点:即路由。一个路由为一个跃点。传输过程中需要经过多个网络,每个被经过的网络设备点(有能力路由的)叫做一个跃点,地址就是它的 ip。跃点数是经过了多少个跃点的累加器,为了防止无用的数据包在网上流散。为路由指定所需跃点数的整数值(范围是 1 ~ 9999),它用来在路由表里的多个路由中选择与转发包中的目标地址最为匹配的路由。所选的路由具有最少的跃点数。跃点数能够反映跃点的数量、路径的速度、路径可靠性、路径吞吐量以及管理属性。

按笔者自己的理解,可以约等于权重,跃点越大权重越低,优先走跃点小的。

因此,将移动网络的网关跃点修改为 10,Wi-Fi 接口的网关跃点保持 11 不变。

查看路由表

1
2
3
4
5
6
7
8
root@openwrt:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.108.180.39 0.0.0.0 UG 10 0 0 usb0
0.0.0.0 192.168.0.1 0.0.0.0 UG 11 0 0 wlan0
10.108.180.38 0.0.0.0 255.255.255.254 U 10 0 0 usb0
192.168.0.0 0.0.0.0 255.255.255.0 U 11 0 0 wlan0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan

可以看到,现在已经正常有两个默认路由了,并且移动网络的默认路由是在 Wi-Fi 上面的。这也符合我 mwan3 配置的需求:先走移动网络,没有移动网络后走 Wi-Fi。

此时在后台 ping 外网,然后断开移动网络,可以看到 ping 是不会断的,自动走 Wi-Fi 出去了。

参考资料

百度百科 - 跃点数

OpenWrt-mwan3


006-在 OpenWrt 中使用 mwan3 设置链路切换
https://kydins.com/posts/f24d1411.html
作者
Kydin
发布于
2024年1月9日
许可协议