LVS-DNAT
工作原理:
在数据包进入本机内部之前,就改变它的目的地址(需要在内核实现)
LVS的工作机制类似iptables,一部分工作在用户空间(ipvsadm),一部分工作在内核空间
安装ipvsadm软件就足以实现LVS的功能
使用ipvsadm,早期需要重新编译内核,不过现在版本的redhat默认直接做进内核
# 查看内核是否含有ipvs
grep –I –c 5 ipvs /boot/config-‘uname -r’
ipvsadm命令的使用:
ipvsadm功能
1:定义集群服务
2:定义真正的REALSERVER
3:查看定义的信息
1.定义集群服务
ipvsadm
-t 基于tcp的集群服务
-u 基于udp
-f 基于firewall的集群服务,防火墙的类型
-A 添加一个新集群
-E 修改一个集群
-s 指定算法 默认 wlc
-D 删除一个集群
-g|i|m gateway|internet|net DR|TUN|DNAT模型
-w 权重
-C 清空规则
-S 保存规则到某个文件
-R 从某个文件恢复规则
-L|l 查看
-n --numeric 数字方式显示地址
--stats 显示统计的数据信息(statistics的简写)
--rate 显示速率信息
-Z 清空计数器
添加/删除director端
ipvsadm -A| -E -t |-u VIP:port -s
ipvsadm -D -t|-u VIP:port
添加/删除realserver端
ipvsadm -a |-e -t|-u VIP:port -r REALSERVER[-g|-i|-m] [-w weight]
ipvsadm -d -t|-u VIP:port -r READSERVER
配置安装LVS
1.安装OS
2.后方安装apache
3.设置默认路由
4.安装lvs
5.配置LVS,定义好规则
6.做测试
1.两个apache作为realserver 只提供静态页面
2.Directory打开转发功能
3.两个realserver处于同一个网段
准备:
1) 3台干净的虚拟机:RS1 RS2 Director (需要加一块网卡)
2) 配置各自的好yum源
一:配置好地址,安装软件
realserver端:
ifconfig eth0 10.0.0.11/8
route add default gw 10.0.0.1/8
yum install httpd php php-mysql mysqlmysql-server php-mbstring -y
# 测试网页是否显示
vim /var/www/html/index.html
realserver1
service httpd start
elinks http://10.0.0.11
directory端:
ifconifg eth0 10.0.0.1/8
yum install ipvsadm
# 打开ipforward
echo 1 > /proc/sys/net/ipv4/ip_forward
#添加director
ipvsadm -A -t 172.16.14.1:80 -s rr
# 查看集群服务
ipvsadm -L -n
#添加realserver
ipvsadm -a -t 172.16.14.1:80 -r 10.0.0.11-m
ipvsadm -a -t 172.16.14.1:80 -r 10.0.0.12-m
ipvsadm -L -n
集群已经构建好了。。。。用浏览器测试下
# 压力测试,十个并发连接,发起10000次
ab -c 10 -n 10000 http://172.16.14.1/index.html
# 查看结果
ipvsadm -Ln
# 使用加权最少连接
ipvsadm -E -t 172.16.14.1:80 -s wlc
# 修改权重
ipvsadm -e -t 172.16.14.1:80 -r 10.0.0.11-m -w 3
# 压力测试,十个并发连接,发起10000次
ab -c 10 -n 10000http://172.16.14.1/index.html
# 换别的算法来测试,看看效果 单引号
watch -n 1 ‘ipvsadm -L -n’
# 保存ipvsadm 结果,否则开机就没有了
# 对于redhat
service ipvsadm save
chkconfig ipvsadm on
# 或者
ipvsadm -S > /etc/sysconfig/ipvsadm
##########建议自己写脚本实现,save的功能,最好带startstop restart
==========================================================================
LVS-DR
工作原理:
通过设置内核参数,禁止RS直接响应用户请求,既将RS都隔离起来,只允许它们响应DR转发过来的请求。
使用LVS-DR 前提:
内核有 arp_announce 和 arp_ignore
arp_annouce 定义通过哪个地址向别人通告本地MAC-ip对应信息所定义的限制级别
0 表示响应任意本地地址,任何接口(IP地址属于内核而不是网卡)
1 尽可能的避免用和来源主机的IP地址非同一个网络的地址响应它
2 总是用本地的最佳地址给予响应(同一个网段)
arp_ignore 定义响应方式和类型
0 无论地址放在任何地方都响应
1 只有在所请求的地址和请求所进来的接口一致(既进来的接口和请求的地址是同一个网段)的时候才响应
想想一下 arp_ignore=1 arg_annouce=2
服务器拒绝响应2.2
解决数据进入:
为了避免RS直接响应,给服务器的lo:0设置VIP地址,给本地网卡设置成CIP,这样RS就不会直接响应了,隐藏了RS
解决数据出去:
而默认情况下,Linux设置数据包从哪块网卡出去,源地址设为该网卡地址,通过添加一条特殊路由信息,如果目标地址是lo的VIP地址,那么出去的时候源地址设置为lo的地址。
路由信息的原理:
添加一条主机路由,将VIP的地址自己设置成一个网段,既子网掩码为255.255.255.255,这样VIP出去的时候没有比VIP更优的了,就成为最佳IP
相关网络规划如下:
需要配置:
1.Lo设为VIP
2.修改内核参数
3.添加特殊路由
配置LVS-DR须注意:
1.设置网卡模式为桥接
2.RIP地址不一定必须是公网地址
一、设置网卡
Director端
1.DIP配置在接口上,VIP要配置在接口别名上
# director ,一步到位,否则需要重启网络服务
ifconfig eth0:0 172.16.14.1 broadcast172.16.14.1 netmask 255.255.255.255 up # VIP
ifconfig eth0 172.16.14.10 # DIP
VIP应该设置在别名地址上,DIP设置在静态地址上,所有VIP设置在eth0:0
RS端
DIP 要配置在接口上,VIP要配置在lo的别名上
ifconfig eth0 172.16.14.11 # RIP
# 配置内核参数,禁止响应对VIP的ARP广播请求
echo 1 >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
echo 2 >/proc/sys/net/ipv4/conf/lo/arp_announce
# 此时设置VIP,就不会和director冲突
# 255.255.255.255 自闭
# VIP 只向自己广播
ifconfig lo:0 172.16.14.1 broadcast172.16.14.1 netmask 255.255.255.255 up
# 增加路由信息,所有出去的信息都以dev的信息为准
route add -host 172.16.14.1 dev lo:0
route -n
所有的RS都要设置
二.配置ipvsadm
ipvsadm -C # 去掉上次的
ipvsadm -A -t 172.16.14.1:80 -s wlc
ipvsadm -a -t 172.16.14.1:80 -r172.16.14.11 -g w 2
ipvsadm -a -t 172.16.14.1:80 -r172.16.14.12 -g w 4
ipvsadm -L -n