FWM及LVS持久鏈接

FWM防火牆標記

爲何使用防火牆標記?html

未來自於同一個客戶端的全部請求都定義到同一個realserver上;如使用防火牆標記將443和80定義爲同一個集羣服務,這樣就能夠實現統一調度到後端的real server。web

好比:在電商站點中,若是往購物車中添加商品以後,須要付款;這個時候就須要訪問direction,發起的鏈接就不是http,而是https,direction會認爲這是一個新的鏈接,極可能會被分配到其餘RS服務器,這個時候購物車中就沒有了商品。爲了解決這種問題,就須要把用戶的http請求和https請求,都調度到同一臺服務器。算法


防火牆標記在何時打?shell

當用戶請求報文進行防火牆(PREROUTING),防火牆就將特定報文(如:443和80),打上標記,假設標記爲10;LVS設置的時候,就能夠根據標記進行設置,只要請求帶有標記10,就會將請求調度到同一個RS服務器後端

 

定義方法:bash

(1)  打標:在direction上的mangle表的PREROUTING鏈上實現服務器

語法: iptables -t mangle -A PREROUTING-d $vip -p $protocol --dport $port -j MARK --set-mark [1-99]負載均衡

(2)  基於FWM定義集羣服務tcp

# ipvsadm -A -f FWM -s SCHEDULERide

     # ipvsadm -a -f FWM -rserver-address -g|-i|-m -w #

實例配置:

說明:我是使用LVS-DR配置的集羣服務環境,已經配置ok。


對用戶請求打標記:將訪問集羣的80端口的報文,定義標記爲10.

[root@LVS ~]# iptables -t mangle -A PREROUTING -d 172.16.4.1 -p tcp --dport 80 -j MARK --set-mark 10
[root@LVS ~]# iptables -t mangle -L -n  
Chain PREROUTING (policy ACCEPT)
target    prot opt source              destination        
MARK      tcp  --  0.0.0.0/0            172.16.4.1          tcp dpt:80 MARK set 0xa

定義集羣服務,這個時候VIP地址和端口,就可使用防火牆標記代替了。

[root@LVS ~]# ipvsadm –C    #清除以前DR設置的集羣服務
[root@LVS ~]# ipvsadm -A -f 10 -s rr
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.101 -g-w 1
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.102 -g-w 1

這個時候訪問集羣服務和以前DR設置的效果是如出一轍的。

443和80一塊兒打標,在下面和PFWM一塊兒設置的。


持久鏈接

持久鏈接的做用:不管使用哪種調度方法,持久鏈接功能都能保證在指定時間範圍以內,未來在於同一個IP的請求始終被定向至同一個RS;

和sh調度比較的優勢:

sh:會一直將一個用戶請求定義到一個後端server,不會考慮後端服務器狀態。

持久鏈接:第一次會根據設置的調度算法(rr,wlc……)調度到後端,在指定的會話存活時間使用持久鏈接,會話存活時間到期以後,仍是根據調度算法進行調度。

 

persistencetemplate:持久鏈接模板:將多個集羣服務歸併到一塊兒統一調度

    PPC:每端口持久;持久鏈接生效範圍僅爲單個集羣服務;若是有多個集羣服務,每服務被單獨持久調度;

    PCC:每客戶端持久;持久鏈接生效範圍爲全部服務;定義集羣服務時,其TCP或UDP協議的目標端口要使用0;

    PFWM:每FWM持久:持久鏈接生效範圍爲定義爲同一個FWM下的全部服務;

 

