前一节已经介绍了 LVS 的原理及各个配置模型,是时候该玩玩它了。如有疑问,请看上一节:LVS 配置小结。
一,ipvsadm 的使用
ipvsadm ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address]
集群服务相关
-A: 添加一个集群服务
-t: tcp
-u: udp
-f: firewall mark,防火墙标记,通常用于将两个或以上的服务绑定为一个服务进行处理时使用,例如http和https;
service-address:
-t IP:port
-u ip:port
-f firewall_mark
-s 调度方法,rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默认为wlc;
-p timeout: persistent connection, 持久连接
-E:修改定义过的集群服务
-D -t|u|f service-address:删除指定的集群服务
RS相关:
-a:向指定的CS中添加RS
-t|-u|-f service-address:指明将RS添加至哪个Cluster Service中
-r: 指定RS,可包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口
LVS类型:
-g: Gateway, DR 默认为DR类型
-i: ipip, TUN
-m: masquerade, NAT
指定RS权重:
-w –weight 真实服务器的权值,默认为1。
-e: 修改指定的RS属性
-d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS
清空所有的集群服务:
-C(大写)
保存规则:(使用输出重定向)
ipvsadm-save 或 ipvsadm -S
载入指定的规则:(使用输入重定向)
ipvsadm-restore 或 ipvsadm -R
查看ipvs规则等:
-L [options]
-n: 数字格式显示IP地址
-c: 显示连接数相关信息
–stats: 显示统计数据,选项是统计自该条转发规则生效以来的
Conns (connections scheduled) 已经转发过的连接数
InPkts (incoming packets) 入包个数
OutPkts (outgoing packets) 出包个数
InBytes (incoming bytes) 入流量(字节)
OutBytes (outgoing bytes) 出流量(字节
–rate: 速率
–exact:显示统计数据的精确值
-Z: 计数器清零;
二,LVS NAT模型的实现
1. 集群环境: 一台Director, 两台后端Real Server RS1,RS2
Director: 两网卡 eth1: 192.168.0.33/24 eth2: 172.16.12.1/24 eth1:1: 192.168.0.200/24 作为VIP地址 RS1: eth1: 172.16.12.11 RS2: eth1: 172.16.12.12 Director的eth0为桥接,eth1和RS1,RS2的eth0使用仅主机模式。在RS1和RS2上使用仅主机模式前先分别安装好LAMP的环境,并设置好测试页面。
2,配置网络
配置RS1: [root@localhost html]# ifconfig eth1 172.16.12.11/24 [root@localhost html]# route add default gw 172.16.12.1 配置RS2: [root@localhost html]# ifconfig eth1 172.16.12.12/24 [root@localhost html]# route add default gw 172.16.12.1 在 Director 上的配置: [root@localhost ~]# yum install ipvsadm -y #安装客户端工具 [root@localhost ~]# ifconfig eth2 172.16.12.1/24 [root@localhost ~]# ifconfig eth1:1 192.168.0.200 #添加VIP [root@localhost ~]# iptables -F [root@localhost ~]# iptables -t filter -F [root@localhost ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@localhost ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
3. 修改内核参数,开启转发功能
[root@localhost ~]# vim /etc/sysctl.conf #打开转发功能 net.ipv4.ip_forward = 1 [root@localhost ~]# sysctl -p #使其生效
4. 验证RS1和RS2上面创建的测试页
[root@localhost ~]# curl 172.16.12.11 web1 172.16.12.11 [root@localhost ~]# curl 172.16.12.12 web2 172.16.12.12
5. 在Director上添加集群服务
[root@localhost ~]# ipvsadm -A -t 192.168.0.200:80 -s rr #创建一个集群服务 [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.35:80 rr [root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.12.11 -m #-m类型,默认wlc [root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.12.12 -m [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 rr -> 172.16.12.11:80 Masq 1 0 8 -> 172.16.12.12:80 Masq 1 0 8
好了,LVS的NAT模型就这样配置完成了,然后到浏览器中进行访问:
二,LVS DR模型的实现
1. 集群环境: 一台Director, 两台Real Server RS1,RS2,此次使用较简单的配置方法,三个主机都使用桥接模式
Director: 两网卡 eth1: 192.168.0.33/24 eth1:0 : 192.168.0.200/24 作为VIP地址,可以进行浮动 RS1: eth1: 192.168.0.23 RS2: eth1: 192.168.0.24
2,配置网络
配置Dircector [root@localhost ~]# ifconfig eth1:0 192.168.0.200 up #配置VIP [root@localhost ~]# route add -host 192.168.0.200 dev eth1:0 配置RS1,修改内核参数,关闭lo的arp通告和lo的arp响应,并配置隐藏地址,并且保证其发出报文经过eth1之前,还要先经过lo:1 VIP, 使得源地址成为VIP [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce [root@localhost ~]# ifconfig lo:0 192.168.0.200 netmask 255.255.255.255 broadcast 192.168.0.200 up [root@localhost ~]# route add -host 192.168.0.200 dev lo:0 配置RS2: [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce [root@localhost ~]# echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce [root@localhost ~]# ifconfig lo:0 192.168.0.200 netmask 255.255.255.255 broadcast 192.168.0.200 up #只广播自己 [root@localhost ~]# route add -host 192.168.0.200 dev lo:0 #目标是192.168.0.200时经过设备lo:0
3,在Director上添加集群服务
[root@localhost ~]# ipvsadm -A -t 192.168.0.200:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.23 -g -w 1 #使用权重1 [root@localhost ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.24 -g -w 3 #使用权重3
4,在浏览器中进行测试,但是此配置中为RS1和RS2设置了权重,所以转发到后的RS时,响应的次数为3:1。
三,LVS 持久连接
PCC:将来自于同一个客户端发往VIP的所有请求统统定向至同一个RS;
PPC:将来自于一个客户端发往某VIP的某端口的所有请求统统定向至同一个RS;
PFMC: 端口绑定,port affinity,基于防火墙标记,把多个端口持久连接到后端同一台服务器上,例如http和https;
应用场景如:在基于SSL,需要用到持久连接;后端服务器有session应用时,比如用户登录,这时多个后端服务器session共享问题无法解决时,需要持久连接到同一个后端服务器。
1,使用 PPC
继续接着上面DR的配置进行:
[root@localhost ~]# ipvsadm -E -t 192.168.0.200:80 -s rr -p 120 #修改为使用持久连接模式,设置连接保持120秒
然后进行测试可以看到始终被定向至同一服务器。
[root@localhost ~]# ipvsadm -L -n --persistent-conn #显示持久连接
2,使用 PCC
此次实验使用80和22端口进行测试,同一客户端访问80和22端口时会被定向值同一台RS。
[root@localhost ~]# ipvsadm -C #清除所有规则 [root@localhost ~]# ipvsadm -A -t 192.168.0.200:0 -s rr -p 300 #:0表示使用所有端口 [root@localhost ~]# ipvsadm -a -t 192.168.0.200:0 -r 192.168.0.23 -g [root@localhost ~]# ipvsadm -a -t 192.168.0.200:0 -r 192.168.0.24 -g [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:0 rr persistent 300 -> 192.168.0.23:0 Route 1 0 0 -> 192.168.0.24:0 Route 1 0 0
在浏览器中查看访问对80端口请求定向的主机,并且使用 ssh 连接192.168.0.200查看所定向的主机两者是否一致。在我的测试中,两者是同一个RS。
3,使用PFMC
将多个服务绑定在一起是为了让客户端在请求不同服务时依然能保持会话信息,以下将把http和https绑定为同一服务。使用https前需要启用ssl服务,以下将使用私有CA进行认证。
[root@localhost ~]# yum install mod_ssl -y #首先在各RS上安装ssl模块
在Director上创建私有CA:
[root@localhost ~]# vim /etc/pki/tls/openssl.cnf [root@localhost ~]# cd /etc/pki/CA/ [root@localhost CA]# ls certs crl newcerts private [root@localhost CA]# (umask 077;openssl genrsa 2048 > private/cakey.pem ) Generating RSA private key, 2048 bit long modulus ...+++ ........................................................+++ e is 65537 (0x10001) [root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 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) [CN]: State or Province Name (full name) [Beijing]: Locality Name (eg, city) [Beijing]: Organization Name (eg, company) [tianfeiyu]: Organizational Unit Name (eg, section) [Linux]: Common Name (eg, your name or your server's hostname) []:ca.feiyu.com Email Address []: [root@localhost CA]# touch index.txt serial crlnumber [root@localhost CA]# echo 01 >serial
RS向CA发申请,然后将私钥和证书同步到每个RS,实现证书的共享:
[root@localhost CA]# cd /etc/httpd/ [root@localhost httpd]# mkdir ssl [root@localhost httpd]# cd ssl/ [root@localhost ssl]# (umask 077;openssl genrsa 1024 > httpd.key) Generating RSA private key, 1024 bit long modulus ..++++++ ..................................++++++ e is 65537 (0x10001) [root@localhost ssl]# 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) [CN]: State or Province Name (full name) [Beijing]: Locality Name (eg, city) [Beijing]: Organization Name (eg, company) [tianfeiyu]: Organizational Unit Name (eg, section) [Linux]: Common Name (eg, your name or your server's hostname) []:feiyu1.com Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Director端签署请求:
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 [root@localhost CA]# scp /tmp/httpd.crt 192.168.0.24:/etc/httpd/ssl #将证书发给RS
在RS1上启用https并将证书复制给另一个RS:
[root@localhost ssl]# scp -p /etc/httpd/ssl/* 192.168.0.23:/etc/httpd/ssl/ [root@localhost conf.d]# vim ssl.conf #启用https DocumentRoot "/var/www/html" ServerName feiyu1.com:443 SSLCertificateFile /etc/httpd/ssl/httpd.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key [root@localhost conf.d]# scp ssl.conf 192.168.0.23:/etc/httpd/conf.d/ #复制到另一个RS
在另一个RS上也启用https,然后重启服务。
[root@localhost ssl]# service httpd restart
开始定义集群服务:
[root@localhost ~]# ipvsadm -A -t 192.168.0.200:443 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.23 -g [root@localhost ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.24 -g
在定义防火墙标记前先测试集群是否配置无误:
然后做防火墙标记,将80端口和443端口进行标记:
[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp --dport 80 -j MARK --set-mark 10 [root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp --dport 443 -j MARK --set-mark 10 [root@localhost ~]# service iptables save [root@localhost ~]# ipvsadm -A -f 10 -s rr [root@localhost ~]# ipvsadm -a -f 10 -r 192.168.0.23 -g [root@localhost ~]# ipvsadm -a -f 10 -r 192.168.0.24 -g [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 10 rr -> 192.168.0.23:0 Route 1 0 0 -> 192.168.0.24:0 Route 1 0 0 [root@localhost ~]# ipvsadm -E -f 10 -s rr -p 1200 #使用持久连接 [root@localhost ~]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn FWM 10 rr persistent 1200 -> 192.168.0.23:0 Route 1 0 6 -> 192.168.0.24:0 Route 1 0 7
然后在浏览器中进行测试,并在http和https之间进行跳转,验证是否定下至同一RS。