一個公網地址部署LVS/DR模式

網上看了不少關於LVS的文章,在選取2種模式LVS/DR和LVS/NAT,看到不少人的觀點都認爲DR模型中必需要使用多個公網地址,既DIP,VIP,RIP必須在同一網段內html

 

剛開始個人想法也是如此,所知道的惟一的解決方案就是在LVS集羣以前再加一臺路由器,用路由器作靜態NAT轉換,後端的LVS集羣則使用DR模式。不過這樣一來就比較耗成本,要有一臺路由器專門負責NAT的轉換工做,並且壓力都轉交給了前端的路由器,並且在性能,速度上相對於單純的DR模式並無提高。前端

 

DR模式的性能是絕對要比NAT要強不少的,通常NAT模式下,realserver不能超過10臺,而DR模式中,上百臺realserver也是木有問題的node

 

這兩天也就一直糾結於能不能使用單純的DR模式,並使用一個公網地址來實現(既VIP爲公網地址,RIP和DIP使用私網內部的地址)。參考了一些文檔linux

 

其實章文嵩博士已經在官網上明確表示過配置DR模式,徹底可讓VIP和DIP,RIP在不一樣網段的。參考http://zh.linuxvirtualserver.org/node/155web

 

而在此站點中也有關於DR模式使用不一樣網段的介紹 詳見http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.LVS-DR.html算法

 

在此,我在章文嵩博士的確定回答下參考了上面的介紹,總結了一下在真實場景中常見網絡架構中的場景後端

下面的圖有錯誤,VIP都是同一個地址200.0.0.10,在此糾正一下瀏覽器

