
我有兩個 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 年就需要解決您的挑戰。的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)。