四层、七层负载均衡的区别  https://jaminzhang.github.io/lb/L4-L7-Load-Balancer-Difference/  

netfilter/iptables简介   https://segmentfault.com/a/1190000009043962

LVS使用防火墙标记实现多端口绑定服务  http://www.unixfbi.com/453.html

一,防火墙标记介绍

FirewallMark FWM 防火墙标记  一个集群服务(lvs-dr调度web server)可以将两个服务(如80/443/22等)绑定在一起调度

我们使用LVS/DR模式搭建web服务器的负载均衡,如果web服务器需要同时支持http和https的话,需要配置两套服务了,一套基于http的80端口,另一套基于https的443端口。配置两套有没有感觉维护起来比较麻烦。有没有其他的解决方案呢?答案是有的。下面我们来看看防火墙标记与LVS结合实现这一功能。

防火墙标记和lvs结合,可以让两个服务指向同一个集群,例如我们这里把80和443端口的服务都指向同一个集群。功能:将共享一组RS的集群服务统一进行定义。
通过FWM定义集群的方式步骤:
(1)在director上netfilter的mangle表的PREROUTING定义用于"打标"的规则

# iptables -t mangle -A PREROUTING -d $vip -p $protocol --dports $dport -j MARK --set-mark  $num

$vip是LVS的VIP地址,$dport是要访问本地的端口,$num是防火墙标记位。如果想让2个不同的端口当做同一个集群服务的话,这里的$num的值要一样。

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

# ipvsadm  -A  -f $num -s  scheduler

2、示例 (借助RIP、DIP、VIP都在同一网段,已经做好的LVS-DR模型)

(1)准备工作

# ipvsadm -L -n   //首先查看是否有ipvsadm的规则,如果有,则清空

# ipvsadm -C  //清空规则

# iptables -t mangle -L -n  //查看是否有iptables规则链,记得禁用firewalld

# iptables -t mangle -F   //如果有则清空

# iptables -t mangle -x

# iptables -t nat -x   //nat的规则也需要清理

# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)
target       prot opt source      destination

Chain INPUT (policy ACCEPT)
target       prot opt source      destination

Chain OUTPUT (policy ACCEPT)
target       prot opt source      destination

Chain POSTROUTING (policy ACCEPT)
target       prot opt source      destination

(2)定义iptables规则

# iptables -t mangle -A PREROUTING -d 192.168.184.145 -p tcp --dport 80 -j MARK --set-mark 10

//请求的是VIP,目标端口是80,都会打上标记10

# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)
target prot  opt  source     destination
MARK   tcp   --   0.0.0.0/0  192.168.184.145  tcp dpt:80 MARK set 0xa

(3)添加ipvsadm规则,基于FirewallMark定义LVS负载均衡集群

# ipvsadm -A -f 10 -s rr

# ipvsadm -a -f 10 -r 192.168.184.142 -g

# ipvsadm -a -f 10 -r 192.168.184.143 -g

(4)此时在浏览器中输入IP地址即可访问

这样的好处在于将两种集群定义成同一个来调度,以上的集群规则不变,将SSH服务做成负载均衡集群。

利用SSH服务连接192.168.184.145,此时请求的是director的VIP。

接下来在director上把SSH服务也定义为集群,并且和上面web服务(142/143)是同一个集群,需要添加一条iptables规则,即防火墙为10的目标端口再添加一个22端口就可以了,集群规则无需改变。

# iptables -t mangle -A PREROUTING -d 192.168.184.145 -p tcp --dport 22 -j MARK --set-mark 10 //当请求的服务目标端口是22时,会打上标记10

此时再用SSH服务登陆VIP:192.168.184.145:两张图片对比可知,虽然都是利用SSH服务请求的192.168.184.145,但返回的RIP地址是不一样的,这就FWM防火墙标记意义

3、下面配置同时调度80和443端口

配置https证书

(1)创建CA(在director上即192.168.184.141上创建)

# cd /etc/pki/CA

# (umask 077; openssl genrsa -out private/cakey.pem 2048)  //生成私钥

# touch index.txt

