1. Lvs DR 模型原理图
(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
(d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
(e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
(f) 响应报文最终送达至客户端
2. LVS-DR模型的特性
特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
RS跟Director Server必须在同一个物理网络中
所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
不支持地址转换,也不支持端口映射
RS可以是大多数常见的操作系统
RS的网关绝不允许指向DIP(因为我们不允许他经过director)
RS上的lo接口配置VIP的IP地址
缺陷:RS和DS必须在同一机房中
3. 特点1的解决方案:
在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server
存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用
arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的
修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
4.部署实例
实验环境
Director节点: (eth1 192.168.10.31 vip eth1:0 192.168.10.70)
Real server1: (eth1 192.168.10.32 vip lo:0 192.168.10.70)
Real server2: (eth1 192.168.10.34 vip lo:0 192.168.10.70)
配置 Director 服务器
查看当前服务器ip 地址
ifconfig eth1
eth1 Link encap:Ethernet HWaddr 00:0C:29:A5:E5:14
inet addr:192.168.10.31 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fea5:e514/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:121 errors:0 dropped:0 overruns:0 frame:0
TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12438 (12.1 KiB) TX bytes:12833 (12.5 KiB)
配置 vip 地址
cp ifcfg-eth1 ifcfg-eth1:0
cat ifcfg-eth1
DEVICE=eth1
HWADDR=00:0C:29:A5:E5:14
TYPE=Ethernet
#UUID=64dc9596-9cf7-4e94-b1d1-690109a87926
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.10.31
GATEWAY=192.168.10.1
NETMASK=255.255.255.0
cat ifcfg-eth1:0
DEVICE=eth1:0
NAME="eth1:0"
HWADDR=00:0C:29:A5:E5:14
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.10.70
GATEWAY=192.168.10.1
NETMASK=255.255.255.0
重启网卡,查看配置是否生效
service network restart
打开路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
安装ipvsadm
yum install ipvsadm -y
配置规则 ipvs 的规则 (这里设置为轮训模式)
ipvsadm -A -t192.168.10.70:80 -s rr
ipvsadm -a -t 192.168.10.70:80 -r 192.168.10.32 -g
ipvsadm -a -t 192.168.10.70:80 -r 192.168.10.34 -g
配置 Real server1
cp ifcfg-lo ifcfg-lo:1
cat ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.10.70
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
关闭arp 转发
echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore 临时生效
echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce 临时生效
arp_ignore 为:1 # - 只回答目标 IP 地址是访问本网络接口(eth0)的 ARP 查询请求。
在设置参数的时候将 arp_ignore 设置为 1,意味着当别人的 arp 请求过来的时候,如果接收的网卡设备
上面没有这个 ip,就不做出响应,默认是 0,只要这台机器上面任何一个网卡设备上面有这个 ip,就响应
arp 请求,并发送 mac 地址。
arp_announce (宣告) 为 2
2 - 对查询目标使用最适当的本地地址。例如,如果在 eth0 接口上接受到了一个 VIP 的 arp 请求包。内
核判断这个 VIP 地址是不是 eth0 接口上的 IP 一样。如果一样,则回复这个包。如果不一样,就丢弃不回
应。
永久生效
vim /etc/sysctl.conf #最后添加
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
sysctl -p
安装http 配置测试页面
yum install httpd -y
echo "192.168.10.32 realserver 1" > /var/www/html/index.html
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
配置 Real server2
cp ifcfg-lo ifcfg-lo:1
cat ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.10.70
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
关闭arp 转发
echo 1 > /proc/sys/net/ipv4/conf/eth1/arp_ignore 临时生效
echo 2 > /proc/sys/net/ipv4/conf/eth1/arp_announce 临时生效
永久生效
vim /etc/sysctl.conf #最后添加
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
sysctl -p
安装http 配置测试页面
yum install httpd -y
echo "192.168.10.34 realserver 2 " > /var/www/html/index.html
测试 real-server1
http://192.168.10.32
测试 real-server2
http://192.168.10.34
使用vip 测试