在Linux系统中,双网卡或多网卡上网并不会同时使用两者同时上网,只会优先把请求发送到优先级高的默认网关(对应网卡的内网网段除外)。插入多个网卡的时候,路由表中就会存在多个默认网关,访问外部网络的时候,系统根据路由原则,Metric值小的网卡优先级高,会优先使用该网卡上网。
使用route命令查看路由表相关信息:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default oraybox.com 0.0.0.0 UG 100 0 0 enx00e04c6801a0
default _gateway 0.0.0.0 UG 101 0 0 eth0
10.10.11.0 0.0.0.0 255.255.255.0 U 101 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enx00e04c6801a0
可以看到此时有两个网卡 eth0 和 enx00e04c6801a0 ),都配置到了默认网关。而由于enx00e04c6801a0的Metric值比eth0的小,所以排前面了。这就说明enx00e04c6801a0网卡的优先级比eth0高。
使用route -n<可以查看Gateway相关IP信息:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.8 0.0.0.0 UG 100 0 0 enx00e04c6801a0
0.0.0.0 10.10.11.254 0.0.0.0 UG 101 0 0 eth0
10.10.11.0 0.0.0.0 255.255.255.0 U 101 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enx00e04c6801a0
我们要配置Linux网卡的优先级,就需要修改某个网卡的Metric,然而route命令不允许直接修改,因此需要先删除,后添加。例如将eth0的Metric改小,就需要执行:
route del default gw 10.10.11.254 eth0
route add default gw 10.10.11.254 dev eth0 metric 99
同理,也可以删除小值的改大。这样我们就通过修改路由表中与默认网关相关的条目实现了调整多个网络连接的优先级。
Linux使用双网卡连接不同网络时,有时是不能同时使用内网外网系统的。这是由于计算机不知道那些网段一定属于内网导致。 添加:
route add -net 192.168.2.0 netmask 255.255.255.0 dev eth0
删除:
route del -net 192.168.2.0 netmask 255.255.255.0 dev eth0
-net
参数对应网段IP,netmask
是子网掩码。最后的eth0
是对应网络所在的网卡。
默认情况下,执行route的删除和添加操作仅对当前环境生效,重启后配置信息丢失。因此我们需要持久化router表配置,实现开机启动命令。由于系统启动后,联网需要时间,虽然rc-local配置的已经是各项服务启动之后的开机命令,但是网卡通过DHCP Client获取到IP地址还需要时间。因此需要延迟30s异步执行配置命令,具体原理可参考《Shell异步延迟执行命令》。 针对不同的Linux发行版,配置方法有所差异。
Ubuntu/Linux Mint/Ukylin/国产麒麟系统中开机执行route命令,只需要直接修改/etc/rc.local文件,把需要开机自动执行的命令写在exit 0前面:
(
sleep 30
/usr/sbin/route del default gw 10.10.11.250 eth0
/usr/sbin/route add default gw 10.10.11.250 dev eth0 metric 204
) &
从Debian 9起,Debian自带rc-local服务,但是默认没有启动,也没有/etc/rc.local文件。首先确认rc-local服务是否启动。执行systemctl status rc-local,如果显示Active: inactive (dead)即没有启动。添加/etc/rc.local
并修改内容(touch /etc/rc.local && vim /etc/rc.local
),把需要开机自动执行的命令写在exit 0前面:
#!/bin/sh -e
(
sleep 30
/usr/sbin/route del default gw 10.10.11.250 eth0
/usr/sbin/route add default gw 10.10.11.250 dev eth0 metric 204
) &
exit 0
给该文件配可执行权限:chmod +x /etc/rc.local。 启动rc-local服务并设置该服务开机自启:
systemctl enable rc-local
systemctl start rc-local
ArchLinux和Debian一样,默认没有rc-local服务,而且ArchLinux还需要手动配置rc-local服务。
新建/usr/lib/systemd/system/rc-local.service
文件,添加以下内容:
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
然后就和Debian的配置方法一样了。
虽然配置了开机启动命令,但是网络设置仍然存在因其他程序重启网络而丢失的可能。执行systemctl restart networking或/etc/init.d/networking restart,查看路由设置是否仍然生效。较新的linux内核和系统中,这类设置默认网关的操作不会因为重启网络而失效,但是对静态路由的设置和一些较老的系统里面,则会失效。 创建并编辑/etc/network/if-up.d/route-set文件:
#!/bin/sh
(
sleep 30
/usr/sbin/route del default gw 10.10.11.250 eth0
/usr/sbin/route add default gw 10.10.11.250 dev eth0 metric 204
) &
给该文件添加执行权限chmod +x /etc/network/if-up.d/route-set。再次重启网络测试配置是否正常。