Linux環境下多鏈路負載均衡
1.1----------------------Multipath Routing
網上關於multipath routing 的文章已經很多了,在此我只想指出應用multipath routing時必須安裝以下兩個補丁后重新編譯內核(至少RH8的ip route 包需要這兩個補丁)
Name:iproute2-2.4.7-now-ss020116-try.tar.gz
URL:ftp://ftp.inr.ac.ru/ip-routing/
Function:解決dead link 問題
Name:equalize_2.4.18.patch
URL:http://trash.net/~kaber/equalize/
Function:即使沒有這個補丁, ip route 也有equalize參數,但不起作用ping 不通。
1.2.Multipath routing 的問題。
同一個ISP的多鏈路得到的gateway ip 可能是一樣的,這種情況下multipath routing不能工作。另外據說multipath routing只能對管理outgoing package
2.1.---------------------Policy routing .
原理:
把客戶端的ip隨機的分成N組,每一組對應一條鏈路,分組由伺服器端的shell script完成。(本文不涉及撥號軟體的安裝和配置,請參照其它文章。)
測試環境:
RH8。不需要其它的補丁。
安全問題:
由於運行改程序的主機,沒有默認路由。外部主機根本無法訪問,徹底防止黑客攻擊。
缺點:
不是真正的負載均衡,一個IP地址不可能佔用第二個鏈路的帶寬。
鏈路冗餘:
當一條鏈路斷掉后可以在/etc/ppp/ip-down.local腳本,把失效的路由轉換到另一條線路。
該腳本中$1為介面名,如ppp0
ip route add default dev ppp1 table 201
腳本:
-------------------------------------------------
#標識為fwmark 1的ip地址屬於table 201地址池。
ip rule add fwmark 1 table 201
ip rule add fwmark 2 table 202
--------------------------------------------------
#修改/etc/rc.local
echo " enabling forwarding.."
echo "1" >; /proc/sys/net/ipv4/ip_forward
echo " enabling DynamicAddr.."
echo "1" >; /proc/sys/net/ipv4/ip_dynaddr
insmod ip_nat_ftp
insmod ip_nat_irc
insmod iptable_nat
insmod ip_conntrack_irc
insmod ip_conntrack_ftp
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
#201地址池的客戶端分配給ppp0
ip route add default dev ppp0 table 201
ip route add default dev ppp1 table 202
#不要接受ISP的默認網關,否則在此之前刪除ISP的默認網關。
----------------------------------------------------------
#ip分發主程序,根據實際情況,需改動Linenum即鏈路的個數,
#和cat pool1 pool2 >;pooltmp
#由telnet客戶端啟動該程序,使用nohup TheScriptName &,防止程序意外中止.
#!/bin/bash
LineNum=2
ME=$( basename $0 )
# Evaluate load on diffrent lines ,return the less busy one.
#
function EvaLoad ()
{
Fwmark=1
Cnt=1
Line=$(wc -l pool1 |awk '{print $1}')
while [ $Cnt -lt $LineNum ]
do
Cnt=$( expr $Cnt + 1 )
LineN=$(wc -l pool$Cnt |awk '{print $1}')
if [ $Line -gt $LineN ]
then
Line=$LineN
Fwmark=$Cnt
fi
done
}
#Start script
function DispatcherStart ()
{
#Initialize ip address pool automatically
Cnt=1
while [ $Cnt -le $LineNum ]
do
cat /dev/null>;pool$Cnt
Cnt=$( expr $Cnt + 1 )
done
iptables -t mangle -F
#Contact ARP table to find new clients
while :
do
grep '' /proc/net/arp |awk '{print $1}' >;iparp
cat pool1 pool2 >;pooltmp
cat iparp |while read ClientIp
do
grep -w "$ClientIp" pooltmp>;/dev/null
if [ $? -ne 1 ]
then
continue
fi
EvaLoad
iptables -t mangle -A PREROUTING -s $ClientIp/32 -j MARK --set-mark $Fwmark
echo $ClientIp >;>; pool$Fwmark
done
sleep 30
done
}
#
#------------------Main script
#
#
case "$1" in
start)
echo -e "Bringing up Dispatcher Program\n"
echo ""
DispatcherStart
;;
stop)
echo -e "Shutting down Dispatcher program\n"
kill -9 $( ps -ef|grep "$ME" |awk {'print $2'} )
if [ $? = 0 ] ; then
echo success
else
echo failure
fi
echo ""
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $ME {start&|stop|restart}"
exit 1
esac
exit 0
#---------Over-------Fargo--July 7,2003.Mailto:[email protected]
[火星人 ] Linux環境下多鏈路負載均衡已經有1091次圍觀