我在双网卡虚拟机(例如 eth0 和 eth1)上遇到了问题。例如,当路由表如下所示时,一切正常:
$ sudo route -n
default 10.100.0.1 0.0.0.0 UG 20100 0 0 eth0
default 192.168.100.1 0.0.0.0 UG 20101 0 0 eth1
默认网关10.100.0.1
处理所有流量,包括 DNS 查找等。
周末发生了一些事情(我不确定是什么)但是当我周一来的时候,我发现我想要的默认 GW 现在具有更高的度量,因此它没有被使用。
$ sudo route -n
default 192.168.100.1 0.0.0.0 UG 20101 0 0 eth1
default 10.100.0.1 0.0.0.0 UG 20102 0 0 eth0 <<< ISSUE 20102
LAN 段 192.168.100.1 仅与用于测试的主机具有连接。当我启用网络段时,会自动创建默认网关(我在 vSphere 中运行此虚拟机)。
结果是我的 DNS 服务器无法访问。 解决方法是重新启动主机,或者删除并重新添加默认网关。
这个问题解释了这个问题:为什么删除网关路由然后重新添加会使路由突然起作用?
我正在尝试寻找此问题的解决方案。解决方案应确保所需的默认网关始终具有定义的两个网关中最低的度量。
寻找解决方案
我还没有找到解决我所遇到的问题的正确搜索词,所以我一直在阅读有关 Linux 网关的工作原理,但这对回答我的问题没有帮助。
答案1
首先,我会使用 ip route,而不仅仅是 route。iproute2 包将很快取代 net-tools。
虽然我可以建议更好的解决方案,但如果我对您的设置有更多详细信息,例如:您是否使用 netplan,或者您是否使用较旧的接口配置配置了接口。
该解决方案适用于任何 Ubuntu 版本。
在 /etc/network/if-up.d/ 中创建一个文件并使它可由 root 执行
#!/bin/sh
# filename: eth1.sh
if [ "$IFACE" = eth1 ]; then
ip route del default dev eth1
fi
根据额外信息我建议最好的解决方案是:
创建文件 /etc/systemd/network/99-eth1.network
[Match]
Name=eth1
[Network]
Address=192.168.100.100/24 *change to be the ip address you need*
DHCP=no
DefaultRouteOnDevice=false
这将确保 vSphere 不会通过 dhcp 分配网关。我怀疑您的 vSphere、更新或设置更改中发生了一些变化,导致您的虚拟机通过 dhcp 分配网关。或者由于某种原因,启动期间设置网卡的顺序发生了变化。如果首先设置 eth1,则路由度量会将通过 eth1 到达网关地址的成本添加到 eth0,因此度量更高。
如果你想 110% 确保 eth0 首先设置,并且具有较低的度量,你也可以创建以下文件,如果 eth0 通过 dhcp 接收其地址,如果它是静态分配的,则将 DHCP 更改为 no,然后添加地址部分,并输入网关地址
/etc/systemd/network/80-eth0.network
[Match]
Name=eth0
[Network]
DHCP=ipv4
[Route]
Gateway=_dhcp4
Metric=5
答案2
一位同事提供了另一种解决方案,即使用nmcli
基于以下答案的命令行界面询问 Ubuntu这里将网络接口度量设置为固定值
该解决方案在所需接口上设置度量eth0问题中的值很低。
注意:我不确定当eth0界面弹出,但在测试时它确实有效。
nmcli c eth0
set ipv4.route-metric 5
save
quit
systemctl restart NetworkManager
这个答案和选定的答案都适用于 OP。