简介
LVS的VS/TUN模式主要使用在异地容灾场景。也就是说有多台真实服务器节点处的地理位置不同。这时候要使用LVS做负载均衡就必须使用VS/TUN模式了。因为在VS/DR下要求DIP和真实服务器的RIP在同一网段,所以在跨地理位置的情况下实施非常困难;而VS/NAT模式下要求DIP和真实服务器的RIP在私网环境下,也无法跨越地理位置。
实验环境
LVS VS/TUN实验网络结构如上图所示是我在做LVS的VS/TUN模式实验时的网络环境。虽然实验中使用的都是私网IP,但因为他们都处于不同的网段,所以可以类比为公网环境。
环境配置
实验环境配置分为三部分,第一部分是通用配置(Director和RealServer都需要的配置),第二部分是对负载调度器主机也就是Director主机的配置,第三部分是对各个真实服务器节点的配置。稍候分小节介绍。现在对实验环境的主机和系统进行说明。
三台路由器使用的是DynamipsGUI(小凡)模拟的思科3640。为了让实验环境足够简单(也为了减少我主机的系统开销)交换机的部分就省略了,所有主机都直接与路由的以太网口相连。
P0/0是使用VMWare虚拟的一台win10系统,ip地址为192.168.3.101。用于请求LVS中的http服务器,来验证LVS配置完成且工作正常。
P0/1、P0/2、P0/3、P0/4都是使用VMWare虚拟出来的CentOS6.9系统。其中P0/4作为Director,其他三台作为 RealServer。IP地址与图片【LVS VS/TUN实验网络结构】中描述的完全一至。
有关如何将VMWare虚拟出来的机器与DynamipsGUI模拟出来的跟帖相连的问题,我会在另一篇文章中详细说明。等写完后会把链接更新到这里。
通用配置
因为VS/TUN模式下,使用的是IP隧道把数据包从Director分发到各个 RealServer节点的。所以需要四个Linux主机(Director和RealServer)都支持一种名为ipip的IP隧道协议。这就需要在Linux内核中有支持ipip协议(一种IP隧道协议)的模块。想要简单了解在Linux内核中与ipip协议相关的模块可以移步Linux 中IP隧道模块浅析。
检查系统是否安装了支持ipip协议的内核模块如果输入lsmod |grep ipip
指令后得到如上图所示的结果(包含图片中的那两行信息,如果有更多信息也无所谓),则表示你的Linux系统内核已经安装了支持ipip协议的相关模块了。
对Director主机的配置
首先是要安装ipvsadm软件包:
yum install -y ipvsadm
然后是对ipvsadm进行配置:
-A -t 192.168.14.101:80 -s rr
-a -t 192.168.14.101:80 -r 192.168.11.101:80 -i -w 1
-a -t 192.168.14.101:80 -r 192.168.12.101:80 -i -w 1
-a -t 192.168.14.101:80 -r 192.168.13.101:80 -i -w 1
从图片【LVS VS/TUN实验网络结构】中可以看到在Director中VIP是配置在Eth0:0上面的。
ifconfig eth0:0 192.168.14.101 netmask 255.255.255.255 up
你也可以把Director中的VIP配置在虚拟网卡tunl0上面。
ifconfig tunl0 192.168.14.101 netmask 255.255.255.255 up
至此Director的配置工作结束。
需要特别说明的是:在VS/TUN模块下Director是不需要开启ip_forword(路由转发)功能的。
对RealServer节点的配置
所有RealServer节点,除了RIP不同之外,其他配置都是一样的。
首先需要把VIP配置在RealServer节点的tunl0网卡上:
ifconfig tunl0 192.168.14.101 netmask 255.255.255.255 up
然后关闭tunl0网卡的反向路由校验(默认情况下是开着的,基值为1)。因为对tunl0网卡上反向路由的校验策略使用的是all上和tunl0网卡上两rp_filter参数中的较大值。所以需要同时对all中rp_filter参数进行设置。
echo "0" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
因为在VS/TUN模式下,所有RealServer都是可以与client进行直接通信的,所以也可以不关闭反向路由校验,而是把校验规则设置的宽松一些(把rp_filter的值设置为2)。
echo "2" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
有关rp_filter参数更详细的介绍请参阅Linux内核参数 rp_filter。
以上就是所有针对LVS在VS/TUN模式下RealServer的配置了,但是如果你的防火墙是开着的,仅有以下配置还不能让你的RealServer正常工作。因为防火墙很可能会拦截你Director通过ipip协议发过来的IP隧道数据包。你可以通过以下配置让防火墙允许ipip协议的数据包通过:
iptables -I INPUT 1 -p 4 -j ACCEPT
至此RealServer的配置也完成了。
需要特别说明的是:
- 因为RealServer与Director不在同一网段中,且不会有对VIP的请求被直接路由到RealServer所在的网段中,所以不需要对RealServer进行arp抑制。
- 我在网上看到很多配置VS/TUN时,在RealServer和Director都对VIP添加了路由表,我不清楚他们为什么这么做,但我在没有添加路由表的情况下LVS依然可以正常工作。如果您对此有什么见解可以给我留言,咱们做深入的讨论。以期共同进步。
编制自动化脚本
为了启动和关闭方便,我们可以编制两个可以使用service指令进行服务管理的脚本,还可以把他们注册到系统服务中,并设置开机启动。
Director上的启动脚本 lvs_tun-d
#!/bin/sh
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for TUN
#
LOCK=/var/lock/lvs-tun.lock
VIP=192.168.14.101
RIP1=192.168.11.101
RIP2=192.168.12.101
RIP3=192.168.13.101
. /etc/rc.d/init.d/functions
start() {
PID=`ipvsadm -Ln | grep ${VIP} | wc -l`
if [ $PID -gt 0 ];
then
echo "The LVS-TUN Server is already running !"
else
/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up
#Clear IPVS Table
/sbin/ipvsadm -C
#Set Lvs
/sbin/ipvsadm -At $VIP:80 -s rr
/sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -i -w 1
/sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -i -w 1
/sbin/ipvsadm -at $VIP:80 -r $RIP3:80 -i -w 1
/bin/touch $LOCK
#Run Lvs
echo "starting LVS-TUN-DIR Server is ok !"
fi
}
stop() {
#stop Lvs server
/sbin/ipvsadm -C
/sbin/ifconfig tunl0 down >/dev/null
rm -rf $LOCK
echo "stopping LVS-TUN-DIR server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-TUN Server is already running !"
else
echo "The LVS-TUN Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 1
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
把上面的脚本放到/etc/init.d/目录下。并授予其可执行权限:
chmod o+x /etc/init.d/lvs_tun-d
然后使用如下指令设置为开机启动。
chkconfig --level 35 lvs_tun-d on
RealServer上的启动脚本 lvs_tun-r
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for TUN-RealServer
#
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.14.101
. /etc/rc.d/init.d/functions
start() {
PID=`ifconfig | grep tunl0 | wc -l`
if [ $PID -ne 0 ];
then
echo "The LVS-TUN-RIP Server is already running !"
else
# 配置tunl0网卡
/sbin/ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up
# 配置tunl0网卡的反向路由策略
echo "2" > /proc/sys/net/ipv4/conf/tunl0/rp_filter
# 配置防火墙允许ipip协议的数据包通过
iptables -I INPUT 1 -p 4 -j ACCEPT
/bin/touch $LOCK
echo "starting LVS-TUN-RIP server is ok !"
fi
}
stop() {
# 关闭tunl0网卡
/sbin/ifconfig tunl0 down
# 删除防火墙中允许ipip协议的数据包通过策略
iptables -D INPUT -p 4 -j ACCEPT
rm -rf $LOCK
echo "stopping LVS-TUN-RIP server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-TUN-RIP Server is already running !"
else
echo "The LVS-TUN-RIP Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
把上面的脚本放到/etc/init.d/目录下。并授予其可执行权限:
chmod o+x /etc/init.d/lvs_tun-r
然后使用如下指令设置为开机启动。
chkconfig --level 35 lvs_tun-r on
网友评论