# echo 01 > serial

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365  //生成自签证书

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Dongshi
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.dongshi.com
Email Address []:

# ls -l

-rw-r--r--  1 root root 1326 Oct  7 14:24 cacert.pem

drwxr-xr-x. 2 root root 6 Aug 4 2017 certs 
drwxr-xr-x. 2 root root 6 Aug 4 2017 crl
-rw-r--r-- 1 root root 0 Oct 7 14:08 index.txt
drwxr-xr-x. 2 root root 6 Aug 4 2017 newcerts
drwx------. 2 root root 23 Oct 7 14:07 private
-rw-r--r-- 1 root root 3 Oct 7 14:08 serial

(2)为两个real server申请身份证书

# cd /etc/httpd

# mkdir ssl

# cd ssl

# (umask 077; openssl genrsa -out httpd.key 1024)  //生成私钥

# openssl req -new -key httpd.key -out httpd.csr  //

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Dongshi
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:web.dongshi.com
Email Address []:webadmin@dongshi.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# ll
total 8
-rw-r--r-- 1 root root 708 Oct 7 14:42 httpd.csr
-rw------- 1 root root 887 Oct 7 14:37 httpd.key

# scp httpd.csr root@192.168.184.141:/tmp  //发给CA

# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt  //在director(141)上CA签署证书

Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Oct 7 06:45:40 2018 GMT
Not After : Oct 7 06:45:40 2019 GMT
Subject:
countryName = CN
stateOrProvinceName = Beijing
organizationName = Dongshi
organizationalUnitName = Ops
commonName = web.dongshi.com
emailAddress = webadmin@dongshi.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
CA:90:D4:89:72:AC:10:33:4C:F2:BC:E8:C9:A1:FD:32:78:8B:F1:59
X509v3 Authority Key Identifier:
keyid:5D:51:43:8D:89:13:72:9F:AF:33:3E:BD:4A:0B:2F:16:4B:D9:0E:B1

Certificate is to be certified until Oct 7 06:45:40 2019 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database w

# scp /tmp/httpd.crt 192.168.184.142:/etc/httpd/ssl/  //在director上把签署好的证书发给142

# scp -rp /etc/httpd/ssl/ 192.168.184.143:/etc/httpd  //在RS1(142)上,把ssl下的文件以及权限都复制给RS2

root@192.168.184.143's password:

httpd.key 100% 887 875.6KB/s 00:00
httpd.csr 100% 708 764.7KB/s 00:00
httpd.crt 100% 3801 2.1MB/s 00:00

在RS1(142)上安装mod_ssl,Apache如果使用数字证书的话都是使用的mod_ssl这个模块

# yum install mod_ssl -y  两台都要装

# vim /etc/httpd/conf.d/ssl.conf  //编辑配置文件,修改三处

DocumentRoot "/var/www/html"  //启动虚拟主机的DocumentRoot

SSLCertificateFile /etc/pki/tls/certs/localhost.crt 修改为:

SSLCertificateFile /etc/httpd/ssl/httpd.crt

SSLCertificateKeyFile /etc/pki/tls/private/localhost.key  修改为:

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

# httpd -t  //检查语法

# systemctl restart httpd

# scp /etc/httpd/conf.d/ssl.conf root@192.168.184.143:/etc/httpd/conf.d/ssl.conf //把修改好的ssl.conf文件赋值给RS2,并在RS2重启httpd

# netstat -tunlp   //查看是否监听443端口

以上证书配置完成

在浏览器中输入https://192.168.184.143,显示不安装连接,点击高级,

再点击添加例外

点击确认安全例外

即可查看网页内容

4、接下来配置把443当作一个集群服务来调度

在director(141)上操作,首先先把两台RS当作一个集群服务,看是否可以运行

# ipvsadm -C   //先清理出先前的规则,再添加规则
# ipvsadm -A -t 192.168.184.145:443 -s rr
# ipvsadm -a -t 192.168.184.145:443 -r 192.168.184.142 -g
# ipvsadm -a -t 192.168.184.145:443 -r 192.168.184.143 -g

