- 更新:2022-05-02 14:47:20
- 首发:2022-05-02 12:15:11
- 教程
- 17858
在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
。
再次重启网络测试配置是否正常。
暂无内容
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