美文网首页码神之路
LVS之VS/TUN应用场景

LVS之VS/TUN应用场景

作者: JSON_NULL | 来源:发表于2017-12-01 18:55 被阅读13次

    简介

    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的配置也完成了。

    需要特别说明的是:

    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应用场景

        本文链接:https://www.haomeiwen.com/subject/dwywbxtx.html