我有一个 freebsd 服务器(ipfw、dhcp、dns),它有一个 LAN 接口和 2 个 WAN 接口(2 条不同的 ADSL 线路)。
WAN 接口(re0 和 re1)聚合到一个 lagg0 故障转移(ifconfig_lagg0="laggproto failover laggport re0 laggport re1")。
我想要使用的是将发往某些网络的流量路由到 re1,当 re1 链路断开时故障转移到 re0,但仍然默认使用 re0 并故障转移到 re1。
是否可以?
谢谢。
[更新]
好的,所以粘合不是一个可能的解决方案(现在我发现这很明显)。
当其中一条线路上的链接断开时,如何自动更新网关上的路由?我不在乎是否需要从 ipfw 切换到 pf(无论如何,我都在计划切换)。
再次感谢。
答案1
仅根据您描述的配置,这是不可能的。链路聚合(有时也称为“绑定”)无法在多个上游提供商之间提供负载平衡或故障转移。您当前的配置似乎没有任何用处,除非您遗漏了一些重要的路由和/或 IP 配置详细信息。
链路聚合严格来说是一种第 2 层(以太网)协议。当您有多个物理以太网链路连接到单个上游交换机或主机时,它可以提供负载平衡和/或故障转移。但两个不同的 DSL 上行链路(即使它们链接到同一个提供商)是两个不同的设备。如果终止电信环路的路由器/桥接设备(即您插入电话线的 DSL 盒)支持相同的协议特定(例如 T1、DSL 等)绑定技术,则可以绑定多条 DSL 线路,也可以绑定多条 T1 线路。
您的 FreeBSD 主机无法绑定多个 DSL 链路,除非您在其中安装提供此功能的 DSL 卡。即便如此,您的 ISP 也必须在其 DSLAM(DSL 线路另一端的设备,位于电话公司 CO)上支持绑定。
必须使用路由技术(第 3 层,IP)来处理使用多个上行链路的 IP 流量负载平衡和/或故障转移。
公平地说,我可能对您遗漏的细节假设过多。您能否在问题中添加一些有关您的配置的更多信息?
- 哪些 IP 地址绑定到 re0、re1 和/或 lagg0?
- 您是否配置了单个上游网关路由,或者您是否使用更复杂的路由设置(动态路由守护进程、IP 转发/标头重写、基于源 IP 的路由规则等)?
- 如果您使用复杂的路由设置,可以详细描述一下吗?
- 您的两条 DSL 电话线是否终止于单个设备(即调制解调器、路由器、网桥等),还是每条 DSL 线路都有自己的盒子?如果两条线路共用一个盒子,您是否将 re0 和 re1 都直接插入该盒子?
- 您的 DSL 线路是否来自同一 ISP?如果是,您的 ISP 是否支持 DSL 绑定?如果是,您当前的服务计划是否已设置绑定?(即,您是否订购了绑定的 DSL 线路,他们是否已为您设置绑定?)
答案2
我可能误解了你的情况,而且我从来没有对 freebsd 做过这类事情,但是......
快速检查 lagg 后,它看起来像一个第 2 层冗余机制,其中 IP 地址在多个接口之间浮动,但 IP 地址永远不会改变。
在您的 DSL 链路上 — 它们是否连接到不同的提供商?如果是,那么我认为您需要一个第 3 层感知机制。
如果它们属于不同的提供商,则需要对路由表进行一些操作,以便链路 1 转到一组远程 IP 地址,而另一组获取其余 IP 地址,或者一个接口用于传出 Web 流量,另一个接口用于其他所有流量。通常,对于小型组织,这通过“策略路由”完成,对于大型组织,这通过 BGP 完成。
最后,我会研究 pf 而不是 ipfw。它非常复杂,非常棒。讨论您正在寻找的内容的示例页面
http://www.openbsd.org/faq/pf/pools.html
上面的文章讨论了如何对传出的流量进行负载平衡。
我只看了一会儿 pf 文档,但 pf 功能中似乎没有直接的链接跟踪或 ping 跟踪机制。
我只需要制作 3 个 pf 配置文件——only.link1、only.link2 和 balance.links。然后,确保在平衡链接配置中,您不会平衡到下一跳的流量(因此到 link1 的下一跳的流量永远不会通过 link2 和反向)。然后,运行一个脚本,对每个接口的下一跳进行 ping 测试,如果失败,则将 pf 配置专门切换到另一个接口。执行 vrrp 的网络设备通常具有此类功能,但内置在设备中,而不是作为破解的 perl 脚本的一部分,但它应该可以正常工作。