LVS是什么就不多說了。
先上拓撲圖
1台LVS 3台Realserver 一個客戶端。 環境全部模擬全在內網環境(selinux和iptables關閉)
先簡略說一下安裝步驟:
LVS上:
1、先將本地eth0分出一個子網卡 eth0:1 並配置上VIP(我的VIP為 192.168.0.36)
ifconfig eth0:0 192.168.0.36 broadcast 192.168.0.36 netmask 255.255.255.255 up
2、再將外部所有請求VIP的流量都導向這塊網卡,所以需要添加路由
route add -host 192.168.0.36 dev eth0:0
但是這樣只是臨時添加,如果重啟network 服務,或者重啟系統。條目會消失,至於怎樣永久,有好多種辦法,比如rc.local(查看路由表 route)HU代表路由到一個主機上,UG即代表路由到路由器。
3、在配置路由轉發,修改 /etc/sysctl.conf 文件
將net.ipv4.ip_forward = 0 的值改成 1 然后使用sysctl -p 命令來刷新保存的文件。
這個改動可以理解成將eth0 和eth0:1 中間做一個路由條目,如果為0的話,2塊網卡可以理解成是不想通的即可。
4、在來配置安裝ipvsadm (yum安裝or 源碼)
源碼安裝沒有什么特殊的。只不過要先安裝依賴包libnl*
這里我們使用yum安裝,也是官網最新的1.2.6ipvsadm。
yum -y install ipvsadm
配置ipvsadm
ipvsadm -C #清楚表內的規則 ipvsadm -At 192.168.0.36:80 -s wrr ipvsadm -at 192.168.0.36:80 -r 192.168.0.38:80 -g -w 1 ipvsadm -at 192.168.0.36:80 -r 192.168.0.162:80 -g -w 1 ipvsadm -at 192.168.0.36:80 -r 192.168.0.41:80 -g -w 1 /etc/init.d/ipvsadm start #啟動lvs (如果發現找不到/etc/sysconfig/ipvsadm報錯就使用service ipvsadm save 保存條目) # -A相當於定義一個模塊,模塊的規則為VIP的80端 口如果想在VIP上定義其他端口則會報錯。 -s:輪詢規則,詳細請看文章末尾鏈接。 # -a添加規則 -r為后端真是Rserver服務器這里只能指定80端口,我試過添加其他端口,均會被自動修改成80 添加之后可以在 vi /etc/sysconfig/ipvsadm 查看條目,也可以使用ipvsadm -Ln 來查看
在配置Realserver端:(如配置不理解請看LVS配置)
ifconfig lo:0 192.168.0.36 broadcast 192.168.0.36 netmask 255.255.255.255 up route add -host 192.168.0.36 dev lo:0
在/etc/sysctl.conf 末尾加上 (ARP抑制)
#LVS arp net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
Realserver 配置完畢。其余2台也都一樣
#=================分=========析=========區==================
一、當客戶端發送一個請求到VIP時ip數據包(ipdata)攜帶的什么呢。
RSC-IP DST-IP 和請求內容以及各種校驗,這里我關注我們關注的。
細分一下過程:
1、請求到達交換機 (請求的IP為VIP) 這個時候假設交換機上沒有ARP緩存。
2、交換機會說:我本地沒有VIP對應的MAC,我去幫你找吧。
3、交換機瞬間像所有網口發送ARP廣播包。此ARP的廣播包里DST-IP為VIP
4、而此時Realserver和交換機相連的端口為eth0。但是route會把這個請求送達給lo:0上,由於arp_ignore=1的緣由,只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求.所以lo:0會忽略掉這個ARP請求,但是LVS沒有設置。所以LVS會告訴交換機,我是VIP。
5、交換機記錄VIP以及對應的MAC,將ipdata交給了LVS。
6、LVS將ipdata拆包看到請求的是VIP:80端口,遂查詢LVS規則+輪詢算法,將確定處理該request的Realserver的IP(即RIP假設為192.168.0.41)
7、LVSDR模式獨有的MAC尋址,這個時候LVS本地沒有Rserver的MAC,遂發ARP廣播包說:RIP為Realserver的MAC是多少。
8、ARP包經過eth0口流入每個Rserver,Rserver 這個時候會通過系統內核,內核說:這個ARP請求的是本地網卡的IP,我們要給出回應。就會給出ARP的應答包發給LVS的DIP。
9、LVS將Rserver應答給自己的MAC存入自己的arp -n 緩存表中,並將ipdata包的外層繼續封裝一層MAC尋址而此時的SRC-IP 仍未CIP ,DST-IP 為VIP 但是SRC-MAC為DIP即LVS的MAC。DST-MAC為RIP的MAC
10、數據包到達Realserver時,Rserver驗證這個數據包是不是自己能處理的需要符合2個要求 1、MAC是自己的 2、IP是自己的 此時lo:0綁定的VIP就起到作用,將ipdata數據包送上CPU。
11、Realserver處理完成之后,SRC-IP 為VIP,DST-IP 為CIP SRC-MAC為RMAC DST-MAC為CMAC (現實環境中為網關的,即CIP為路由器網關)
下圖為對應其過程
為驗證7過程,使用tshark抓取 192.168.0.41網口流量驗證ARP包內為RIP而非VIP
清空LVS本地緩存,查看arp緩存用arp -n 清楚ARP緩存使用
arp -n|awk '/^[1-9]/{print "arp -d " $1}'|sh -x
另外LVS規則算是內核方法,用netstat -ntulp也顯示不了其偵聽的端口。啟動日志在/var/log/message中
另外感謝吳大大(大牛勒)
如果有誤,請聯系博主,博主會立即更改。請發郵件至 907765003@qq.com
LVS十種均衡算法 : http://www.linuxidc.com/Linux/2013-05/84249.htm
ARP抑制原理:http://www.ddvip.com/tech/100075689.html
wireshake抓包:http://www.centoscn.com/IT/2013/0331/180.html