Linux多个互联网连接负载平衡与故障处理

Linux多个互联网连接负载平衡与故障处理

我有两个 ISP 连接,需要在它们之间进行自动负载平衡。我还需要处理失败的连接(不使用不起作用的连接)。

第一个链接是 PPTP 连接 ( ppp0),第二个链接是普通以太网。系统是Gentoo Linux。

目前,我已经实现了基本的平衡ip route,但看起来效果不太好。这是我用过的:

ip rule $ADD from $IP1 table rt_link1
ip rule $ADD fwmark 1 lookup rt_link1
ip rule $ADD from $IP2 table rt_link2
ip rule $ADD fwmark 2 lookup rt_link2
$NET2 dev eth2 src $IP2 table rt_link2
default via GW2 table rt_link2
$NET2 dev eth2 src $IP2
$NET1 dev ppp0 src $IP1 table rt_link1
default via GW1 table rt_link1
$NET1 dev ppp0 src $IP1
default scope global nexthop via $GW1 weight 1 nexthop via $GW2 dev eth2 weight 1

答案1

作为 LVS 项目的前核心团队成员,我强烈建议不要使用该技术来平衡多个互联网连接;事实上我几乎可以向你保证它不会按预期工作。

现在,对失败的提供商链路的处理通常称为死网关检测 (DGD),有时称为邻居不可达检测 (NUD)。根据 RFC816 和 RFC1122,有多种方法可以执行 DGD,但是我只见过其中大约 3 种(来自我的旧帖子到 LVS 邮件列表):

  • 可靠地检测和报告主机故障的链路层信息(例如,阿帕网目标失效消息)应用作负面建议。
  • 来自特定网关的 ICMP 重定向消息应用作有关该网关的积极建议。
  • 来自特定链路层地址的数据包证明该地址的系统处于活动状态。然而,将此信息转化为有关网关的建议需要将链路层地址映射到 IP 地址,然后对照路由缓存指向的网关检查该 IP 地址。这可能是极其低效的。

当我在 2006 年离开活跃的 Linux 内核网络开发时,仍然没有关于如何实现 NUD 状态更改的明确决定。我的一位朋友、LVS 的核心开发人员 Julian Anastasov 早在 2002 年就需要解决您的挑战。因此,有一天晚上,他坐下来,通过向 FIB 添加 NUD 状态(转发信息)编写了用于静态路由的 DGD 的工作版本根据)。你可以找到他的补丁这里和文档这里,这里这里。这将为您提供大量信息,帮助您进一步解决这项艰巨的任务。我发现这些补丁仍然被广泛使用,因此与最新的内核保持同步。您可能想从如下所示的脚本开始(由罗伯特·库尔贾塔):

#!/bin/bash
# This script is done by : Robert Kurjata Sep, 2003.
# feel free to use it in any useful way

# CONFIGURATION
IP=/sbin/ip
PING=/bin/ping

#--------------- LINK PART -----------------
# EXTIFn - interface name
# EXTIPn - outgoing IP
# EXTMn  - netmask length (bits)
# EXTGWn - outgoing gateway
#-------------------------------------------

# LINK 1
EXTIF1=eth2
EXTIP1=
EXTM1=
EXTGW1=

# LINK 2
EXTIF2=eth1
EXTIP2=
EXTM2=
EXTGW2=

#ROUTING PART
# removing old rules and routes

echo "removing old rules"
${IP} rule del prio 50 table main
${IP} rule del prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule del prio 202 from ${EXTIP2}/${EXTM2} table 202
${IP} rule del prio 221 table 221
echo "flushing tables"
${IP} route flush table 201
${IP} route flush table 202
${IP} route flush table 221
echo "removing tables"
${IP} route del table 201
${IP} route del table 202
${IP} route del table 221

# setting new rules
echo "Setting new routing rules"

# main table w/o default gateway here
${IP} rule add prio 50 table main
${IP} route del default table main

# identified routes here
${IP} rule add prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule add prio 202 from ${EXTIP2}/${EXTM2} table 202

${IP} route add default via ${EXTGW1} dev ${EXTIF1} src ${EXTIP1} proto static table 201
${IP} route append prohibit default table 201 metric 1 proto static

${IP} route add default via ${EXTGW2} dev ${EXTIF2} src ${EXTIP2} proto static table 202
${IP} route append prohibit default table 202 metric 1 proto static

# mutipath
${IP} rule add prio 221 table 221

${IP} route add default table 221 proto static \
            nexthop via ${EXTGW1} dev ${EXTIF1} weight 2\
            nexthop via ${EXTGW2} dev ${EXTIF2} weight 3

${IP} route flush cache

while : ; do
  ${PING} -c 1 ${EXTGW1}
  ${PING} -c 1 ${EXTGW2}
  sleep 60
done

除此之外,您可以查看运行动态路由协议的选项。

答案2

将 LVS 与 lvs-kiss 结合使用。或者类似的东西。

LVS 基本上就是ìpvsadm命令。该负载均衡器的唯一缺点是它不进行监控。因此,您需要一个程序来为您执行此操作并从您的配置中删除死链接(并再次将其添加回活动链接)。

ldirectord来自心跳堆栈的可能是另一个 lvs-addition(而不是 lvs-kiss)。

相关内容