LVS高级应用-借助防火墙标记分类报文

有时候会有一种需求,将多个不同的应用用同一个集群进行调度。比如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这个服务器上了。

猜你喜欢

转载自blog.csdn.net/L835311324/article/details/82634215