LVS之VS/TUN应用场景

简介

LVS的VS/TUN模式主要使用在异地容灾场景。也就是说有多台真实服务器节点处的地理位置不同。这时候要使用LVS做负载均衡就必须使用VS/TUN模式了。因为在VS/DR下要求DIP和真实服务器的RIP在同一网段,所以在跨地理位置的情况下实施非常困难;而VS/NAT模式下要求DIP和真实服务器的RIP在私网环境下,也无法跨越地理位置。

实验环境

LVS之VS/TUN应用场景_第1张图片
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的配置也完成了。

需要特别说明的是:

  1. 因为RealServer与Director不在同一网段中,且不会有对VIP的请求被直接路由到RealServer所在的网段中,所以不需要对RealServer进行arp抑制。
  2. 我在网上看到很多配置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

你可能感兴趣的:(LVS之VS/TUN应用场景)