Linux環境下多鏈路負載均衡

火星人 @ 2014-03-04 , reply:0


  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:honglus@21cn.com





[火星人 via ] Linux環境下多鏈路負載均衡已經有139次圍觀

http://www.coctec.com/docs/service/show-post-9751.html