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

#在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 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这个服务器上了。


posted on 2019-02-12 15:02  向北00  阅读(448)  评论(0编辑  收藏  举报

导航