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实现过程
实验拓扑图

clip_image002

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连接

clip_image004

Eth1网卡使用vmnet2连接

clip_image006

开启路由功能

[root@localhost ~]# vim /etc/sysctl.conf

clip_image008

[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

clip_image010

挂载光盘

[root@localhost ~]# mkdir /mnt/cdrom

[root@localhost ~]# mount /dev/cdrom /mnt/cdrom/

编辑本地yum

[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo

clip_image012
使用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

clip_image014

Real server1配置

Eth0网卡选择vmnet2连接,Eth0配置

clip_image016

#yum install –y httpd

#cd /var/www/html

#echo”web1”>index.html

#service httpd restart

Real server2配置

Eth0网卡选择vmnet2连接,Eth0配置

clip_image018

#yum install –y httpd

#cd /var/www/html

#echo”web2”>index.html

#service httpd restart

测试

clip_image020

clip_image022

不断刷新之后,查看请求会话结果

[root@localhost ~]# ipvsadm –ln

clip_image024

至此,实现了轮询。。

LVS-DR实现

clip_image026

Real server1配置

clip_image028

先配置内核参数再配置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 #立即生效

新加个

clip_image030

[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配置

clip_image032

直接从real server1拷贝内核参数到real server2

[root@mail ~]# scp 192.168.10.200:/etc/sysctl.conf

[root@mail ~]# sysctl –p #立即生效

新加个

clip_image034

[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配置

clip_image036

clip_image038

[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

测试

clip_image040

clip_image042

Direct查看,实现轮询。

clip_image044

持续连接实现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页面

clip_image046

clip_image048

新打开一个终端ssh 192.168.10.101

clip_image050

在director上显示

[root@mail ~]# ipvsadm –ln

clip_image052

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

clip_image054

测试

clip_image056

可以看出http的交给192.168.10.201

clip_image058

Ssh到192.168.10.101 可以看出ssh都交给了192.168.10.200

clip_image060

clip_image062

防火墙

clip_image064

Realserver1配置

[root@localhost ~]# vim /etc/pki/tls/openssl.cnf

clip_image066

clip_image068

clip_image070

[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

clip_image072

[root@localhost CA]# openssl genrsa 1024 >private/cakey.pem

clip_image074

[root@localhost CA]# chmod 600 private/cakey.pem

[root@localhost CA]# openssl req -new -key private/cakey.pem -x509 -days 3650 -out cacert.pem

clip_image076

clip_image078

[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

clip_image080

[root@localhost certs]# openssl req -new -key httpd.key -out httpd.csr

clip_image082

clip_image084

[root@localhost certs]# openssl ca -in httpd.csr -out httpd.cert

clip_image086

clip_image088

[root@localhost certs]# yum install -y mod_ssl

[root@localhost certs]# vim /etc/httpd/conf.d/ssl.conf

clip_image090

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表格

clip_image092

[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

规则显示

clip_image094

测试

clip_image096

clip_image098

clip_image100

clip_image102

clip_image104

clip_image106