天天看點

關于兩條鍊路實作負載均衡和容錯的設計

某公司的網絡如下圖所示:

    該公司有兩條專線,一條聯通的2M 租線,另一條互聯通的512K 租線;有一台Linux 做的WEB伺服器,該WEB伺服器有一張網卡,接到中心交換機3560上。公司希望,當兩條線路都正常時,客戶能夠通過任何一條專線通路公司的WEB伺服器,實作負載均衡;而且,當任何一條線路出現故障時,使用者仍然可以通路WEB伺服器。

    分析:為了實作兩條線路正常時的負載均衡,可以通過配置DNS輪詢實作。而為了實作容錯,我們需要實作 從哪條線路進來的請求,其響應也從該線路出去,這是解決問題的關鍵所在。因為,如果從一條線路進去的請求,其響應從另外一條線路出來的話,那麼TCP的三次握手不可能完成,TCP連接配接不可能建立起來(因為兩條線路上都有防火牆)。而且,即使不考慮防火牆的狀态檢測機制,假設兩條線路都正常時TCP連接配接能夠建立起來,但是,一旦其中一條線路挂了,那麼連接配接也不可能建立得起來,容錯機制也不能實作。

    下面我們讨論怎樣實作 從哪條線路進來的請求,其響應也從該線路出去。我們可以這樣來做:

     第一步:在聯通線路的防火牆上,将聯通給我們的IP位址x.x.x.x 的80端口映射到内網位址 192.168.168.1的80端口:

iptables -t nat -A PREROUTING -p tcp -s 0/0 -d x.x.x.x/32 \

--dport 80 -j DNAT --to-destination 192.168.168.1

iptables -t nat -A POSTROUTING -p tcp -s 192.168.168.1/32 -d 0/0 \

--sport 80 -j SNAT --to-source x.x.x.x

     第二步:在互聯通線路的防火牆上,将互聯通給我們的IP位址y.y.y.y 的80端口映射到内網位址 192.168.1.2的80端口:

iptables -t nat -A PREROUTING -p tcp -s 0/0 -d y.y.y.y/32 \

--dport 80 -j DNAT --to-destination 192.168.168.2

     第三步:在WEB伺服器上,為網卡eth0綁定兩個IP位址:192.168.168.1,192.168.168.2:

[root@web network-scripts]# cat ifcfg-eth0

DEVICE=eth0

HWADDR=00:0C:76:23:23:9A

IPADDR=192.168.168.1

NETMASK=255.255.255.0

ONBOOT=yes

TYPE=Ethernet

     第四步:在WEB伺服器上配置政策路由:将來自聯通線路的,發給192.168.168.1的請求的響應包,發送給192.168.168.11,然後通過聯通的線路,傳回給使用者;将來自互連通線路的,發給192.168.168.2的請求的響應包,發給192.168.168.12,然後通過互聯通的線路傳回給使用者.這樣,就可以實作 從哪條線路進來的請求,其響應也從該線路出去。 具體配置如下:

[root@web ~]# ip route add table 1 default via 192.168.168.11

[root@web ~]# ip route add table 2 default via 192.168. 168.12

[root@web ~]# ip rule add from 192.168.168.1 table 1

[root@web ~]# ip rule add from 192.168.168.2 table 2

[root@web ~]# sh ip rule    <--- IOS  ^-^

/sbin/ip: /sbin/ip: cannot execute binary file

[root@web ~]# ip rule list

0:      from all lookup local

32764:  from 192.168.168.2 lookup 2

32765:  from 192.168.168.1 lookup 1

32766:  from all lookup main

32767:  from all lookup default

[root@web ~]# ip route list table 1

default via 192.168.168.11 dev eth0

[root@web ~]# ip route list table 2

default via 192.168.168.12 dev eth0

就這樣,就搞定了。Good Luck !!!

本文轉自zkjian517 51CTO部落格,原文連結:http://blog.51cto.com/zoukejian/57470