LVS-NAT实现
LVS简单介绍
LVS(linux virtual server)其实就是针对高可伸缩、高可用网络服务的需求,给出基于ip层和基于内容请求分发的负载平衡调度解决方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的虚拟服务器。所以,lvs需要内核有ipvs支持,linux-2.4.23以后ipvs都编译到内核里,如果你是之前版本确保你的内核支持ipvs后,只需安装ipvsadm就可以把一台服务器配置成负载调度器(Load Balancer)。对外提供服务的IP,也就是我们访问的IP称做VIP。调度器LB的任务主要是分发请求,真正处理的是真实服务器(Real Server)。
LVS三种模式工作原理
网络地址传输模式工作原理
LB收到用户请求包后,LB将请求包中虚拟服务器的IP地址转换为某个选定RS的IP地址,转发给RS;RS将应答包发给LB,LB将应答包中RS的IP转为虚拟服务器的IP地址,回送给用户。
LVS-NAT模型特征
1、所有realserver与director在同一个子网中
2、rip真实服务器ip地址为私有地址,仅用于集群节点之间使
3、客户端的请求,响应都要经过director
4、ripserver 网关指向dip
5、可以实现端口映射 80
6、realserver可以是任何操作系统
7、dirctor可能成为系统瓶颈
直接路由模式工作原理
LB收到请求包后,将请求包中目标MAC地址转换为某个选定RS的MAC地址后将包转发出去,RS收到请求包后 ,可直接将应答内容传给用户。此时要求LB和所有RS都必须在一个物理段内,且LB与RS群共享一个虚拟IP。
LVS-DR模型特征
1、集群节点必须在一个物理网络上(mac)
2、rip可以使用公网地址
3、director处理入站请求,
4、realserver网关不指向director
5、不支持端口映射
6、大多数操作系统支持realservers
7、dr dirctor 比nat director性能优越
IP隧道模式(IP Tunneling)
LB收到用户请求包后,根据IP隧道协议封装该包,然后传给某个选定的RS;RS解出请求信息,直接将应答内容传给用户。此时要求RS和LB都要支持IP隧道协议。
LVS-TUN模型特征
集群节点可跨互联网
1、director和realserver不需要在一个网络中
2、rip一定不是私有地址
3、director 仅处理入站请求
4、realserver网关不能指向director ip
5、不支持端口映射
6、仅有支持ip遂道功能操作系统才能用在realserver
LVS scheduling methods(LVS调度算法)
静态调度4个
轮叫RR加权轮叫WRR目标地址hash DH源地地址hash SH
动态调度6个
最少链接(Least Connections)
加权最少链接(Weighted Least Connections)WLC
linux默认的调度 shortest expected delay SED
never queue NQ
基于本地的最少链接(Locality-Based Least Connections:DH)LBLC
带复制的基于本地最少链接(Locality-Based Least Connections with Replication)LBLCR
LVS-NAT实现过程
实验拓扑图
192.168.1.100是LVS与互联网的虚拟server ip地址,简称为VIP
192.168.1.1是LVS与内部真实服务器通信的ip地址,简称为DIP
192.168.1.100与192.168.1.101就是LVS通过一些调度算法,选择服务器响应的真实服务器地址
LVS配置
Eth0网卡使用hostonly连接
Eth1网卡使用vmnet2连接
开启路由功能
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# sysctl –p #使路由功能生效
查看内核是否支持IPVS
[root@localhost ~]# uname -r
2.6.18-164.el5
[root@localhost ~]# grep -i ip_vs /boot/config-2.6.18-164.el5
如果是CONFLIG_IP_VS_PROTO_TCP=y 则说明支持ipvs
挂载光盘
[root@localhost ~]# mkdir /mnt/cdrom
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/
编辑本地yum
[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
使用yum安装ipvsadm工具
[root@localhost ~]# yum install -y ipvsadm
ipvsadm命令详细介绍
1.定义集群服务
语法:
ipvsadm -A|-E -t|-u VIP:port -s scheduler -s指调度算法
ipvsadm -D -t|-u VIP:port
-A 在虚拟服务器表中添加新的虚拟服务器记录
-E 编辑内核虚拟服务器表中虚拟服务器记录。
-D 删除虚拟服务器表中虚拟服务器记录。
-L 查看
-t|-u 代表tcp和udp服务
VIP指虚拟服务器ip地址,即LVS与internet通信的网卡地址
2. 真实服务器的规则定义
ipvsadm -a|e -t|u VIP:port -r REALSERVER -g|-i|-m [-w weight]
ipvsadm -d -t|-u VIP:port -r REALSERVER
-a 在虚拟服务器表的添加一条新的真实服务器
-e 编辑虚拟服务器记录中真实服务器记录
-d删除虚拟服务器记录的真实服务器记录
-r 提供服务响应的真实服务器
-g 指LVS 的工作模式为直接路由模式
-i 指LVS 的工作模式为隧道模式
-m 指LVS 的工作模式为NAT 模式
-z 清空计数器
-n 数字的方式来显示地址
--stats 状态信息
--rate 每秒速率
添加或修改集群服务:ipvsadm -A|E -t|u|f VIP:port -s 调度算法 删除一个集群服务: ipvsadm -D -t|u|f VIP:port
添加或者修改REALSERVER:ipvsadm -a|e -t|u|f VIP:port -r REALSERVER[:port] -g|-i|-m [-w 权重]
删除一个REALSERVER: ipvsadm -d -t|u|f VIP:port -r REALSERVER[:port]
Ipvsadm配置
[root@localhost ~]# ipvsadm -A -t 192.168.10.100:80 -s rr #定义一个 集群服务,-s指调度算法为rr
[root@localhost ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.1.100 -m #向集群服务添加RS -m为nat方式
[root@localhost ~]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.1.101 –m #向集群服务添加RS -m为nat方式
[root@localhost ~]# service ipvsadm save #对规则进行保存
Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
[root@localhost ~]# service ipvsadm start
查看规则被保存
[root@localhost ~]# vim /etc/sysconfig/ipvsadm
Real server1配置
Eth0网卡选择vmnet2连接,Eth0配置
#yum install –y httpd
#cd /var/www/html
#echo”web1”>index.html
#service httpd restart
Real server2配置
Eth0网卡选择vmnet2连接,Eth0配置
#yum install –y httpd
#cd /var/www/html
#echo”web2”>index.html
#service httpd restart
测试
不断刷新之后,查看请求会话结果
[root@localhost ~]# ipvsadm –ln
至此,实现了轮询。。
LVS-DR实现
Real server1配置
先配置内核参数再配置ip地址,顺序不能颠倒
[root@localhost ~]# echo "net.ipv4.conf.eth0.arp_announce = 2">>/etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.all.arp_announce = 2">>/etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.eth0.arp_ignore = 1">>/etc/sysctl.conf
[root@localhost ~]# echo "net.ipv4.conf.all.arp_ignore = 1">>/etc/sysctl.conf
[root@localhost ~]# sysctl –p #立即生效
新加个
[root@localhost ~]# route add -host 192.168.10.101 dev lo:0
[root@localhost ~]# yum install –y httpd
[root@localhost ~]# cd /var/www/html
[root@localhost ~]# echo”web1”>index.html
[root@localhost ~]# service httpd restart
Real server2配置
直接从real server1拷贝内核参数到real server2
[root@mail ~]# scp 192.168.10.200:/etc/sysctl.conf
[root@mail ~]# sysctl –p #立即生效
新加个
[root@mail ~]# route add -host 192.168.10.101 dev lo:0
[root@localhost ~]# route add -host 192.168.10.101 dev lo:0
[root@localhost ~]# yum install –y httpd
[root@localhost ~]# cd /var/www/html
[root@localhost ~]# echo”web1”>index.html
[root@localhost ~]# service httpd restart
Direct配置
[root@mail ~]# mkdir /mnt/cdrom/
mkdir: cannot create directory `/mnt/cdrom/': File exists
[root@mail ~]# mount /dev/cdrom /mnt/cdrom/
mount: block device /dev/cdrom is write-protected, mounting read-only
[root@mail ~]# cd /mnt/cdrom/Cluster
[root@mail Cluster]# rpm -ivh ipvsadm-1.24-10.i386.rpm
Preparing... ########################################### [100%]
1:ipvsadm ########################################### [100%]
[root@mail Cluster]# service ipvsadm save
Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
[root@mail Cluster]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@mail Cluster]# ipvsadm -A -t 192.168.10.101:80 -s rr
[root@mail Cluster]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:80 rr
[root@mail Cluster]# ipvsadm -a -t 192.168.10.101:80 -r 192.168.10.200 -g
[root@mail Cluster]# ipvsadm -a -t 192.168.10.101:80 -r 192.168.10.201 -g
[root@mail Cluster]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:80 rr
-> 192.168.10.201:80 Route 1 0 0
-> 192.168.10.200:80 Route 1 0 0
测试
Direct查看,实现轮询。
持续连接实现PCC
紧接着以上的lvs-Dr做
Director配置
[root@mail ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:80 rr
-> 192.168.10.201:80 Route 1 0 0
-> 192.168.10.200:80 Route 1 0 0
[root@mail ~]# ipvsadm –C #清空规则
[root@mail ~]# ipvsadm –ln #查看清空后的规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@mail ~]# ipvsadm -A -t 192.168.10.101:0 -s rr -p 1800
[root@mail ~]# ipvsadm -a -t 192.168.10.101:0 -r 192.168.10.200 -g
[root@mail ~]# ipvsadm -a -t 192.168.10.101:0 -r 192.168.10.201 -g
[root@mail ~]# ipvsadm -ln
测试,不断刷新之后,一直出现的是web2页面
新打开一个终端ssh 192.168.10.101
在director上显示
[root@mail ~]# ipvsadm –ln
PPC
[root@mail ~]# ipvsadm -C
[root@mail ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@mail ~]# ipvsadm -A -t 192.168.10.101:80 -s rr -p 1800
[root@mail ~]# ipvsadm -A -t 192.168.10.101:22 -s rr -p 1800
[root@mail ~]# ipvsadm -a -t 192.168.10.101:80 -r 192.168.10.200 -g
[root@mail ~]# ipvsadm -a -t 192.168.10.101:80 -r 192.168.10.201 -g
[root@mail ~]# ipvsadm -a -t 192.168.10.101:22 -r 192.168.10.201 -g
[root@mail ~]# ipvsadm -a -t 192.168.10.101:22 -r 192.168.10.200 –g
测试
可以看出http的交给192.168.10.201
Ssh到192.168.10.101 可以看出ssh都交给了192.168.10.200
防火墙
Realserver1配置
[root@localhost ~]# vim /etc/pki/tls/openssl.cnf
[root@localhost ~]# cd /etc/pki/CA/
[root@localhost CA]# mkdir crl certs newcerts
[root@localhost CA]# ll
total 20
drwxr-xr-x 2 root root 4096 Oct 11 21:07 certs
drwxr-xr-x 2 root root 4096 Oct 11 21:07 crl
drwxr-xr-x 2 root root 4096 Oct 11 21:07 newcerts
drwx------ 2 root root 4096 Jun 30 2009 private
[root@localhost CA]# touch serial index.txt
[root@localhost CA]# echo "01">serial
[root@localhost CA]# openssl genrsa 1024 >private/cakey.pem
[root@localhost CA]# chmod 600 private/cakey.pem
[root@localhost CA]# openssl req -new -key private/cakey.pem -x509 -days 3650 -out cacert.pem
[root@localhost CA]# mkdir -pv /etc/httpd/certs
mkdir: created directory `/etc/httpd/certs'
[root@localhost CA]# cd /etc/httpd/certs/
[root@localhost certs]# openssl genrsa 1024 >httpd.key
[root@localhost certs]# openssl req -new -key httpd.key -out httpd.csr
[root@localhost certs]# openssl ca -in httpd.csr -out httpd.cert
[root@localhost certs]# yum install -y mod_ssl
[root@localhost certs]# vim /etc/httpd/conf.d/ssl.conf
Realserver2配置
[root@mail CA]# mkdir certs newcerts crl
[root@mail CA]# touch serial index.txt
[root@mail CA]# scp 192.168.10.200:/etc/pki/tls/openssl.cnf /etc/pki/tls/
[root@mail CA]# scp 192.168.10.200:/etc/pki/CA/serial /etc/pki/CA/
[root@mail CA]# scp 192.168.10.200:/etc/yum.repos.d/rhel-debuginfo.repo /etc/yum.repos.d/
[root@mail CA]# mount /dev/cdrom /mnt/cdrom/
[root@mail CA]# yum install -y mod_ssl
[root@mail CA]# scp 192.168.10.200:/etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/
[root@mail CA]# mkdir -pv /etc/httpd/certs
[root@mail CA]# scp 192.168.10.200:/etc/httpd/certs/* /etc/httpd/certs/
[root@mail CA]# scp 192.168.10.200:/etc/pki/CA/cacert.pem /etc/pki/CA/
[root@mail CA]# scp 192.168.10.200:/etc/pki/CA/private/cakey.pem /etc/pki/CA/private/
Director配置
Iptables配置
[root@mail pki]# ipvsadm –C
[root@mail pki]# iptables -t mangle -A PREROUTING -p tcp --dport 80 -d 192.168.10.101 -j MARK --set-mark 10
[root@mail pki]# iptables -t mangle -A PREROUTING -p tcp --dport 443 -d 192.168.10.101 -j MARK --set-mark 10
查看mangle表格
[root@mail pki]# service iptables save #保存规则
Ipvsadm配置
[root@mail pki]# ipvsadm -A -f 10 -s rr -p 1800
[root@mail pki]# ipvsadm -a -f 10 -r 192.168.10.200
[root@mail pki]# ipvsadm -a -f 10 -r 192.168.10.201
规则显示
测试