linux虛擬機上lvs-nat的實現

一、lvs-nat

    LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器。是由章文嵩博士開發的一個在內核層面的負載均衡調度器。

    lvs是在netfilter的INPUT鏈上根據我們制定的調度規則將特定目標地址和端口的數據包轉發到後面的特定主機的,由於是工作於內核空間,所以工作效率高,經過優化最高可達400萬的併發量調度。

    lvs的實現需要兩部分:ipvs, ipvsadm

    ipvs是協議規則,ipvsadm是實現ipvs的工具,跟iptables具有極高的相似性。

    定義規則時,需要先定義集羣服務是什麼,然後在定義調度方法。

    lvs的類型有四種:lvs-nat,lvs-dr,lvs-tun,lvs-fullnat。受限於物理設備狀況,本次試驗只做lvs-nat的lvs測試。拓撲結構如下:

wKioL1VhuonTTL8rAAI9McU03jg470.jpg


    選擇了lvs類型後,還需要選擇lvs的scheduler調度法則。調度法則有多種:

       RR: round-robin, 輪詢;輪叫、輪調、輪流;

       WRR:weighted round-robin, 加權輪詢;

       SH:Source ip Hashing,源地址哈希;把來自同一個地址請求,統統定向至此前選定的RS;

       DH:Destination ip Hashing, 目標地址哈希;把訪問同一個目標地址的請求,統統定向至此前選定的某RS;

       LC: least connection

              Overhead=Active*256+Inactive,overhead值越小的越優先被訪問

       WLC: weighted least connection

              Overhead=(Active*256+Inactive)/weight,overhead值越小的越優先被訪問

       SED:Shorted Expection Delay

              Overhead=(Active+1)*256/weight,overhead值越小的越優先被訪問

       NQ:Never Queue

       LBLC:Local-Based Least Connection,動態方式的DH算法;

       LBLCR:Replicated LBLC

     最常用的也是默認的調度法則是wlc。


二、lvs-nat的實現


(一)、物理基礎網絡架設:


1、添加虛擬網絡


wKiom1VhuTLALihVAAEZ1KHT2Xs591.jpg

wKioL1VhusHhjzA8AAFK9bkiNsY680.jpg



     設置vmnet2的網絡,只要將IP的前兩段設置跟RS主機的一樣,掩碼也設爲255.255.0.0,保證跟兩臺RS主機及調度器主機的一個內網網卡eth0在同一個網絡中就可以,IP的第三段和第四段隨便填


        wKiom1Vhud_jFk-RAAGjYbAfmEw692.jpg


2、內網三臺主機(調度器DIRECTOR、RS1、RS2)的網絡設置


    設置好網絡

    其中作爲調度器DIRECTOR的主機需要有兩個網卡,一個連接外網,一個連接內網

    設置如下:

     Director 

          eth1:192.168.10.100/24  網卡設置爲橋接模式

          eth0:172.16.20.150/16   網卡設置爲vmnet2 僅主機模式

     RS1:

          eth0:172.16.20.100/16  網卡設置爲vmnet2 僅主機模式

     RS2:

          eth0:172.16.20.1/16  網卡設置爲vmnet2 僅主機模式


wKiom1VhuguRd9dFAAFZb_vkLRM953.jpg

wKioL1Vhu5nCBDHiAAH71XE-7xI092.jpg


3、打開調度器的ip轉發功能:

[root@kingdom Desktop]# cat /proc/sys/net/ipv4/ip_forward 
0
[root@kingdom Desktop]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@kingdom Desktop]# cat /proc/sys/net/ipv4/ip_forward 
1

4、測試網絡聯通情況

     調度器DIRECTOR ping兩個RS:

[root@kingdom Desktop]# ping 172.16.20.1
PING 172.16.20.1 (172.16.20.1) 56(84) bytes of data.
64 bytes from 172.16.20.1: icmp_seq=1 ttl=64 time=1.53 ms
……
[root@kingdom Desktop]# ping -c 1 172.16.20.100
PING 172.16.20.100 (172.16.20.100) 56(84) bytes of data.
64 bytes from 172.16.20.100: icmp_seq=1 ttl=64 time=0.347 ms
--- 172.16.20.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.347/0.347/0.347/0.000 ms

     兩個RS ping另一臺虛擬主機及調度器的內網網卡,這時是能ping同的,但量臺RS虛擬主機沒有ping通調度器的外網網卡。

