關於兩條鏈路實現負載均衡和容錯的設計

某公司的網絡以下圖所示:
   
    該公司有兩條專線,一條聯通的 2M 租線,另外一條互聯通的512K 租線;有一臺Linux 作的WEB服務器,該WEB服務器有一張網卡,接到中心交換機3560上。公司但願,當兩條線路都正常時,客戶可以經過任何一條專線訪問公司的WEB服務器,實現負載均衡;並且,當任何一條線路出現故障時,用戶仍然能夠訪問WEB服務器。
    分析:爲了實現兩條線路正常時的負載均衡,能夠經過配置DNS輪詢實現。而爲了實現容錯,咱們須要實現 從哪條線路進來的請求,其響應也從該線路出去,這是解決問題的關鍵所在。由於,若是從一條線路進去的請求,其響應從另一條線路出來的話,那麼TCP的三次握手不可能完成,TCP鏈接不可能創建起來(由於兩條線路上都有防火牆)。並且,即便不考慮防火牆的狀態檢測機制,假設兩條線路都正常時TCP鏈接可以創建起來,可是,一旦其中一條線路掛了,那麼鏈接也不可能創建得起來,容錯機制也不能實現。
    DNS輪詢,比較簡單,咱們不作深刻的討論。因爲該公司的域名是在域名供應商那裏註冊的,全部只須要在域名供應商的網站上作適當配置:將該公司的WEB服務器域名 [url]www.xxx.com.cn[/url] 分別映射到IP地址 x.x.x.x(聯通IP) 和 y.y.y.y(互聯通IP)就完事了。當用戶瀏覽[url]www.xxx.com.cn[/url]的時候,瀏覽器會智能地在這兩個IP之間做出選擇。
    下面咱們討論怎樣實現 從哪條線路進來的請求,其響應也從該線路出去。咱們能夠這樣來作:
     第一步:在聯通線路的防火牆上,將聯通給咱們的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
iptables -t nat -A POSTROUTING -p tcp -s 192.168.168.2/32 -d 0/0 \
--sport 80 -j SNAT --to-source y.y.y.y
 
     第三步:在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
[root@web network-scripts]# cat ifcfg-eth0:0
DEVICE=eth0:0
HWADDR=00:0C:76:23:23:9A
IPADDR=192.168.168.2
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 !!!
相關文章
相關標籤/搜索