五、lvs使用進階(01)

四層、七層負載均衡的區別  https://jaminzhang.github.io/lb/L4-L7-Load-Balancer-Difference/  html

netfilter/iptables簡介   https://segmentfault.com/a/1190000009043962

LVS使用防火牆標記實現多端口綁定服務  http://www.unixfbi.com/453.html

一,防火牆標記介紹   

FirewallMark FWM 防火牆標記  一個集羣服務(lvs-dr調度web server)能夠將兩個服務(如80/443/22等)綁定在一塊兒調度

咱們使用LVS/DR模式搭建web服務器的負載均衡,若是web服務器須要同時支持http和https的話,須要配置兩套服務了,一套基於http的80端口,另外一套基於https的443端口。配置兩套有沒有感受維護起來比較麻煩。有沒有其餘的解決方案呢?答案是有的。下面咱們來看看防火牆標記與LVS結合實現這一功能。git

防火牆標記和lvs結合,可讓兩個服務指向同一個集羣,例如咱們這裏把80和443端口的服務都指向同一個集羣。功能:將共享一組RS的集羣服務統一進行定義。
經過FWM定義集羣的方式步驟:
(1)在director上netfilter的mangle表的PREROUTING定義用於"打標"的規則github

# iptables -t mangle -A PREROUTING -d $vip -p $protocol --dports $dport -j MARK --set-mark $num

    $vip是LVS的VIP地址,$dport是要訪問本地的端口,$num是防火牆標記位。若是想讓2個不一樣的端口當作同一個集羣服務的話,這裏的$num的值要同樣。web

(2)基於FWM定義集羣服務:算法

# ipvsadm -A -f $num -s scheduler

二、示例 (藉助RIP、DIP、VIP都在同一網段,已經作好的LVS-DR模型)

(1)準備工做vim

# ipvsadm -L -n   //首先查看是否有ipvsadm的規則,若是有,則清空segmentfault

# ipvsadm -C  //清空規則瀏覽器

# iptables -t mangle -L -n  //查看是否有iptables規則鏈,記得禁用firewalld安全

# iptables -t mangle -F   //若是有則清空bash

# iptables -t mangle -x

# iptables -t nat -x   //nat的規則也須要清理

# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)
target       prot opt source      destination

Chain INPUT (policy ACCEPT)
target       prot opt source      destination

Chain OUTPUT (policy ACCEPT)
target       prot opt source      destination

Chain POSTROUTING (policy ACCEPT)
target       prot opt source      destination

(2)定義iptables規則

# iptables -t mangle -A PREROUTING -d 192.168.184.145 -p tcp --dport 80 -j MARK --set-mark 10 

  //請求的是VIP,目標端口是80,都會打上標記10

# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)
target prot  opt  source     destination
MARK   tcp   --   0.0.0.0/0  192.168.184.145  tcp dpt:80 MARK set 0xa

(3)添加ipvsadm規則,基於FirewallMark定義LVS負載均衡集羣

# ipvsadm -A -f 10 -s rr

# ipvsadm -a -f 10 -r 192.168.184.142 -g

# ipvsadm -a -f 10 -r 192.168.184.143 -g

(4)此時在瀏覽器中輸入IP地址便可訪問

這樣的好處在於將兩種集羣定義成同一個來調度,以上的集羣規則不變,將SSH服務作成負載均衡集羣。

利用SSH服務鏈接192.168.184.145,此時請求的是director的VIP。

接下來在director上把SSH服務也定義爲集羣,而且和上面web服務(142/143)是同一個集羣,須要添加一條iptables規則,即防火牆爲10的目標端口再添加一個22端口就能夠了,集羣規則無需改變。

# iptables -t mangle -A PREROUTING -d 192.168.184.145 -p tcp --dport 22 -j MARK --set-mark 10 //當請求的服務目標端口是22時,會打上標記10

此時再用SSH服務登錄VIP:192.168.184.145:兩張圖片對比可知,雖然都是利用SSH服務請求的192.168.184.145,但返回的RIP地址是不同的,這就FWM防火牆標記意義

三、下面配置同時調度80和443端口

配置https證書

(1)建立CA(在director上即192.168.184.141上建立)

# cd /etc/pki/CA

# (umask 077; openssl genrsa -out private/cakey.pem 2048)  //生成私鑰

