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

RSRIPVIP系统版本软件提供的服务
RS1192.168.253.129192.168.253.192CentOS6Nginxhttp,https
RS2192.168.253.140192.168.253.192CentOS7Nginxhttp,https

DR

DRDIPVIP系统版本软件提供的服务
DR192.168.253.128192.168.253.192CentOS7ipvsadm,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这个服务器上了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值