![网络丢失后恢复丢失的网络路由](https://linux22.com/image/152713/%E7%BD%91%E7%BB%9C%E4%B8%A2%E5%A4%B1%E5%90%8E%E6%81%A2%E5%A4%8D%E4%B8%A2%E5%A4%B1%E7%9A%84%E7%BD%91%E7%BB%9C%E8%B7%AF%E7%94%B1.png)
我有一台处于锁定环境中的服务器,没有互联网出口,有 2 个接口:一个物理 eth0 和一个 vlan iface eth0.101
/etc/network/interfaces 包含一个 post-up 命令,用于启用通过 vlan iface 到特定网络块的路由,如下所示:
post-up ip route add 10.1.0.0/24 via 10.1.2.1 dev eth0.101
在交换机故障转移测试期间,我们注意到路由丢失了 ( RTNETLINK answers: Network is unreachable.
),这是有道理的。但是,一旦网络恢复上线,该路由就不会再次添加到接口中。
我明白为什么 - 接口没有消失down
,它只是失去了对该网络的访问。
如何配置接口来恢复丢失但现在已找到的网络的路由?
[email protected]
我们使用 Debian 9,并为每个接口都有一个服务定义,它使用ifup
命令来启动/关闭设备。但同样,该设备以及与交换机的链路从未出现故障。我提到这一点是为了防止可以利用额外的 systemd 选项。
答案1
路由表将使您的路由永久化(以避免在交换机故障转移后再次/手动添加它);首先,创建一个命名路由表。例如,我们可以使用“mgmt”。
echo '200 mgmt' >> /etc/iproute2/rt_tables
上面只是关于该解决方案的扩展细节,内核支持许多路由表,并通过编号为 0-255 的唯一整数来引用这些路由表。还为该表定义了名称 mgmt。下面是默认情况/etc/iproute2/rt_tables
,显示一些数字被保留。这个答案中 200 的选择是任意的;人们可以使用任何尚未使用的数字,1-252。
# reserved values
255 local
0 unspec
其次,像这样编辑您的post-up
规则(在 /etc/network/interfaces 下)
post-up ip route add 10.1.0.0/24 dev eth0.101 table mgmt
post-up ip route add default via 10.1.2.1 dev eth0.101 table mgmt
post-up ip rule add from 10.1.0.0/24 table mgmt
post-up ip rule add to 10.1.0.0/24 table mgmt
或者另一种解决方案可能是后台 bash 脚本检查路由是否存在,如果丢失则将其添加回来,该脚本可以检查ip route add 10.1.0.0/24 via 10.1.2.1 dev eth0.101
脚本的结果可以在循环或 cron 中设置
ip route add 10.1.0.0/24 via 10.1.2.1 dev eth0.101
if [ $? -eq 0 ]; then
echo "Route added again"
sleep 10;
command-to-call-the-script-again
else
echo "Route exists"
sleep 10;
command-to-call-the-script-again
fi
答案2
您的描述对于适当的设置有点模糊:“交换机故障转移”情况如何影响您服务器的网络设备?链接丢失?仅仅中断数据包转发?某种明确的通知(例如 LACP)可能会做什么?或者还有什么?另外,你进入了哪些auto
接口allow-hotplug
?物理设备?或者vlan接口?或两者 ?
问题是,仅根据所描述的设置,所描述的行为并没有真正意义。例如,仅仅失去链路通常不足以删除路由,也不足以将接口设置为关闭,除非有一些额外的设置可以明确地执行此操作。
我还想说,这个附加但未提及的设置不能是标准的ifplugd
or netplugd
,它作用于链接事件(例如电缆插入/拔出),因为这些通常会调用ifup
和ifdown
处理这些事件,因此post-up
当链接发生时,您的命令将被执行回来看看他们的配置是否和你的vlan接口一致。
请注意,ifupdown 的allow-hotplug
设置涉及设备热插拔,而不是电缆热插拔,这意味着它基本上只在启动时起作用(即当内核第一次检测到设备存在时)和/或如果您的网络设备是 USB 适配器并且您将其插入/拔出/从服务器的 USB 端口。
因此,我建议在您的服务器上运行一些自定义服务,该服务可能会通过某种探测(可能是定期ping
或有意建立的 TCP 连接)来检测网络丢失,一旦检测到网络丢失,就会删除您的路由,但当探测连接恢复活动时不会将其添加回来。
回答您的具体问题:
如何配置接口来恢复丢失但现在已找到的网络的路由?
这取决于“丢失网络连接”对您的应用程序意味着什么,以及恢复它意味着什么。如果接口链接状态足够,那么您实际上可以只依赖其中一个ifplugd
或netplugd
或等效项(无论您更喜欢或最适合您的要求):post-up
如果与始终存在于之上的“ifupdown”vlan 接口关联,则您的命令就足够了其主设备或被配置为遵循其主设备的命运。