在浏览器中输入https://192.168.184.145/进行测试

# ipvsadm -L -n -c
IPVS connection entries
pro  expire  state         source                virtual               destination
TCP  00:05   FIN_WAIT      192.168.184.1:53031   192.168.184.145:443   192.168.184.143:443
TCP  00:40   FIN_WAIT      192.168.184.1:53034   192.168.184.145:443   192.168.184.142:443
TCP  14:56   ESTABLISHED   192.168.184.1:53038   192.168.184.145:443   192.168.184.142:443
TCP  01:49   FIN_WAIT      192.168.184.1:53037   192.168.184.145:443   192.168.184.143:443

经过测试,完全没有问题

下面把443服务定义成一种集群来调度

# ipvsadm -C
# iptables-save > /etc/sysconfig/iptables   //把之前的iptables规则存储起来

# vim /etc/sysconfig/iptables   //把80端口下方的22端口改为443

1 # Generated by iptables-save v1.4.21 on Sun Oct 7 15:42:36 2018
2 *mangle
3 :PREROUTING ACCEPT [3387:274859]
4 :INPUT ACCEPT [3387:274859]
5 :FORWARD ACCEPT [0:0]
6 :OUTPUT ACCEPT [1461:166692]
7 :POSTROUTING ACCEPT [1461:166692]
8 -A PREROUTING -d 192.168.184.145/32 -p tcp -m tcp --dport 80 -j MARK --set-xmark 0xa/0xffffffff
9 -A PREROUTING -d 192.168.184.145/32 -p tcp -m tcp --dport -j MARK --set-xmark 0xa/0xffffffff
10 COMMIT
11 # Completed on Sun Oct 7 15:42:36 2018
12 # Generated by iptables-save v1.4.21 on Sun Oct 7 15:42:36 2018
13 *nat
14 :PREROUTING ACCEPT [509:75999]
15 :INPUT ACCEPT [122:15141]
16 :OUTPUT ACCEPT [13:1274]
17 :POSTROUTING ACCEPT [13:1274]
18 COMMIT
19 # Completed on Sun Oct 7 15:42:36 2018

# iptables -t mangle -F   //清空之前的iptables规则
# iptables-restore < /etc/sysconfig/iptables   //并把上面存储的iptables规则重新导入

# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)
target  prot  opt  source     destination
MARK    tcp   --   0.0.0.0/0  192.168.184.145 tcp dpt:80 MARK set 0xa
MARK    tcp   --   0.0.0.0/0  192.168.184.145 tcp dpt:443 MARK set 0xa

添加ipvsadm规则

# ipvsadm -A -f 10 -s rr
# ipvsadm -a -f 10 -r 192.168.184.142 -g
# ipvsadm -a -f 10 -r 192.168.184.143 -g

测试:浏览器输入192.168.184.145即可访问

  

测试:浏览器输入https://192.168.184.145即可访问

  

把web server服务和443服务绑定在一起之后呢?

假设一种场景,对web服务器来讲需要session保持。一个在线购物网站,在购物时,如果不结账,一般是http协议,当结账时,需要网站跳转,可能会在同一个域名下,但是协议必须自动转换为https协议。对于一个大型站点来讲,无论是http或https背后都会有一大堆服务器及负载均衡。当访问时本来是http协议被当作80这个服务被调度到real server1,等会付账时把协议改成了https协议了,和上次80服务的调度还有关系吗?即http集群服务和https集群服务是同一种服务吗?即便把两种服务定义为相同的防火墙标记,但是这两个服务仍是独立的服务,只不过通过防火墙标记把它们绑定在一起进行调度,但是两个服务仍然在不同的RS上。

虽然有一种调度算法SH会把来自同一个客户端的请求都发送至同一个RS,假如开始是使用http协议访问,于是用户请求第一次被调度到RS1上,但结账时,协议转为https了,https和http不是同一种服务,所以不会放在同一个RS上进行调度,所以在协议转换为https时,请求可能被调度到RS2上。不同的服务维护的会话表是不一样的。

