网络管理器是否能够检查默认网关是否可以将数据包路由到互联网?
我有两个接口,都提供到互联网的路由。
当我从其中任何一台设备上拔下一根电缆时,默认网关就会更新,我的互联网连接就可以正常工作了。但如果当前首选网关在物理链路未中断的情况下发生故障,系统不会将故障转移到第二个网关。
我曾尝试手动为故障的 GW 设置更高的指标,虽然它起作用了,但这是一个我想要避免的手动步骤。
可以使用网络管理器解决此问题吗?
我的设置:Ubuntu 16.04,NM 1.2.2
更新型多巴胺
NM irc 频道的社区成员回答说,NM 不会检查网关是否实际工作,也不会执行任何 GW 切换。
VRRP/ucarp/heartbeat/keepalived 也不会检查这一点。它们只检查网络可用性,并将上游网关切换到虚拟接口后面。这对我的情况没有帮助。
Iproute 的 nexthop 有点用,但延迟很大。路由被内核缓存,即使ip route flush cache
系统花了大约 10 分钟才将故障转移到第二个网关。
ip route replace default scope global \
nexthop via 11.22.33.1 dev eth0 weight 1 \
nexthop via 55.66.77.1 dev eth1 weight 1
我当前的解决方案:一个 shell 脚本,检查当前默认网关是否提供互联网访问;如果没有,它会增加当前网关的指标,并将系统故障转移到具有较低指标的第二个网关。
我仍然希望找到一个更优雅的解决方案。
答案1
这就是 BGP 的用途。使用通常称为 iBGP 的协议实现内部路由器互通和路径冗余,以及/或者使用 eBGP 实现互联网级全路径冗余。BGP 描述了一种协议,路由器之间可以相互传递必要的分析数据,这些数据是判断自治系统内有效和功能性流量路径性质所必需的。
我还没看到有人使用 NetworkManager 作为这种程度的路由的运行时配置工具。NM 在使用多条路由时存在无法很好地扩展的历史问题,而且有更好的软件可以满足您的要求。
大多数商用路由器都具有 BGP 功能,因此您可以“预先安装”它。如果我要使用“软件路由器”,我通常会使用 pfSense 或 VyOS,因为它们都具有很好的虚拟化功能。VyOS 甚至维护 LXD 映像,所以我通常使用它。您还可以使用 openbgbpd 或 quagga 软件包在大多数 Linux 发行版上手动使用 BGP。
许多 SDN 解决方案使用 BGP 来提供冗余和网络平衡,而不是像 MLAG 这样的系统,因为以太网交换机和路由器上的许多 MLAG 实现过去要么过于特定于供应商,要么无法按预期运行,尤其是在使用不匹配的硬件时。SDN 不必担心每个交换机的控制驱动程序,通常更倾向于在第 2 层以上运行这些多节点冗余解决方案,即使在内部网络中也是如此。
答案2
您现在可以向 NM 添加连接检查,如果主机无法连接,它将自动增加接口度量。
查看NetworkManager.conf 的连接部分. Digi 也有一个关于这个主题的好文章。
答案3
我认为有几种可能性。最佳/现代方法是使用 iproute2“表”。我还没有完全理解它,但它的描述如下:http://mlvpn.readthedocs.io/en/latest/linux_example.html不幸的是,这个例子做的比你要求的要多,这让问题变得复杂。但我相信这样的方法可能会奏效:
ip route show table main
ip route add default via 10.70.1.1 dev eth0 table 100
ip route add default via 10.70.70.1 dev eth0 table 101
(可选)编辑/etc/iproute2/rt_tables
并添加两行:
100 myfavgw
101 myothergw
然后你可以通过名称引用这些:
ip route add default via 10.70.70.1 dev eth0 table myothergw
可能需要进行一些额外的调整,但上述内容似乎是一个不错的开始。我无法测试它,因为我的两个网关中的一个刚刚关闭了 :-(
第二种方法似乎依赖于相当古老的技术。2005 年的这篇文章建议,如果您有两个 NIC,则可以为每个 NIC 指定不同的默认网关:https://www.linux.com/news/using-linux-failover-router。所以——大声思考——如果你没有两个 NIC,有一种方法(我忘记了如何)创建第二个虚拟接口,并让它使用相同的以太网卡(这样做就像加载内核模块一样简单,而且效果很好)。如果仍然可以为每个接口指定不同的默认 gw,那么第二种方法将是解决问题的老式方法。
第三个解决方案不太好。正如您所指出的,可以每分钟运行一次 shell 脚本来检查。
可以找到这样的脚本这里!