Linux 多网络自动路由设置
本文介绍如何通过设置本机上的路由规则,实现在同时连接多个网络时,根据目标地址所属网段来自动选择走哪一个网络。其中有线网卡连接内网(校园网 / 企业内网),无线网卡连接外网(手机热点),效果为:同时连接两个网络时,访问内网地址(指定网段)会走有线网络,访问其他网络地址会走无线网络;而单独连接其中一个网络时,也能够正常使用。
我所使用的操作系统是 Manjaro Linux,Gnome 桌面,对于其他操作系统和桌面环境未进行测试,请自行寻找是否有相似的设置。
首先设置无线网络,假设网关为 192.168.43.1
,打开 设置 -> 网络 ,点击有线网络的设置图标,切换到 IPv4 选项卡,在最下方“路由”设置中,关闭“自动”按钮,并填入以下内容。默认设置下,有线网络的优先级要高于无线网络,而我们需要无线网络优先于有线网络,因此通过调整跃点(Metric)的值为 99 来提高其优先级(有线网络的默认跃点值为 100,值越小优先级越高),点击“应用”并重新连接网络。
地址 | 子网掩码 | 网关 | 跃点 |
---|---|---|---|
0.0.0.0 | 0.0.0.0 | 192.168.43.1 | 99 |
进行以上设置之后,当我们连接到这个网络时,会自动生成下面这样一条默认路由规则。它表示,在没有其他特定规则和优先级更高的默认规则与目标地址匹配时,则使用这条规则,即通过 wlp69s0 网卡访问 192.168.43.1 网关。
default via 192.168.43.1 dev wlp60s0 proto static metric 99 |
接着设置有线网络,假设网关为 192.168.2.1
,我们需要让 172.16.0.0/12
网段的地址走这个网络。打开 设置 -> WiFi,点击网络旁的设置按钮,同样切换到 IPv4 选项卡,关闭路由设置的“自动”按钮并填入以下内容,点击“应用”并重新连接网络。这里不设置跃点的值,使其保持默认值 100.
地址 | 子网掩码 | 网关 | 跃点 |
---|---|---|---|
172.16.0.0 | 255.240.0.0 | 192.168.2.1 | |
0.0.0.0 | 0.0.0.0 | 192.168.2.1 |
进行以上设置后,当我们再连接这个网络时,会自动生成下面这样两条路由规则。其中,第二条为特定规则,要优先于所有 default 规则。
default via 192.168.2.1 dev enp59s0 proto static metric 100 |
同时连接两个网络时,系统中所有的路由规则如下。对于 172 网段的地址,由于第三条特定静态规则的存在,它会通过 enp59s0 这个有线网卡来走 192.168.2.1
网关,也就是走内网,而对于其他没有定义特定规则的地址,有两条默认规则可以选择,但是第一条规则的优先级要高于第二条,所以对于其他的流量,都走无线网络。
ip route show |
而只连接有线网络时,系统中的路由规则如下。
ip route show |
只连接无线网络时,系统中的路由规则如下。
ip route show |
以上的路由规则也可以通过类似下面的命令来手动添加,但是这样添加的路由规则重启后便失效,而且不能随网络连接情况自动调整,因此并不推荐。
ip route add 172.0.0.0/8 via 192.168.2.1 dev enp59s0 |
参考和工具:
Linux 多网络自动路由设置