- 更新:2022-05-02 14:47:20
- 首发:2022-05-02 12:15:11
- 教程
- 15155
在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
可以看到此时有两个网卡(eth0
和enx00e04c6801a0
),都配置到了默认网关default
。而由于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使用双网卡连接不同网络时,有时是不能同时使用内网外网系统的。这是由于计算机不知道那些网段一定属于内网导致。
解决内网访问的方法和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配置
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
) &
exit 0
给该文件添加执行权限chmod +x /etc/network/if-up.d/route-set
。
再次重启网络测试配置是否正常。
暂无内容
这个需求很特殊。是可以的,但是比较困难,需要修改驱动配置。
HEX编辑器
即可。大佬您好,树莓派4是否支持使用OTG化身U盘(usb mass storage)呀?
请问老师们,这个文件修改用什么软件可以进行修改?
❤️ 太酷了!!