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.172web服务器池:节点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上配置并启动VIProute 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 stopipvsadm -A -t 172.16.16.172:80 -s wlcipvsadm -a -t 172.16.16.172:80 -r 172.16.16.177 -g -w 1ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.178 -g -w 1service ipvsadm savechkconfig 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 -p tcp --dport 80 -j REDIRECT
整个配置过程完成,是不是比上一种方法更为简单?