# touch index.txt

# echo 01 > serial

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365  //生成自簽證書

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Dongshi
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.dongshi.com
Email Address []:

# ls -l

-rw-r--r--  1 root root 1326 Oct  7 14:24 cacert.pem

drwxr-xr-x. 2 root root 6 Aug 4 2017 certs 
drwxr-xr-x. 2 root root 6 Aug 4 2017 crl
-rw-r--r-- 1 root root 0 Oct 7 14:08 index.txt
drwxr-xr-x. 2 root root 6 Aug 4 2017 newcerts
drwx------. 2 root root 23 Oct 7 14:07 private
-rw-r--r-- 1 root root 3 Oct 7 14:08 serial 

(2)爲兩個real server申請身份證書

# cd /etc/httpd

# mkdir ssl

# cd ssl

# (umask 077; openssl genrsa -out httpd.key 1024)  //生成私鑰

# openssl req -new -key httpd.key -out httpd.csr  //

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Dongshi
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:web.dongshi.com
Email Address []:webadmin@dongshi.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# ll
total 8
-rw-r--r-- 1 root root 708 Oct 7 14:42 httpd.csr
-rw------- 1 root root 887 Oct 7 14:37 httpd.key

# scp httpd.csr root@192.168.184.141:/tmp  //發給CA

# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt  //在director(141)上CA簽署證書

Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Oct 7 06:45:40 2018 GMT
Not After : Oct 7 06:45:40 2019 GMT
Subject:
countryName = CN
stateOrProvinceName = Beijing
organizationName = Dongshi
organizationalUnitName = Ops
commonName = web.dongshi.com
emailAddress = webadmin@dongshi.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
CA:90:D4:89:72:AC:10:33:4C:F2:BC:E8:C9:A1:FD:32:78:8B:F1:59
X509v3 Authority Key Identifier:
keyid:5D:51:43:8D:89:13:72:9F:AF:33:3E:BD:4A:0B:2F:16:4B:D9:0E:B1

Certificate is to be certified until Oct 7 06:45:40 2019 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database w  

# scp /tmp/httpd.crt 192.168.184.142:/etc/httpd/ssl/  //在director上把簽署好的證書發給142

# scp -rp /etc/httpd/ssl/ 192.168.184.143:/etc/httpd  //在RS1(142)上,把ssl下的文件以及權限都複製給RS2 

root@192.168.184.143's password:

httpd.key 100% 887 875.6KB/s 00:00
httpd.csr 100% 708 764.7KB/s 00:00
httpd.crt 100% 3801 2.1MB/s 00:00

 

在RS1(142)上安裝mod_ssl,Apache若是使用數字證書的話都是使用的mod_ssl這個模塊

# yum install mod_ssl -y  兩臺都要裝

# vim /etc/httpd/conf.d/ssl.conf  //編輯配置文件,修改三處

DocumentRoot "/var/www/html"  //啓動虛擬主機的DocumentRoot

SSLCertificateFile /etc/pki/tls/certs/localhost.crt 修改成:

SSLCertificateFile /etc/httpd/ssl/httpd.crt

SSLCertificateKeyFile /etc/pki/tls/private/localhost.key  修改成:

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

# httpd -t  //檢查語法

# systemctl restart httpd

# scp /etc/httpd/conf.d/ssl.conf root@192.168.184.143:/etc/httpd/conf.d/ssl.conf //把修改好的ssl.conf文件賦值給RS2,並在RS2重啓httpd

# netstat -tunlp   //查看是否監聽443端口

以上證書配置完成 

在瀏覽器中輸入https://192.168.184.143,顯示不安裝鏈接,點擊高級,

再點擊添加例外

點擊確認安全例外

 便可查看網頁內容

四、接下來配置把443看成一個集羣服務來調度

在director(141)上操做,首先先把兩臺RS看成一個集羣服務,看是否能夠運行

 

# ipvsadm -C   //先清理出先前的規則,再添加規則
# ipvsadm -A -t 192.168.184.145:443 -s rr
# ipvsadm -a -t 192.168.184.145:443 -r 192.168.184.142 -g
# ipvsadm -a -t 192.168.184.145:443 -r 192.168.184.143 -g

