基于DR模型的持久防火墙标记数据包集群配置及测试脚本的执行

lvs-DR  IP路由
      工作特征: 
        集群节点必须在同一个物理网络中,不能跨越交换机
        RIP可使用公网地址
        Director仅处理入站请求 
        realserver网关不能处理Director 所以出站响应不经过Director
        不支持端口映射
        realserver支持大多数操作系统
        Director性能优于nat模型     
Director的调度方法
   fixed sckeduling 静态调度
   RR 轮调
   WRR 加权轮调
   Destination hashing 目标地址hash 一般用于缓存服务器将同一                                     个ip的请求,发往同一个server中
               SH
     Dynamic Scheduling 动态调度  追踪当前处于活动连接和非活动状态的连接的 节点
      Least-connection(LC)最少连接
        RS:active*256+inactive=overhead
        Director计算出overhead值小的RS优先响应
      WLC  加权最少连接  默认方法
        (active*256+inactive)/Weight=overhead
      SED Shrotest Expected Delay 
         (active+1)*256/Weight=overhead  将第一次请求交给性能最好的RNever Queue(NQ)                                             
持久防火墙标记
   在实际应用中会有这样的问题,用户在网上购物时,将购物车的数据会被保存在某个RealServer中,当断开网页连接到https协议的网上银行结账时,发现是个新的连接请求,可能Director会分配给client另一个Realserver中去,这此Realserver不会知道购物车中的数据。那么Director为了能够保证连接的持久性,需要为80和443做统一的端口映射,这样就实现了数据不会丢失,又保证了结账的安全性
实验拓扑结构:
 

RealServer1(172.16.21.21)
首先为它搭建LNMP平台  并开启ssl功能在RealServer2中是同样的做法
为Nginx开启ssl功能并能在ssl中支持php功能的方法:
编辑 nginx.conf
添加如下内容
 
  1. server { 
  2.       listen       443; 
  3.       server_name  www.magedu.com; 
  4.  
  5.       ssl                  on; 
  6.       ssl_certificate      ssl/RC1.crt;  //这里的证书需要想CA服务器申请颁发 并cp到本地/etc/nginx/ssl目录中  也可以指定绝对路径 
  7.       ssl_certificate_key  ssl/RC1.key;   
  8.    
  9.       ssl_session_timeout  5m; 
  10.    
  11.       location ~ \.php$ { 
  12.           root           html; 
  13.           fastcgi_pass   127.0.0.1:9000; 
  14.           fastcgi_index  index.php; 
  15.           fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 
  16.           fastcgi_param HTTPS on;       
  17.           include        fastcgi_params; 
  18.       } 
  19.       location / { 
  20.           root   html; 
  21.           index index.php index.html index.htm; 
  22.       } 
  23.   } 
 
做好准备工作后,执行以下脚本,脚本内容如下:
 
  1. echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore 
  2. echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore 
  3. echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce 
  4. echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce 
  5. ifconfig lo:0 172.16.21.100 broadcast 172.16.21.100 netmask 255.255.255.255 up 
  6. route add -host 172.16.21.100 dev lo:0 
 
解释一下脚本意思 ,因为linux系统对把ip当成是系统资源而不是网卡资源,当主机中有多块网卡时,对于arp解析请求,
系统就会默认将ip与mac的映射关系全部通告出去。
arp-ignore    定义在响应别人的arp广播请求时所使用的不同的模型
0 (DEFAULT) 
1 只响应目标IP地址与自己是同一个网段的arp请求
arp-annoance  定义不同的限制级别通过某个接口通告源ip的ARP
   0(DEFAULT) 将任意本地地址,向外通告
   1 当有多个IP地址时,当处理arp请求时,试图响应的是同一网络的arp请求所对应的ip地址
   2  一定响应的是同一网络的arp请求
 
这样就保证了Realserver的出站的数据包在ip头部中定义的源地址为client所请求的目标ip
 
Director(172.16.21.1) 中的配置
  1. #ifconfig eth0:1 172.16.21.100 broarcast 172.16.21.100 netmask 255.255.255.255 up 
  将eth0:1定义为VIP
  
  1. #iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 172.16.21.100 --dport 80 -j MARK --set-mark 20 
  2. #iptables -t mangle -A PREROUTING -i eth0 -p tcp -d 172.16.21.100 --dport 443 -j MARK --set-mark 20 
因为是基于防火墙的,需要在mangle表PREROUTING链做端口标记  
  1. #ipvsadm -A -f 20 -s wlc -p 1200 
  2. #ipvsadm -a -f 20 -r 172.16.21.21 -g -w 3 
  3. #ipvsadm -a -f 20 -r 172.16.21.22 -g -w 2 
  将Realserver1和Realserver2添加进来
 
 
  脚本: 
  1. A=172.16.21.21  
  2. B=172.16.21.22  
  3. elinks -dump $A/a.index >/tmp/21.txt  
  4. elinks -dump $B/a.index >/tmp/22.txt  
  5.   
  6.  if grep 'ok' /tmp/21.txt ;then  
  7.         if ipvsadm -L |grep $A &>/dev/null;then  
  8.         sleep 1;  
  9.         else  
  10.         ipvsadm -a -f 20 -r $A -g -w 3  
  11.         fi  
  12. else  
  13. ipvsadm -d -f 20 -r $A  
  14. fi  
  15. if grep 'ok' /tmp/22.txt ;then  
  16.         if ipvsadm -L |grep $B &>/dev/null;then  
  17.         sleep 1;  
  18.         else  
  19.         ipvsadm -a -f 20 -r $B -g -w 3  
  20.         fi  
  21. else  
  22. ipvsadm -d -f 20 -r $B  
  23. fi  
 
实验结果测试:
 
1.打开浏览器输入https:172.16.21.100
  

 

2.我们关掉172.16.21.22这台服务器,在访问172.16.21.100
 

我们执行上面的测试脚本:
 

再访问172.16.21.100
 

Director检测结果