轶哥

妄图改变世界的全栈程序员。

Linux网卡优先级配置及同时访问内外网设置
  •   更新:2022-05-02 14:47:20
  •   首发:2022-05-02 12:15:11
  •   教程
  •   1603

在Linux系统中,双网卡或多网卡上网并不会同时使用两者同时上网,只会优先把请求发送到优先级高的默认网关(对应网卡的内网网段除外)。插入多个网卡的时候,路由表中就会存在多个默认网关,访问外部网络的时候,系统根据路由原则,Metric值小的网卡优先级高,会优先使用该网卡上网。

在MacOS系统中,设置网卡优先级只需要在系统偏好设置-网络中设置设定网卡服务顺序,具体操作见《MacOS 同时使用内网和外网(双网卡同时联网)》。

在Windows系统中,设置网卡优先级只需要设置网卡的跃点数,具体操作见《win10链路聚合,双网卡带宽叠加负载均衡》(win11同理)。

而在Linux系统中,设置网卡优先级需要修改路由表配置,调整默认网关的Metric值。

Linux网卡优先级配置

使用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

可以看到此时有两个网卡(eth0enx00e04c6801a0),都配置到了默认网关default。而由于enx00e04c6801a0Metric值比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命令不允许直接修改,因此需要先删除,后添加。

例如将eth0Metric改小,就需要执行:

route del default gw 10.10.11.254 eth0
route add default gw 10.10.11.254 dev eth0 metric 99

同理,也可以删除小值的改大。这样我们就通过修改路由表中与默认网关相关的条目实现了调整多个网络连接的优先级。

同时访问内外网设置

Linux使用双网卡连接不同网络时,有时是不能同时使用内网外网系统的。这是由于计算机不知道那些网段一定属于内网导致。

解决内网访问的方法和MacOS中类似,设置本地静态路由,添加网段指向对应内网的网卡即可。

添加:

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配置

默认情况下,执行route的删除和添加操作仅对当前环境生效,重启后配置信息丢失。因此我们需要持久化router表配置,实现开机启动命令。

由于系统启动后,联网需要时间,虽然rc-local配置的已经是各项服务启动之后的开机命令,但是网卡通过DHCP Client获取到IP地址还需要时间。因此需要延迟30s异步执行配置命令,具体原理可参考《Shell异步延迟执行命令》。

针对不同的Linux发行版,配置方法有所差异。

Ubuntu持久化route配置

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/Kali/Raspberry Pi持久化route配置

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持久化route配置

ArchLinuxDebian一样,默认没有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
) &

exit 0

给该文件添加执行权限chmod +x /etc/network/if-up.d/route-set

再次重启网络测试配置是否正常。

打赏
交流区

暂无内容

尚未登陆
发布
  上一篇 (OpenWRT设置VLAN)
下一篇 (Shell异步延迟执行命令)  

评论回复提醒