5、查看調度器lvs協議狀況

     由於centos6已經內嵌了lvs,所以我們現在可以很幸福地不用自己將lvs編譯進內核了

# grep -i -A 5 "ipvs" /boot/config-2.6.32-504.el6.x86_64 
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
--
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
--
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_PE_SIP=m
#


(二)、RS虛擬主機網頁服務配置


1、在RS虛擬主機上配置虛擬主機的web服務。

     最簡單的就是yum安裝一個httpd,然後修改配置文件,設置好默認主頁:

[root@aunt-s Desktop]# yum install -y httpd
[root@aunt-s Desktop]# which httpd
/usr/sbin/httpd
[root@aunt-s Desktop]# rpm -q httpd
httpd-2.2.15-39.el6.centos.x86_64
[root@aunt-s conf]# vim /etc/httpd/conf/httpd.conf
Listen 80
KeepAlive On
DocumentRoot "/var/www/html"

       RS1設置主頁:

[root@aunt-s conf]# vim /var/www/html/index.html
<h1>Page Test on RS1</h1>
<h2>aaaaaaaaaaaaaaaa</h2>


       RS2設置主頁:

# vim /var/www/html/index.html
<h1>Page Test on RS2</h1>
<h2>2222222222222222</h2>


2、啓動RS1和RS2的web服務:

# service httpd start
Starting httpd:                                            [  OK  ]
# ss -tunlp | grep httpd
tcp    LISTEN     0      128                   :::80                   :::*      users:(("httpd",14906,4),("httpd",14909,4),("httpd",14910,4),("httpd",14911,4),("httpd",14912,4),("httpd",14913,4),("httpd",14914,4),("httpd",14915,4),("httpd",14916,4))

3、相關設置:

      保證iptables對web服務是放行的:

# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

       本次實驗是直接沒有設置iptables規則,如果原來設置了規則,需要調整一下,放行tcp80端口,源ip爲調度器的內網網卡。

保證selinux對web服務是放行的:

[root@www Desktop]# getenforce
Permissive

        本次實驗用的selinux是permissive。


3、測試web服務都能取得相應的網頁,服務開通成功。

[root@aunt-s conf]# curl http://172.16.20.100
<h1>Page Test on RS1</h1>
<h2>aaaaaaaaaaaaaaaa</h2>
[root@aunt-s conf]# curl http://172.16.20.1
<h1>Page Test on RS2</h1>
<h2>2222222222222222</h2>

(三)、調度器ipvs及相關設置


1、安裝ipvsadm

# yum install -y ipvsadm
……
Installed:
  ipvsadm.x86_64 0:1.26-4.el6                                                                                                                                
Complete!

      由於網絡設置問題,可能需要事先安裝好再做上面的網絡配置。自己本次試驗由於內網是用的172.16網段,外網用的是192.168.10網段,與教室環境不在同一個網絡,所以,是先將外網網卡IP及路由都修改後安裝程序包的,安裝完後再修改回去:

# route add -host 172.16.0.1  gw 172.16.0.1 dev eth1
# yum install -y ipvsadm
# route del -host 172.16.0.1  gw 172.16.0.1 dev eth1
# ifconfig eth1 192.168.10.100/24


2、設置DIRECTOR的lvs規則:

      確定iptables和selinux不會對試驗造成障礙:

[root@kingdom Desktop]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@kingdom Desktop]# getenforce
Disabled


      先定義web集羣服務,再定義調度規則。

      由於本次試驗的網絡拓撲結構爲nat型,所以,lvs類型只能選擇-m。但調度策略scheduler是可以任選的。