在瀏覽器中輸入https://192.168.184.145/進行測試

# ipvsadm -L -n -c
IPVS connection entries
pro  expire  state         source                virtual               destination
TCP  00:05   FIN_WAIT      192.168.184.1:53031   192.168.184.145:443   192.168.184.143:443
TCP  00:40   FIN_WAIT      192.168.184.1:53034   192.168.184.145:443   192.168.184.142:443
TCP  14:56   ESTABLISHED   192.168.184.1:53038   192.168.184.145:443   192.168.184.142:443
TCP  01:49   FIN_WAIT      192.168.184.1:53037   192.168.184.145:443   192.168.184.143:443

通過測試,徹底沒有問題

下面把443服務定義成一種集羣來調度

# ipvsadm -C
# iptables-save > /etc/sysconfig/iptables   //把以前的iptables規則存儲起來

# vim /etc/sysconfig/iptables   //把80端口下方的22端口改成443

1 # Generated by iptables-save v1.4.21 on Sun Oct 7 15:42:36 2018
2 *mangle
3 :PREROUTING ACCEPT [3387:274859]
4 :INPUT ACCEPT [3387:274859]
5 :FORWARD ACCEPT [0:0]
6 :OUTPUT ACCEPT [1461:166692]
7 :POSTROUTING ACCEPT [1461:166692]
8 -A PREROUTING -d 192.168.184.145/32 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0xa/0xffffffff
9 -A PREROUTING -d 192.168.184.145/32 -p tcp -m tcp --dport 443 -j MARK --set-xmark 0xa/0xffffffff
10 COMMIT
11 # Completed on Sun Oct 7 15:42:36 2018
12 # Generated by iptables-save v1.4.21 on Sun Oct 7 15:42:36 2018
13 *nat
14 :PREROUTING ACCEPT [509:75999]
15 :INPUT ACCEPT [122:15141]
16 :OUTPUT ACCEPT [13:1274]
17 :POSTROUTING ACCEPT [13:1274]
18 COMMIT
19 # Completed on Sun Oct 7 15:42:36 2018

# iptables -t mangle -F   //清空以前的iptables規則
# iptables-restore < /etc/sysconfig/iptables   //並把上面存儲的iptables規則從新導入

# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)
target  prot  opt  source     destination
MARK    tcp   --   0.0.0.0/0  192.168.184.145 tcp dpt:80 MARK set 0xa
MARK    tcp   --   0.0.0.0/0  192.168.184.145 tcp dpt:443 MARK set 0xa

添加ipvsadm規則

# ipvsadm -A -f 10 -s rr
# ipvsadm -a -f 10 -r 192.168.184.142 -g
# ipvsadm -a -f 10 -r 192.168.184.143 -g

測試:瀏覽器輸入192.168.184.145便可訪問

  

測試:瀏覽器輸入https://192.168.184.145便可訪問

  

 把web server服務和443服務綁定在一塊兒以後呢?

假設一種場景,對web服務器來說須要session保持。一個在線購物網站,在購物時,若是不結帳,通常是http協議,當結帳時,須要網站跳轉,可能會在同一個域名下,可是協議必須自動轉換爲https協議。對於一個大型站點來說,不管是http或https背後都會有一大堆服務器及負載均衡。當訪問時原本是http協議被看成80這個服務被調度到real server1,等會付帳時把協議改爲了https協議了,和上次80服務的調度還有關係嗎?即http集羣服務和https集羣服務是同一種服務嗎?即使把兩種服務定義爲相同的防火牆標記,可是這兩個服務還是獨立的服務,只不過經過防火牆標記把它們綁定在一塊兒進行調度,可是兩個服務仍然在不一樣的RS上。

雖然有一種調度算法SH會把來自同一個客戶端的請求都發送至同一個RS,假如開始是使用http協議訪問,因而用戶請求第一次被調度到RS1上,但結帳時,協議轉爲https了,https和http不是同一種服務,因此不會放在同一個RS上進行調度,因此在協議轉換爲https時,請求可能被調度到RS2上。不一樣的服務維護的會話表是不同的。

解決方法:session保持三種方法:session集羣、session複製、session服務器,但這三種方法要依賴iptables之外的組件,因此可使用iptables持久鏈接的功能解決上述問題。

相關文章
相關標籤/搜索