LVS高階應用-藉助防火牆標記分類報文

十五十六發表於2018-09-11

有時候會有一種需求,將多個不同的應用用同一個叢集進行排程。比如http 和 https是兩個叢集服務。訪問電商網站瀏覽商品的時候使用的是http連結。但是如果要購買的時候會跳轉到https連結。但是https和http不是同一個叢集服務。如果跳轉到不是同一臺主機。會話就沒辦法保持。可能這時候商品就沒了,這時候怎麼辦?我們就可以藉助防火牆打標機來分類報文,將http和https當作同一個叢集服務,來做會話保持。

方法:

#打標記方法(在Director主機):
iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 

#示例:將目的ip是192.168.253.192,目的埠是80和443的資料包都打上80443的標記
iptables -t mangle -A PREROUTING -d 192.168.253.192   -p tcp -m multiport --dport 80,443  -j MARK --set-mark 80443

#基於標記定義叢集服務:
ipvsadm -A -f NUMBER [options]

#示例:新增一個叢集服務,基於防火牆標記進行劃分,排程方法為輪詢
ipvsadm -A -f 80443 -s rr

實驗環境:
RS

RS RIP VIP 系統版本 軟體 提供的服務
RS1 192.168.253.129 192.168.253.192 CentOS6 Nginx http,https
RS2 192.168.253.140 192.168.253.192 CentOS7 Nginx http,https

DR

DR DIP VIP 系統版本 軟體 提供的服務
DR 192.168.253.128 192.168.253.192 CentOS7 ipvsadm,iptables 四層負載均衡

LVS使用的模式:DR

第一步:RS1端安裝Nginx

#新增阿里景象站的epel源,不同的系統方式不一樣,RS1是CentOS6系統
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
#yum安裝Nginx
yum install nginx -y
mkdir /etc/nginx/ssl

第二步:RS2端安裝Nginx

#新增阿里景象站的epel源,不同的系統方式不一樣,RS2是CentOS7系統
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#yum安裝Nginx
yum install nginx -y
mkdir /etc/nginx/ssl

第三步:在DR伺服器上自建CA,並簽發證照

#自建CA
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
 openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
touch /etc/pki/CA/{serial,index.txt}
echo 01 > /etc/pki/CA/serial
#簽發證照,域名為www.ice.com
mkdir -pv  ~/nginx
(umask 077; openssl genrsa -out ~/nginx/ssl.key 2048)
openssl  req -new -key ~/nginx/ssl.key  -out ~/nginx/ssl.csr -days 365 
openssl ca -in ~/nginx/ssl.csr  -out ~/nginx/ssl.crt

第四步:將DR簽發的證照,分發到RS1和RS2的/etc/nginx/ssl目錄中

scp ~/nginx/ssl.key  root@192.168.253.140 /etc/nginx/ssl/ssl.key
scp ~/nginx/ssl.key  root@192.168.253.129:/etc/nginx/ssl/ssl.key
scp ~/nginx/ssl.crt  root@192.168.253.140:/etc/nginx/ssl/ssl.crt
scp ~/nginx/ssl.crt  root@192.168.253.129:/etc/nginx/ssl/ssl.crt

第五步:修改RS1和RS2的nginx配置檔案,配置http和https連線
RS1端配置

mkdir -pv /var/www/html/{http,https}
echo "192.168.253.129:80">/var/www/html/http/index.html
echo "192.168.253.129:443">/var/www/html/https/index.html

nginx配置檔案

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        root         /var/www/html/http;
        location / {
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       443 ssl;
        server_name  www.ice.com;
        ssl_certificate      /etc/nginx/ssl/ssl.crt;
        ssl_certificate_key  /etc/nginx/ssl/ssl.key;
        ssl_session_cache    shared:SSL:1m;
    }
}

RS2端配置

mkdir -pv /var/www/html/{http,https}
echo "192.168.253.140:80">/var/www/html/http/index.html
echo "192.168.253.140:443">/var/www/html/https/index.html

nginx配置檔案

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /var/www/html/http;
        include /etc/nginx/default.d/*.conf;
        location / {
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    server {
        listen       443 ssl http2 default_server;
        root         /var/www/html/https;
        ssl_certificate "/etc/nginx/ssl/ssl.crt";
        ssl_certificate_key "/etc/nginx/ssl/ssl.key";
        ssl_session_cache shared:SSL:1m;
    }
}

第六步:在RS1和RS2上修改核心引數,設定VIP

ifconfig lo:0 192.168.253.192/32   up
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

第七步:DR:配置VIP,藉助防火牆做標記,將http和https當作同一個叢集

ifconfig ens33:0 192.168.253.192 up
iptables -F
iptables -t mangle -A PREROUTING -d 192.168.253.192   -p tcp -m multiport --dport 80,443  -j MARK --set-mark 80443
ipvsadm -A -f 80443 -s rr
ipvsadm -a -f 80443 -r 192.168.253.129 -g 
ipvsadm -a -f 80443 -r 192.168.253.140 -g

第八步:測試
我們在這幾臺伺服器之外重新開了一臺伺服器,假裝使用者,ip為192.168.253.158,需要將自建的CA檔案傳送過去

##DR端操作
scp /etc/pki/CA/cacert.pem  root@192.168.253.158:~/

然後修改一下/etc/hosts檔案

#假裝使用者的伺服器修改/etc/hosts
#新增一條
192.168.253.192  www.ice.com 

然後可以訪問測試了
這裡寫圖片描述
這裡可以看出。將80和443當作一個叢集服務,所以進行輪詢第一次是訪問192.168.253.140的80埠。第二次則訪問192.168.253.129的443埠。這樣一直下去。

第九步:修改DR上的ipvsadm的排程演算法。
修改排程演算法為sh,進行ip繫結,讓相同主機訪問的伺服器是同一個,這樣就可以在http切換https的時候也會在同一個伺服器達到會話保持的目的。

#DR端
ipvsadm -E -f 80443 -s sh

第十步:再次測試
我們修改了排程方法之後再次測試
這裡寫圖片描述
現在可以看到全部都繫結在了192.168.253.140這個伺服器上了。

相關文章