lvspersistence語法:

       ipvsadm-A -t|-u|-f service-address -s SCHEDULER -p [#]

       無-p選項:不啓用持久鏈接

       -p #:指定持久時長,省略時長,默認爲360秒    

定義一個PPC持久鏈接的服務

調度器配置

清除以前定義的規則

[root@LVS ~]# iptables -t mangle -F
[root@LVS ~]# ipvsadm -C

設置持久鏈接規則

[root@LVS ~]# ipvsadm -A -t 172.16.4.1 -s rr -p
[root@LVS ~]# ipvsadm -a -t 172.16.4.1 -r172.16.4.101 -g
[root@LVS ~]# ipvsadm -a -t 172.16.4.1 -r172.16.4.102 -g
[root@LVS ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn
TCP 172.16.4.1:0 rr persistent 360   #表示啓用了持久鏈接功能
  ->172.16.4.101:0               Route   1     0          0        
  ->172.16.4.102:0               Route   1     0          0

設置完成以後,客戶端訪問集羣服務將會被始終調度到同一臺RS服務器

PCC持久鏈接

在RS服務器上面安裝telnet-server

[root@WEB-01 ~]# yum -y install telnet-server
[root@WEB-01 ~]# chkconfig telnet on
[root@WEB-01 ~]# service xinetd start
[root@WEB-01 ~]# useradd pcc
[root@WEB-01 ~]# echo "pcc" | passwd--stdin pcc 
[root@WEB-02 ~]# yum -y install telnet-server
[root@WEB-02 ~]# chkconfig telnet on
[root@WEB-02 ~]# service xinetd start
[root@WEB-02 ~]# useradd pcc
[root@WEB-02 ~]# echo "pcc" | passwd--stdin pcc

Direction定義集羣

[root@LVS ~]# ipvsadm -A -t 172.16.4.1:0 -s rr -p
[root@LVS ~]# ipvsadm -a -t 172.16.4.1:0 -r172.16.4.101 -g 
[root@LVS ~]# ipvsadm -a -t 172.16.4.1:0 -r172.16.4.102 -g

訪問集羣看到的是WEB-02服務器,那麼使用telnet鏈接必定仍是web-02。

wKiom1VnQCyxo-4JAAC8ftcGlxc347.jpg

telnet鏈接集羣

Xshell:\> telnet 172.16.4.1
Connecting to 172.16.4.1:23...
Connection established.
Escape character is '^@]'.
CentOS release 6.6 (Final)
Kernel 2.6.32-504.el6.x86_64 on an x86_64
login: pcc
Password:
[pcc@localhost ~]$ ifconfig
eth0     Link encap:Ethernet  HWaddr00:0C:29:91:F6:60 
         inet addr:172.16.4.102 Bcast:172.16.255.255 Mask:255.255.0.0


PFWM持久鏈接

實現將同一個用戶的80端口訪問請求和443端口訪問請求定義到同一臺web服務器。

建立CA私有CA,及http證書申請

因爲主機數量有限,在lvs上面建立私有CA

[root@LVS ~]# cd /etc/pki/CA/
[root@LVS CA]# (umask 077;openssl genrsa -outprivate/cakey.pem 2048)
[root@LVS CA]# openssl req -new -x509 -keyprivate/cakey.pem -out cacert.pem -days 3650
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default CompanyLtd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server'shostname) []:ca.test.com
Email Address []:ca@admin.com
[root@LVS CA]# touch serial index.txt
[root@LVS CA]# echo 01 > serial

WEB-01申請證書

[root@WEB-01 ~]# cd /etc/httpd/conf
[root@WEB-01 conf]# mkdir ssl
[root@WEB-01 conf]# cd ssl/
[root@WEB-01 ssl]# (umask 077; openssl genrsa -out httpd.key1024)
[root@WEB-01 ssl]# openssl req -new -key httpd.key-out httpd.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default CompanyLtd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server'shostname) []:www.lvs.com
Email Address []:web@admin.com
A challenge password []:
An optional company name []:

複製證書到CA

[root@WEB-01 ssl]# scp httpd.csr root@172.16.4.100:/root/

CA簽署證書

[root@LVS ~]# openssl ca -in httpd.csr -outhttpd.crt -days 3650
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit?[y/n]y

將申請好的證書從新傳給WEB-01

[root@LVS ~]# scp httpd.crt root@172.16.4.101:/etc/httpd/conf/ssl/

配置httpds

說明:WEB-01和WEB-02使用的證書是同一個;不須要在兩個節點重複申請,只須要在一個節點建立完成,將證書複製到第二個節點便可。

 

安裝mod_ssl模塊(若是不安裝此模塊,則沒有ssl.conf的配置文件)

[root@WEB-01 ~]# yum -y install mod_ssl

設置https

DocumentRoot "/var/www/html"
SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key

啓動服務查看是否監聽443端口

[root@WEB-01 ~]# service httpd restart
[root@WEB-01 ~]# netstat -lnt | grep 443
tcp       0      0 :::443                      :::*                        LISTEN

複製ssl目錄到WEB-02

[root@WEB-01 ~]# scp -rp /etc/httpd/conf/ssl/root@172.16.4.102:/etc/httpd/conf/

這個時候還不能直接複製,ssl配置文件,由於WEB-02尚未安裝mod_ssl

web-02安裝mod_ssl

[root@WEB-02 ~]# yum -y install mod_ssl

複製ssl配置文件

[root@WEB-01 ~]# scp /etc/httpd/conf.d/ssl.confroot@172.16.4.102:/etc/httpd/conf.d/ssl.conf

Web-02重啓httpd服務,已經監聽443端口了

[root@WEB-02 ~]# service httpd restart
[root@WEB-02 ~]# netstat -lnt | grep 443
tcp       0      0 :::443                      :::*                        LISTEN

lvs設置FWM持久鏈接

LVS設置,先不須要設置持久鏈接,測試https是否能夠正常調度

[root@LVS ~]# iptables -t mangle -A PREROUTING -d172.16.4.1 -p tcp --dport 80 -j MARK --set-mark 10
[root@LVS ~]# iptables -t mangle -A PREROUTING -d172.16.4.1 -p tcp --dport 443 -j MARK --set-mark 10  
[root@LVS ~]# ipvsadm -A -f 10 -s rr
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.101 -g
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.102 -g

驗證:確保訪問http和https都是負載均衡。

修改成持久鏈接,保證不管衝http協議,切換到https協議,仍是https協議切換到http協議都是同一臺主機。

[root@LVS ~]# ipvsadm -E -f 10 -s rr -p

使用http訪問是WEB-02響應

wKioL1VnQcqS53olAACucqWHWOQ709.jpg

切換到https訪問仍是WEB-02響應

wKioL1VnQdHAE0BPAACd3w4VRhc109.jpg

說明:這裏的訪問https報證書錯誤是我沒有安裝CA的證書。

相關文章
相關標籤/搜索