FWM及LVS持久连接

FWM防火墙标记

为什么使用防火墙标记?

将来自于同一个客户端的所有请求都定义到同一个realserver上;如使用防火墙标记将443和80定义为同一个集群服务,这样就可以实现统一调度到后端的real server。

比如:在电商站点中,如果往购物车中添加商品之后,需要付款;这个时候就需要访问direction,发起的连接就不是http,而是https,direction会认为这是一个新的连接,很可能会被分配到其他RS服务器,这个时候购物车中就没有了商品。为了解决这种问题,就需要把用户的http请求和https请求,都调度到同一台服务器。


防火墙标记在什么时候打?

当用户请求报文进行防火墙(PREROUTING),防火墙就将特定报文(如:443和80),打上标记,假设标记为10;LVS设置的时候,就可以根据标记进行设置,只要请求带有标记10,就会将请求调度到同一个RS服务器

 

定义方法:

(1)  打标:在direction上的mangle表的PREROUTING链上实现

语法: iptables -t mangle -A PREROUTING-d $vip -p $protocol --dport $port -j MARK --set-mark [1-99]

(2)  基于FWM定义集群服务

# ipvsadm -A -f FWM -s SCHEDULER

     # ipvsadm -a -f FWM -rserver-address -g|-i|-m -w #

实例配置:

说明:我是使用LVS-DR配置的集群服务环境,已经配置ok。


对用户请求打标记:将访问集群的80端口的报文,定义标记为10.

[root@LVS ~]# iptables -t mangle -A PREROUTING -d 172.16.4.1 -p tcp --dport 80 -j MARK --set-mark 10
[root@LVS ~]# iptables -t mangle -L -n  
Chain PREROUTING (policy ACCEPT)
target    prot opt source              destination        
MARK      tcp  --  0.0.0.0/0            172.16.4.1          tcp dpt:80 MARK set 0xa

定义集群服务,这个时候VIP地址和端口,就可以使用防火墙标记代替了。

[root@LVS ~]# ipvsadm �CC    #清除之前DR设置的集群服务
[root@LVS ~]# ipvsadm -A -f 10 -s rr
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.101 -g-w 1
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.102 -g-w 1

这个时候访问集群服务和之前DR设置的效果是一模一样的。

443和80一起打标,在下面和PFWM一起设置的。


持久连接

持久连接的作用:无论使用哪一种调度方法,持久连接功能都能保证在指定时间范围之内,将来在于同一个IP的请求始终被定向至同一个RS;

和sh调度比较的优点:

sh:会一直将一个用户请求定义到一个后端server,不会考虑后端服务器状态。

持久连接:第一次会根据设置的调度算法(rr,wlc……)调度到后端,在指定的会话存活时间使用持久连接,会话存活时间到期之后,还是根据调度算法进行调度。

 

persistencetemplate:持久连接模板:将多个集群服务归并到一起统一调度

    PPC:每端口持久;持久连接生效范围仅为单个集群服务;如果有多个集群服务,每服务被单独持久调度;

    PCC:每客户端持久;持久连接生效范围为所有服务;定义集群服务时,其TCP或UDP协议的目标端口要使用0;

    PFWM:每FWM持久:持久连接生效范围为定义为同一个FWM下的所有服务;

 