解决方法:session保持三种方法:session集群、session复制、session服务器,但这三种方法要依赖iptables以外的组件,所以可以使用iptables持久连接的功能解决上述问题。

5、lvs使用进阶(01)的更多相关文章

  1. SQL Server 进阶 01 数据库的设计

    SQL Server 进阶 01 数据库的设计 本篇目录 课程内容回顾及介绍 为什么需要规范的数据库设计 设计数据库的步骤 绘制E-R(实体-关系)图 实体-关系模型 如何将E-R图转换为表 数据规范 ...

  2. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  3. lvs使用进阶

    之前lvs基础篇(https://www.cnblogs.com/ckh2014/p/10855002.html)中介绍了lvs-dr的搭建,下面我们再复习一下,架构如下: 相关配置 director ...

  4. Python进阶01 词典

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 基础教程介绍了基本概念,特别是对象和类. 进阶教程对基础教程的进一步拓展,说明Py ...

  5. Java进阶01 String类

    链接地址:http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html 作者:Vamei 出处:http://www.cnblogs.com ...

  6. 6、lvs使用进阶(02)

    把web server服务和443服务绑定在一起之后呢? 假设一种场景,对web服务器来讲需要session保持.一个在线购物网站,在购物时,如果不结账,一般是http协议,当结账时,需要网站跳转,可 ...

  7. python进阶01

    基础部分python学完,咱们可以深入了解下python高阶知识点,让我们一起来学习吧! 1.面向对象进阶 1)元类 1.1.1:python创建类原理 python创建类: class Object ...

  8. MVC知识进阶01

    下面是在项目中有关于MVC的知识总结,有些地方若不对,请指出. 一:MVC的基本知识 1 名词解释    *惯例优先原则<约定大于配置>:是一种开发设计模式,说是在项目里面使用事先规定的命 ...

  9. ES进阶--01

    第2节结构化搜索_在案例中实战使用term filter来搜索数据 课程大纲 1.根据用户ID.是否隐藏.帖子ID.发帖日期来搜索帖子 (1)插入一些测试帖子数据 POST /forum/articl ...

随机推荐

  1. 批量下载网站图片的Python实用小工具(下)

    引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...

  2. 20165305 Linux安装及学习

    一.虚拟机的安装 在根据老师所给的<基于VirtualBox虚拟机安装Ubuntu图文教程>的时候,我发现虚拟化处于被禁用状态,于是我在网上查找了一下解决办法,在我将bios中虚拟化设置为 ...

  3. 20165305 学习基础和C语言基础调查

    学习基础和C语言基础调查 <优秀的教学方法---做教练与做中学>心得 在<优秀的教学方法---做教练与做中学>文章中又一次提到了"做教练"这一学习方法,因为 ...

  4. iOS项目之报错笔记

    问题一: linker command failed with exit code 1 (use -vto see invocation) 原因:导入了.m的头文件,导致同时有两个一样的.m文件在编译 ...

  5. #mxnet# 权值共享

    https://www.cnblogs.com/chenyliang/p/6847744.html Note:后记此权值共享非彼卷积共享.说的是layer实体间的参数共享. Introduction ...

  6. window JNI_CreateJavaVM启动java程序

    https://blog.csdn.net/earbao/article/details/51889605 #define _CRT_SECURE_NO_WARNINGS 1       #inclu ...

  7. openstack components internal relations

    1.  各个组件之间可以互相调用(都是common sense) conductor 负责DB的操作. 各个组件之间通过RPC, 序列化通过oslo_versionedobjects. 2. 具体调用 ...

  8. qtquickcontrols2控件集(使用参考重构)

           随着Qt的版本升级,其自带的controls控件库也不断升级,目前已经到了2.3的版本.本文通过重构并且解读Qt自带的gallery例程,说明新版本controls控件库的相关特性 来自 ...

  9. bzoj 3875 骑士游戏 - spfa - 动态规划

    Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,J ...

  10. javaScript中ajax、axios总结

    一.原生js实现ajax请求: 步骤: get请求: // 1.创建一个XMLHttpRequest的对象. var xml=null; //初始值设为空 if(XMLHttpRequest){ xm ...