1. 程式人生 > >LVS高級應用-利用防火墻標記分類報文

LVS高級應用-利用防火墻標記分類報文

.html 商品 iyu 環境 mark auto conf 調度 direct

實際生產中,我們可能會有多個不同的應用需要在同一個集群進行調度,此時需要借助於防火墻來分類報文,而後基於標記定義集群服務;可以將多個不同的應用使用同一個集群服務進行調度。例如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

#在Dorector主機基於標記定義集群服務:
ipvsadm -A -f NUMBER [options]

#示例:新增一個集群服務,基於防火墻標記進行劃分,調度方法為加權輪詢
ipvsadm -A -f 80443 -s wrr

實驗環境: (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 [email protected] /etc/nginx/ssl/ssl.key
scp ~/nginx/ssl.key [email protected]:/etc/nginx/ssl/ssl.key
scp ~/nginx/ssl.crt [email protected]:/etc/nginx/ssl/ssl.crt
scp ~/nginx/ssl.crt [email protected]:/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 [email protected]:~/

然後修改一下/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這個服務器上了。


LVS高級應用-利用防火墻標記分類報文