WUT]XEG[(9}55EEWR6BI9UN

 

這種拓撲是比較常見類型,先分析下LVS的工做時數據包的是如何流轉的網絡

 

1.客戶發送源IP爲1.1.1.1,目標IP爲200.0.0.10的服務請求架構

2.數據包通過中間的層層路由,翻山越嶺到Director

3.Director查詢ipvsadm中定義的表項,根據算法選取一個realserver

在這裏,因爲是DR模型,因此Director只改變了數據2層部分的目標mac地址,轉發給私網IP的realserver

4.Realserver收到數據包後,通過處理,封包轉發給客戶端

關鍵的一步來了,realserver怎麼將數據包回覆給客戶端?

首先,在realserver上定義一條特殊路由,目標爲VIP的數據包都從loopback口發出去,因而源地址仍是爲VIP,數據包的源和目的地址都沒有變化。可是因爲限制了arp的廣播和應答方式,外界並不知道realserver上有VIP的存在,realserver也不知道VIP這個網段中的其它主機,因此數據包就卡在realserver這裏了。解決方法就是,在realserver上添加一條默認路由,不知道的包都發往上私網地址的網關,因而路由器接收到數據包後就直接路由轉發給客戶了,在這個拓撲圖中,路由器連接交換機的接口要有2個地址,一個是私網的網關地址,一個是公網的網關地址

實現了單個公網IP地址的LVS/DR模式

 

 

說了一大堆可能看的也暈乎,再來一幅常見的拓撲圖

(WL281RU~{NX2S6~6$@_GZK

在這幅圖中,director直接從ISP拉一條專線(至於ISP和Director之間防火牆之類的東西暫作屏蔽)

數據包是這樣流轉的

客戶-->互聯網-- > Director-- > Realserver-- > Gateway-- > 客戶

 

拓撲是變幻無窮的,具體按照實際場景來實施

 

接下來是具體的實現方法,如下實驗由虛擬機完成,先給個拓撲

這裏192網段模擬公網,10網段模擬私網

41CCZ(DH5C02TYB]@NIELA5

 

先介紹下實驗環境:客戶機是個人主機,Director和2臺realserver都是虛擬機,他們之間用虛擬交換機VMnet8相連,其中客戶既充當客戶又充當網關,因此在VMnet8網卡上也配置了2個地址(爲了不混淆,實驗最後會經過抓包來驗證)

 

 

director

首先配置地址

[root@localhost ~]# ifconfig eth0 10.0.0.10 netmask 255.255.255.0

[root@localhost ~]# ifconfig eth0:1 192.168.92.100 netmask 255.255.255.0 up

而後配置集羣服務

[root@localhost ~]# ipvsadm -A -t 192.168.92.100:80 -s rr #建立一個http的集羣服務,使用輪詢的算法

[root@localhost ~]# ipvsadm -a -t 192.168.92.100:80 -r 10.0.0.1 –g #添加一個realserver,並使用DR模式。能夠看到:提供服務的VIP和realserver的RIP並不在一個網段中

[root@localhost ~]# ipvsadm -a -t 192.168.92.100:80 -r 10.0.0.2 –g #一樣方法再添加一個realserver

至此director配置完成

查看下IP地址的配置

BD)$`X4UD[2(19M$GGX55S2

查看下ipvsadm的配置

Y7WOI7W6{{O@P{G5[YZ4A)H

看到這裏是route模式,並在不一樣網段中

 

realserver

首先上來先限制arp的廣播和應答

[root@ww1 ~]# echo 2  >  /proc/sys/net/ipv4/conf/all/arp_announce

[root@ww1 ~]# echo 2  >  /proc/sys/net/ipv4/conf/lo/arp_announce

[root@ww1 ~]# echo 1  >  /proc/sys/net/ipv4/conf/all/arp_ignore

[root@ww1 ~]# echo 1  >  /proc/sys/net/ipv4/conf/lo/arp_ignore

而後配置地址

[root@ww1 ~]# ifconfig eth0 10.0.0.1 netmask 255.255.255.0

[root@ww1 ~]# ifconfig lo:1 192.168.92.100 netmask 255.255.255.255 broadcast 192.168.92.100 #配置VIP必須不讓realserver對外廣播

接着配置路由

[root@ww1 ~]# route add -host 192.168.92.100 dev lo:1 #請求是VIP的包,以lo:1接口出去,因而源地址仍是爲VIP,不會致使由於從eth0出去將源地址變爲RIP

[root@ww1 ~]# route add default gw 10.0.0.3  #添加默認路由,指向私網的網關,在此實驗中是個人客戶機

而後啓動web服務

[root@ww1 ~]# echo "web1"  >  /var/www/html/index.html #建立網頁文件,web1作標示。在realserver2中以web2作標示

[root@ww1 ~]# service httpd start #啓動http服務

至此realserver1配置完成,realserver2也一樣按照此配置,地址改下,網頁文件不一樣就行

 

查看下IP地址的配置

E8U($S_5PNHFPKP1OK7EPGG

這裏再提供下第二臺realserver的網卡信息,後面驗證數據傳送查看mac地址時要用到

ZY5FSB`ET~H52${TA8F}P]U

查看下路由表

](MRBZY3WQR0M)JN{WEXM@6

 

OK 配置都已經完成,在客戶機上打開瀏覽器驗證(瀏覽過程當中用抓包工具抓取VMnet8網卡的數據)

屢次刷新,發現每次返回的內容是不同的

GZ30WI7K_1E`4X2I}Q_31(8

H{I]}N2~[]L_ZQ9ZML_]5H0

再到director上看下鏈接數,發現鏈接進來了

GCLC$K40VN`@[R%`~N]VU(W

 

而後抓包看看

首先看下本地主機VMnet8的mac地址

IE7{QF`CZB972XZ8}CC{`{5

 

J%R$TD4KSRAO9VO}_B5O3_N

這個包是本地主機發往director的包,具體每臺虛擬機和主機的mac地址能夠看前文中查看IP地址的顯示結果

0U24MKL]97MV559DJ17%[NS

這個包是director發到realserver上的,源IP和目的IP都沒變,director只改變了目的mac地址

3Y__9JC)S`MJ887G6IO%$$2

這個包是realserver傳給本地客戶的包(查看源和目標mac地址能夠驗證),源地址仍是爲VIP,目的地址爲本機客戶。

 

經過抓包驗證了數據的流向。

 

一個公網IP實現LVS/DR是可行的,數據包最終到達客戶時,在內部網絡中走的是私網的網關,至關於在公司內部饒了一個圈而已,而相比較NAT模式而言,DR模式的效率是NAT所不能比較的,在實際部署LVS中,也應該儘可能使用DR模式。

相關文章
相關標籤/搜索