爲何使用防火牆標記?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秒
清除以前定義的規則
[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服務器
在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。
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
實現將同一個用戶的80端口訪問請求和443端口訪問請求定義到同一臺web服務器。
因爲主機數量有限,在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/
說明: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設置,先不須要設置持久鏈接,測試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響應
切換到https訪問仍是WEB-02響應
說明:這裏的訪問https報證書錯誤是我沒有安裝CA的證書。