我绞尽脑汁想出一个聪明又简单的 WAN 故障转移解决方案。这是针对具有两个不同外部 IP 的 SOHO 安装。只需要出站连接故障转移。
- 提供商 1:有线电视
- 提供商 2:无线
防火墙是 Debian GNU/Linux,因此解决方案应该使用 Linux 并基于软件。
我希望不仅能够检测其中一个路由器是否出现故障(使用 iproute2 很容易),还能检测它们的连接何时出现故障。两个路由器都没有 SNMP 或其他基于标准的 RMON。
是否有类似 ping 实用程序的东西可以让我在里面指定要使用的默认路由?
这样,我就可以用一个小脚本以最佳方式监控两个链接。还是我应该走其他路线?
答案1
这有点复杂,因为我假设您的路由器无法以有意义的方式导出其路由。如果您想深入研究它,请记住,当您在本地发送数据包时,IP 地址仍然是远端主机,而 MAC 地址(无论如何在以太网上)基于主机路由表和 arp 缓存。
如果你将软件降低一个级别并使用内核的包调用来形成您的消息,您可以使用您选择的 MAC 地址编写该 IP 数据包。然后,该数据包将使用您选择的路由器作为第一跳。使用它来 ping 和监控响应,您将能够在不更改系统设置的情况下测试连接性。
当然,为了实现这一点,您需要在程序中提升一些权限。
否则,Evan 建议的强制单地址路由表条目将允许您避免编写调用内核的内容。对于路由器不会主动告知您的任何方法,您需要处于 DMZ 中,否则您无法选择数据包的去向,除非您以某种方式最终得到源路由已启用。
答案2
您正在寻找的是到“金丝雀” IP 地址的主机路由。
选择每个路由器远端的一个 IP 地址,用作“金丝雀”,使用 PING(或 HTTP GET,或您想要使用的任何故障指标)进行监控。在防火墙上为该“金丝雀”IP 地址添加一个带有 /32 网络掩码的静态路由,以将其发送到适当的路由器。
如果我通过“192.168.178.254”路由器监控“10.0.0.1”,我会添加路由route add 10.0.0.1 gw 192.168.178.254
。添加该路由后,所有到 10.0.0.1 的流量都将通过 192.168.178.254 的网关路由。如果 192.168.178.254 远端的 Internet 连接失败,到 10.0.0.1 的流量将永远不会到达目的地(不会返回任何 PING 等)。
使用这样的主机路由应该使您能够编写一个简单的脚本,以便在其中一个 Internet 连接发生故障时交换默认网关。
答案3
如果您想将某些使用循环 DNS 和多个 IP(可能来自几个范围)的高可用性集群(如 yahoo.com 或 google.com)用作“金丝雀”,那么主机路由就没什么用。
在 Linux 主机上,常用的“ping”实用程序有两个有用的参数:
ping -I <interface> example.com
Ping 将从指定接口发送数据包。如果你的主机为每个连接设置了单独的接口,请使用它。
ping -m <interface> example.com
Ping 将发送“标记”的传出数据包;内核可以使用这些标记来选择传出路由。如果您通过单个接口访问两个上行链路通道,则很有用。这需要基于标记的 IP 路由规则,您可能无论如何都会在多 WAN 主机上使用它(通过同一链路发送来自互联网的请求的答案,而不是默认路由)。这里关于如何进行此类路由的描述非常简短。