[root@kingdom Desktop]# ipvsadm -A -t 192.168.10.100:80 -s rr
[root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:80 -r 172.16.20.100:80 -m -w 3
[root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:80 -r 172.16.20.1:80 -m -w 1
[root@kingdom Desktop]# ipvsadm -l -n 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 rr
  -> 172.16.20.1:80               Masq    1      0          0         
  -> 172.16.20.100:80             Masq    3      0          0         
[root@kingdom Desktop]#


(四)、web服務測試


1、設置物理主機的網絡,以便能直接通過物理主機上的瀏覽器打開RS的web主頁:

      由於我們的虛擬機都是自己私設的ip地址,所以,要使物理主機能直接訪問到,就應該讓物理主機的IPv4與調度器主機DIRECTOR的外網網卡在同一網段中,也即是192.168.10網段中。

      沒有修改物理主機網段時,在物理主機上(windows的cmd窗口)是ping不同調度器外網網卡的:


wKiom1VhumLA4s-gAAESog3LG-0310.jpgwKiom1VhunqxjCKmAAGXZuw48Nc744.jpg



       設置好後可以ping調度器了,但是ping不同內網任何一個網卡:

wKioL1VhvBuDdUNQAAHgJxxebsY365.jpg


2、測試web服務

     在調度器上測試有沒有web服務:

[root@kingdom Desktop]# ss -tnlp | grep httpd
[root@kingdom Desktop]#

     結果是沒有。

     然後通過物理主機(windows)的瀏覽器打開調度器DIRECTOR的外網網卡:

wKiom1VhuqCSJ2JEAAIKxSCmreg889.jpg


     然後在DIRECTOR上都能打開內網RS的網頁:

[root@kingdom Desktop]# curl http://172.16.20.1
<h1>Page Test on RS2</h1>
<h2>2222222222222222</h2>
[root@kingdom Desktop]# curl http://172.16.20.100
<h1>Page Test on RS1</h1>
<h2>aaaaaaaaaaaaaaaa</h2>

      猜測原因:本次構建的網絡是lvs-nat,RS沒有將網關指向調度器DIRECTOR,在RS上抓包結果如下

wKioL1VhvEyQA-WbAAIYuBwY3Y4180.jpg


      給兩個RS添加網關,指向DIRECTOR:

# route add default gw 172.16.20.150 dev eth0


wKiom1VhutOQ1C4KAAGP_nUbJAo319.jpg


3、將lvs scheduler設置爲wlc 測試效果

      先修改調度器DIRECTOR對web服務的調度規則:

[root@kingdom Desktop]# ipvsadm -E -t 192.168.10.100:80 -s wlc
[root@kingdom Desktop]# ipvsadm -l -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 wlc
  -> 172.16.20.1:80               Masq    1      0          3         
  -> 172.16.20.100:80             Masq    3      0          3         
[root@kingdom Desktop]#

      提供第四臺虛擬機,其網絡設置爲:

      網絡適配器選擇爲橋接模式;

           eth0:192.168.10.1/16

      清空ipvs的計數器,以便更準確測試wlc策略的調度比值:

# ipvsadm -Z -t 192.168.10.100:80
# ipvsadm -l -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.100:80                   0        0        0        0        0
  -> 172.16.20.1:80                      0        0        0        0        0
  -> 172.16.20.100:80                    0        0        0        0        0

      在虛擬主機四上對調度器做web壓力測試:

# ab -n 5000 -c 100 http://192.168.10.100/index.html

      在調度器上查看結果:

[root@kingdom Desktop]# ipvsadm -l -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.100:80                8334   276749   276376 19924288 32466424
  -> 172.16.20.1:80                   2723   101478   101339  7305856 11905439
  -> 172.16.20.100:80                 5611   175271   175037 12618432 20560985
[root@kingdom Desktop]# ipvsadm -l -n 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 wlc
  -> 172.16.20.1:80               Masq    1      0          10214     
  -> 172.16.20.100:80             Masq    3      0          17823

     這結果,只能說大致傾向於2:1,這個是動態調度的結果。


4、將scheduler設置爲sh,查看調度效果:

[root@kingdom Desktop]# ipvsadm -E -t 192.168.10.100:80 -s sh
[root@kingdom Desktop]# ipvsadm -l -n 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 sh
  -> 172.16.20.1:80               Masq    1      0          0         
  -> 172.16.20.100:80             Masq    3      0          0       
[root@kingdom Desktop]# ipvsadm -Z -t 192.168.10.100:80

     在虛擬主機四上對調度器做web壓力測試:

# ab -n 5000 -c 100 http://192.168.10.100/index.html

     在調度器上查看結果:

[root@kingdom Desktop]# ipvsadm -l -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.100:80               15134    75724    75184  5445456  8826054
  -> 172.16.20.1:80                      0        0        0        0        0
  -> 172.16.20.100:80                15134    75724    75184  5445456  8826054

     測試結果完全符合sh的調度規則(第一次隨機調度到某臺RS,隨後的同IP訪問全部依據第一次的調度進行)。


5、將scheduler修改爲wrr,查看調度效果:

[root@kingdom Desktop]# ipvsadm -E -t 192.168.10.100:80 -s wrr
[root@kingdom Desktop]# ipvsadm -l -n 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:80 wrr
  -> 172.16.20.1:80               Masq    1      0          0         
  -> 172.16.20.100:80             Masq    3      0          15002
# ipvsadm -Z -t 192.168.10.100:80

      在虛擬主機四上對調度器做web壓力測試:

# ab -n 5000 -c 100 http://192.168.10.100/index.html

      在調度器上查看結果:

[root@kingdom Desktop]# ipvsadm -l -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.10.100:80               28852   331710   330048 23870364 38780354
  -> 172.16.20.1:80                   7213    83052    81941  5967600  9626348
  -> 172.16.20.100:80                21639   248658   248107 17902764 29154006

       從結果可以看出,這次的靜態調度wrr與動態的調度不同,是遵循權重比值3:1的。




(五)、ssh和telnet遠程登錄調度測試


     lvs調度是在內核的netfilter的INPUT鏈上調度數據包流向來達到調度目的的,工作位置比較底層,所以只要是需要通過tcp/ip數據包進行通信的服務都可以通過lvs進行調度,如web服務、ssh/telnet遠程登錄、https安全登錄、遠程mysql數據庫管理。

     下面驗證ssh和telnet遠程登錄服務的調度。

     基礎設置框架跟上面的web一樣,此外,需要在原來做RS的虛擬主機上安裝telnet服務器程序和sshd服務程序,並開啓。

# rpm -q telnet-server
telnet-server-0.17-48.el6.x86_64
# chkconfig telnet on
# service xinetd start
Starting xinetd: 
# ss -tunlp | grep :23
tcp    LISTEN     0      64                    :::23                   :::*      users:(("xinetd",1702,5))

     23號端口已處於監聽狀態,telnet服務已開啓。

     在調度器主機上設置ipvs:

[root@kingdom Desktop]# ipvsadm -A -t 192.168.10.100:23 -s rr
[root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:23 -r 172.16.20.1:23 -m  -w 1
[root@kingdom Desktop]# ipvsadm -a -t 192.168.10.100:23 -r 172.16.20.100:23 -m  -w 1
[root@kingdom Desktop]# ipvsadm -l -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.100:23 rr
  -> 172.16.20.1:23               Masq    1      0          0         
  -> 172.16.20.100:23             Masq    1      0          0         
TCP  192.168.10.100:80 rr
  -> 172.16.20.1:80               Masq    1      0          0         
  -> 172.16.20.100:80             Masq    3      0          0         
[root@kingdom Desktop]#


     保證RS虛擬主機上有非root用戶能登錄:


wKiom1VhuvCgOjs-AALqcjdfexU724.jpg

     從結果可以看出,ipvs是輪詢調度telnet登錄的,一次登錄在RS1上,下一次登錄在RS2上。

     其他服務親們可以自行測試。

       mysql遠程登錄是需要設置3306/tcp,mysql數據庫需要先授權訪問權限給發起訪問的遠程主機IP。

       ssh遠程登錄是需要設置24/tcp


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章