lvspersistence语法:

       ipvsadm-A -t|-u|-f service-address -s SCHEDULER -p [#]

       无-p选项:不启用持久连接

       -p #:指定持久时长,省略时长,默认为360秒    

定义一个PPC持久连接的服务

调度器配置

清除之前定义的规则

[root@LVS ~]# iptables -t mangle -F
[root@LVS ~]# ipvsadm -C

设置持久连接规则

[root@LVS ~]# ipvsadm -A -t 172.16.4.1 -s rr -p
[root@LVS ~]# ipvsadm -a -t 172.16.4.1 -r172.16.4.101 -g
[root@LVS ~]# ipvsadm -a -t 172.16.4.1 -r172.16.4.102 -g
[root@LVS ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  ->RemoteAddress:Port           ForwardWeight ActiveConn InActConn
TCP 172.16.4.1:0 rr persistent 360   #表示启用了持久连接功能
  ->172.16.4.101:0               Route   1     0          0        
  ->172.16.4.102:0               Route   1     0          0

设置完成之后,客户端访问集群服务将会被始终调度到同一台RS服务器

PCC持久连接

在RS服务器上面安装telnet-server

[root@WEB-01 ~]# yum -y install telnet-server
[root@WEB-01 ~]# chkconfig telnet on
[root@WEB-01 ~]# service xinetd start
[root@WEB-01 ~]# useradd pcc
[root@WEB-01 ~]# echo "pcc" | passwd--stdin pcc 
[root@WEB-02 ~]# yum -y install telnet-server
[root@WEB-02 ~]# chkconfig telnet on
[root@WEB-02 ~]# service xinetd start
[root@WEB-02 ~]# useradd pcc
[root@WEB-02 ~]# echo "pcc" | passwd--stdin pcc

Direction定义集群

[root@LVS ~]# ipvsadm -A -t 172.16.4.1:0 -s rr -p
[root@LVS ~]# ipvsadm -a -t 172.16.4.1:0 -r172.16.4.101 -g 
[root@LVS ~]# ipvsadm -a -t 172.16.4.1:0 -r172.16.4.102 -g

访问集群看到的是WEB-02服务器,那么使用telnet连接一定还是web-02。

wKiom1VnQCyxo-4JAAC8ftcGlxc347.jpg

telnet连接集群

Xshell:\> telnet 172.16.4.1
Connecting to 172.16.4.1:23...
Connection established.
Escape character is '^@]'.
CentOS release 6.6 (Final)
Kernel 2.6.32-504.el6.x86_64 on an x86_64
login: pcc
Password:
[pcc@localhost ~]$ ifconfig
eth0     Link encap:Ethernet  HWaddr00:0C:29:91:F6:60 
         inet addr:172.16.4.102 Bcast:172.16.255.255 Mask:255.255.0.0


PFWM持久连接

实现将同一个用户的80端口访问请求和443端口访问请求定义到同一台web服务器。

创建CA私有CA,及http证书申请

由于主机数量有限,在lvs上面创建私有CA

[root@LVS ~]# cd /etc/pki/CA/
[root@LVS CA]# (umask 077;openssl genrsa -outprivate/cakey.pem 2048)
[root@LVS CA]# openssl req -new -x509 -keyprivate/cakey.pem -out cacert.pem -days 3650
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default CompanyLtd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server'shostname) []:ca.test.com
Email Address []:[email protected]
[root@LVS CA]# touch serial index.txt
[root@LVS CA]# echo 01 > serial

WEB-01申请证书

[root@WEB-01 ~]# cd /etc/httpd/conf
[root@WEB-01 conf]# mkdir ssl
[root@WEB-01 conf]# cd ssl/
[root@WEB-01 ssl]# (umask 077; openssl genrsa -out httpd.key1024)
[root@WEB-01 ssl]# openssl req -new -key httpd.key-out httpd.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default CompanyLtd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server'shostname) []:www.lvs.com
Email Address []:[email protected]
A challenge password []:
An optional company name []:

复制证书到CA

[root@WEB-01 ssl]# scp httpd.csr [email protected]:/root/

CA签署证书

[root@LVS ~]# openssl ca -in httpd.csr -outhttpd.crt -days 3650
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit?[y/n]y

将申请好的证书重新传给WEB-01

[root@LVS ~]# scp httpd.crt [email protected]:/etc/httpd/conf/ssl/

配置httpds

说明:WEB-01和WEB-02使用的证书是同一个;不需要在两个节点重复申请,只需要在一个节点创建完成,将证书复制到第二个节点即可。

 

安装mod_ssl模块(如果不安装此模块,则没有ssl.conf的配置文件)

[root@WEB-01 ~]# yum -y install mod_ssl

设置https

DocumentRoot "/var/www/html"
SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key

启动服务查看是否监听443端口

[root@WEB-01 ~]# service httpd restart
[root@WEB-01 ~]# netstat -lnt | grep 443
tcp       0      0 :::443                      :::*                        LISTEN

复制ssl目录到WEB-02

[root@WEB-01 ~]# scp -rp /etc/httpd/conf/ssl/[email protected]:/etc/httpd/conf/

这个时候还不能直接复制,ssl配置文件,因为WEB-02还没有安装mod_ssl

web-02安装mod_ssl

[root@WEB-02 ~]# yum -y install mod_ssl

复制ssl配置文件

[root@WEB-01 ~]# scp /etc/httpd/conf.d/[email protected]:/etc/httpd/conf.d/ssl.conf

Web-02重启httpd服务,已经监听443端口了

[root@WEB-02 ~]# service httpd restart
[root@WEB-02 ~]# netstat -lnt | grep 443
tcp       0      0 :::443                      :::*                        LISTEN

lvs设置FWM持久连接

LVS设置,先不需要设置持久连接,测试https是否可以正常调度

[root@LVS ~]# iptables -t mangle -A PREROUTING -d172.16.4.1 -p tcp --dport 80 -j MARK --set-mark 10
[root@LVS ~]# iptables -t mangle -A PREROUTING -d172.16.4.1 -p tcp --dport 443 -j MARK --set-mark 10  
[root@LVS ~]# ipvsadm -A -f 10 -s rr
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.101 -g
[root@LVS ~]# ipvsadm -a -f 10 -r 172.16.4.102 -g

验证:确保访问http和https都是负载均衡。

修改为持久连接,保证无论冲http协议,切换到https协议,还是https协议切换到http协议都是同一台主机。

[root@LVS ~]# ipvsadm -E -f 10 -s rr -p

使用http访问是WEB-02响应

wKioL1VnQcqS53olAACucqWHWOQ709.jpg

切换到https访问还是WEB-02响应

wKioL1VnQdHAE0BPAACd3w4VRhc109.jpg

说明:这里的访问https报证书错误是我没有安装CA的证书。


你可能感兴趣的:(持久连接,防火墙标记)