Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1673233
  • 博文数量: 782
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 4140
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 21:37
个人简介

Linux ,c/c++, web,前端,php,js

文章分类

全部博文(782)

文章存档

2015年(8)

2014年(28)

2013年(110)

2012年(307)

2011年(329)

分类: 网络与安全

2014-11-26 10:18:20

原文地址:LVS DR模型详解 作者:xupengtao7

DR模型的特点:
1.director必须与realserver位于同一个网络。
2.realserver可以使用公网ip地址,便于远程管理与配置。
3.director只负责处理入站请求。而响应报文则由realserver直接返回给client端。大大节省director的资源
4.不能做端口映射
整个工作原理如下:
客户端通过路由器将请求交给director的VIP。director接收请求,将通过相应的算法将请求转发给相应的realserver。在转发的过程中,会修改请求包的目的mac地址,目的ip地址不变。realserver接收请求,并直接响应客户端。这时,便出现一个问题:director此时与realserver位于同一个网络中,当director直接将请求转发给realserver时,realserver检测到该请求包的目的ip是vip而并非自己,便会丢弃,而不会响应。。为了解决这个问题,我们需要在所有realserver上都配上VIP。这时会出现第二个问题:director与realserver位于同一个网络中,当出现多个vip时,通过arp广播,整个网络必然混乱,我们无法保证客户端的请求一定会发往director。为保证当客户端请求抵达网络时,只有director来响应请求。我们需要realserver忽略对vip的arp请求,并且在arp通告时,不通告vip地址。我们需要配置如下两个内核参数:
arp_ignore :
当一台主机某个接口接收到arp请求时,这台机上的ip地址是否通过该接口响应给对应请求的限制级别。简单来说,当这台主机有多块网卡,或者有多个ip地址时,是否通过该接口将所有ip地址响应给对应的请求。

    0:不作任何限制。将所有本机的ip地址都响应给对应请求。

    1:当请求的ip就配置在本接口上时,才予以响应。换句话说,就是只响应当前接口的ip地址。

arp_announce:
当一台主机加入到一个新的网络。会发出ARP通告,向网络中其他主机通告自己的ip地址及mac等信息。arp_anounce就用来限制通告的级别。当这台主机有多块网卡或者多个ip地址时,是否通过某一个接口将所有ip地址通告给该网络中的主机。

    0:不作任何限制。从任意接口通告所有ip地址。

    1:尽可能避免通告非本接口上的ip。

    2:只通知本接口的ip。非本接口的ip不予通告。

由此我们亦可知,在realserver上配置vip时显然也不能配置的物理接口的虚接口上,而应该配置在loopback上。

配置示例:
1)实验环境
lvs负载调度器:eth0:172.16.16.173/24,VIP eth0:0 172.16.16.172
web服务器池:节点1-节点2:172.16.16.177-178/24

2)配置负载调度器
a.配置虚拟IP地址(VIP)
ifconfig eth0:0 172.16.16.172 broadcast 172.16.16.172 netmask 255.255.255.0 up   #在eth0上配置并启动VIP
route add -host 172.16.16.172 dev eth0:0   #特殊路由,当客户端请求的ip为vip时,则由eth0:0响应。


b.调整/proc响应参数
echo 1 > /proc/sys/net/ipv4/ip_forward    #开启路由转发

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects

    send_redirects:icmp发送重定向。经查阅相关资料,开启此选项有一定的危险性,容易被人伪造icmp重定向包发起攻击。若当前director并非充当路由或网关,建议关闭。默认为开启,0为关闭。


c.配置负载分配策略
service ipvsadm stop
ipvsadm -A -t 172.16.16.172:80 -s wlc
ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.177 -g -w 1
ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.178 -g -w 1
service ipvsadm save
chkconfig ipvsadm on


3)配置节点服务器
a.配置虚拟IP地址
ifconfig lo:0 172.16.16.172 broadcast 172.16.16.172 netmask 255.255.255.255 up
/sbin/route add -host 172.16.16.172 dev lo:0

b.调整/proc响应参数

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/default/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/default/arp_announce

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    此几项配置即是用于限制arp请求及arp通告


c.安装httpd,进行测试。


可将整个lvs dr模型下的director和realserver上的配置写成脚本,如下:

director启动脚本:
#/bin/bash
#
#LVS for VS/DR
. /etc/rc.d/init.d/functions
#
VIP=172.16.16.172
RIP1=172.16.16.177
RIP2=172.16.16.178
PORT=80
#
case $1 in
start)
#clear all iptables policy
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -Z
#configure VIP
/sbin/ifconfig eth0:1 $VIP broadcast $VIP netmask=255.255.255.0
/sbin/route add -host $VIP dev eth0:1
#enalbe ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward

echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects

echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects


#clear all ipvsadm rules/services.
/sbin/ipvsadm -C
#Add an IP virtual service for VIP 172.16.16.172port 80
/sbin/ipvsadm -A -t $VIP:$PORT  -s wlc
/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP1 -g -w 1
/sbin/ipvsadm -a -t $VIP:$PORT -r $RIP2 -g -w 1
/bin/touch /var/lock/subsys/ipvsadm > /dev/null
;;
stop)
#Reset ipvsadm
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
/bin/rm -f /var/lock/subsys/ipvsadm > /dev/null
;;
status)
if [ ! -e /var/lock/subsys/ipvsadm ];then
echo "ipvs is stopped..."
else
echo "ipvs is running..."
/sbin/ipvsadm -L -n
fi
;;
*)
echo "Usage: $0 {start|stop|status}"
exit 1
;;
esac

realserver启动脚本:
case $1 in
start)
#start LVS-DR on this real server machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.0 up
/sbin/route add -host $VIP dev lo:0
;;
stop)
#stop LVS-DR on this real server machine.
/sbin/ifconfig lo:0 down
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
#Sstatus of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo:0" | grep $VIP`
if [ !"islothere" -o !"isrothere" ]; then
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running"
fi
;;
*)
# Invalid entry.
echo "Usage: $0 (start|stop|status)"
exit 1
;;
esac

以上为第一种配置方法,也是官方的常规配置方法。
在第一种配置方法中,我们提到在所有realserver的loopback上配置vip来实现接收director端的请求转发,然后通过修改内核参数来忽略arp应答与通告。那我作一个假设。假设我不在realserver上配置vip,我依然希望realserver能够接收director转发来的请求。前文我们提到,如果realserver不配置vip,默认会将director转发过来的请求包丢弃。那么除了在loopback端配置vip,还有没有其他的办法让realserver接收来自director转发的请求包?
这个时候我们需要用到iptables的重定向策略。我们不需要在realserver的loopback上配置vip,也不需要去修改内核参数来忽略arp的响应与通告。director上的配置同上并不发生改变,realserver的配置如下:
iptables -t nat -A PREROUTING -d 172.16.16.172 --dport 80 -j REDIRECT
整个配置过程完成,是不是比上一种方法更为简单?
阅读(795) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~