LVS 四种工作模式原理、优缺点比较及简单配置

本文深入介绍了LVS集群的四种工作模式:NAT、IP隧道、直接路由和FULLNAT,对比了各自的原理、优缺点,并提供了详细的配置步骤。此外,还讲解了负载均衡调度算法,帮助读者更好地理解和应用LVS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LVS简介

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性

LVS 四种工作模式原理简介及优缺点分析

1、NAT模式(LVS-NAT)

这里写图片描述

原理:把客户端发来的数据包在负载均衡器上将目的地址封装成其中一台RS的IP地址,并发至该RS来处理,RS处理完成后把数据包发给负载均衡器,负载均衡器再把数据包的原IP地址封装成为自己的IP,将目的地址封装成客户端IP地址,然后发给客户端。无论是进来的流量,还是出去的流量,都必须经过负载均衡器。

  • 优点:集群中的物理服务器可以使用任何支持 TCP/IP 的操作系统,只有负载均衡器需要一个合法的IP地址。

  • 缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

2、IP隧道模式(LVS-TUN)

这里写图片描述

原理:由于互联网上的大多Internet服务的请求包很短小,而应答包通常很庞大,使用nat模式庞大的应答数据包也必须经过负载均衡器,这就加重了负载均衡器的负担,隧道模式就是优化这个问题的。所以隧道模式就是,把客户端发来的数据包,封装一个新的IP头标记(仅目的IP)发给RS,RS收到后,先把数据包的头解开,还原数据包,处理后,直接返回给客户端,不需要再经过负载均衡器。注意,由于RS需要对负载均衡器发过来的数据包进行还原,所以说必须支持IPTUNNEL协议。所以,在RS的内核中,必须编译支持IPTUNNEL这个选项

  • 优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

  • 缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

3、直接路由模式(LVS-DR)

这里写图片描述

原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

  • 优点:和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
  • 不足:要求负载均衡器的网卡必须与物理网卡在一个物理段上

4.LVS FULL NAT 模式

原理:FULL NAT 在client请求VIP 时,不仅替换了package 的dst ip,还替换了package的 src ip;但VIP 返回给client时也替换了src ip,具体分析如下:
首先client 发送请求[package] 给VIP;VIP 收到package后,会根据LVS设置的LB算法选择一个合适的realserver,然后把package 的DST IP 修改为realserver;把sorce ip 改成 lvs 集群的LB IP ;realserver 收到这个package后判断dst ip 是自己,就处理这个package ,处理完后把这个包发送给LVS VIP;LVS 收到这个package 后把sorce ip改成VIP的IP,dst ip改成 client ip然后发送给client。
FULL NAT 模式也不需要 LBIP 和realserver ip 在同一个网段;

  • full nat 跟nat 相比的优点是:保证RS回包一定能够回到LVS;因为源地址就是LVS–> 不确定
  • full nat 因为要更新sorce ip 所以性能正常比nat 模式下降 10%

负载均衡调度算法简介

   Director Server根据各台服务器的负载情况,通过高度算法动态选择一台Real Server

   LVS目前实现了10种调度算法

常用调度算法有4种(轮询、加权轮询、最少连接、加权最少连接)

  • 轮询(Round Robin)
    • 将客户端请求平均分发到Real Server
  • 加权轮询(Weighted Round Robin)
    • 根据Real Server的性能设置权重,再进行轮询调度
  • 最少连接(Least Connections)
    • 动态地将网络请求调度到已建立的连接数最少的服务器上
  • 加权最少连接( Weighted Least Connections )
    • 动态地将网络请求调度到已建立的连接数最少的服务器上
  • 基于局部性的最少链接(Locality-Based Least Connections)
    • 根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器
  • 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
    • 维护从一个目标IP地址到一台服务器的映射
    • 根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器
    • 当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
  • 目标地址散列(Destination Hashing)
    • 根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
  • 源地址散列(Source Hashing)

    • 根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空
  • 最短的期望的延迟(Shortest Expected Delay Scheduling SED)

    • 基于WLC算法(基于加权最少连接)
    • A、B、C三台机器分别权重1、2、3 ,连接数也分别是1、2、3。如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个
    • 使用sed算法后会进行这样一个运算:A(1+1)/1,B(1+2)/2,C(1+3)/3
    • 根据运算结果,把连接交给C
  • 最少队列调度(Never Queue Scheduling NQ)
    • 如果有台Real Server的连接数为0就直接分配过去,无需SED运算

LVS 四种工作模式基本配置

前期准备

  • IP配置
## LVS服务器
VIP:172.25.254.200
DIP:172.25.20.1
## WEB服务器1
web1:172.25.20.2
## WEB服务器2
web2:172.25.20.3

yum install ipvsadm -y
chkconfig ipvsadm on
service ipvsadm start
  • 服务安装与前期配置

    • LVS服务器(server1):
      • yum安装ipvsadm,如果出现“nothing to do”,而服务器上又为装过ipvsadm,则首先看你的yum源,可能是yum源不全导致安装失败,安装完成之后启动服务
    • WEB服务器1(server2):
    • WEB服务器2(server3):
      • 同WEB服务器1
  • WEB服务器1和WEB服务器2 nginx安装完成之后,修改下nginx默认发布页方便后面区分,在两台服务器上分别执行以下命令:

vim /usr/local/nginx/html/index.thml

<h1> nginx server 22222222 <h1>  ##在web2上输入的时候把22222222 换成33333333便于区分

lvs配置可以通过编辑配置文件进行配置,也可以通过脚本进行配置,个人推荐使用脚本,因为修改配置很方便

1. LVS—DR模式配置

DR模式配置通过命令的方式
a. 配置LVS服务器(server1)

#### LVS服务器(server1)
chkconfig ipvsadm on
service ipvsadm start
ipvsadm                             ##查看ipvsadm条目,如果存在可以执行下一条命令删除
ipvsadm -D -t 172.25.254.200:80     ##删除ipvsadm条目172.25.254.200:80 (一般用下面这条删除所有的命令)
ipvsadm -C          ##删除所有ipvsadm条目
ipvsadm -A -t 172.25.20.1:80 -s rr  ##添加ipvsadm条目,-A表示追加条目,-t表示使用tcp协议,-s rr表示使用轮询算法
ipvsadm -a -t 172.25.20.1:80 -r 172.25.20.2 -g      ##-a表示追加规则,-t表示使用tcp协议,-r表示real-server,-g表示使用DR模型

ipvsadm -a -t 172.25.20.1:80 -r 172.25.20.3 -g
ipvsadm

下图说明成功

这里写图片描述

我的是做过解析的,如果没做解析显示可能为

[root@server1 sbin]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
 -> RemoteAddress:Port           Forward Weight ActiveConn InActConn 
TCP  172.25.254.200:http rr 
 -> 172.25.20.2:http             Route   1      0          0 
 -> 172.25.20.1:http             Route   1      0          0        
b.配置后台的两个Real Server服务器(以web1为例,web2相同)
### Real Server服务器(server2)
[root@server2 ~] echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server2 ~] echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@server2 ~] echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server2 ~] echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@server2 ~] ifconfig lo:0 172.25.254.200 netmask 255.255.255.255 broadcast 172.25.20.1        ##在lo上设置集群服务的ip地址
[root@server2 ~] route add -host 172.25.254.200 dev lo:0       ##在lo上设置集群服务的路由
[root@server2 ~] route 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
10.10.6.200     *               255.255.255.255 UH    0      0        0 lo 
10.10.6.0       *               255.255.255.0   U     0      0        0 eth0 
link-local      *               255.255.0.0     U     1002   0        0 eth0 
default         172.25.254.200     0.0.0.0         UG    0      0        0 eth0 
有关arp_ignore的相关介绍:
  • arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式
    • 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
    • 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
    • 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
    • 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
    • 4-7 - 保留未使用
    • 8 -不回应所有(本地地址)的arp查询
有关arp_announce的相关介绍:
  • arp_announce:对网络接口上本地IP地址发出的ARP回应作出相应级别的限制
    • 0 - (默认) 回应在任意网络接口(eth0,eth1,lo)上的任何本地地址
    • 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
    • 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

其实就是路由器的问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话),当内网的机器要发送一个到外部的ip包,那么它就会请求路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面 的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。

arp缓存为什么会更新了,什么时候会更新呢,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。
在设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址

c.测试(浏览器测试或者curl测试,推荐用curl,浏览器缓存有时会对结果有影响)

这里写图片描述

这里写图片描述

d.相关脚本
####Director脚本
[root@server1 ~]# vim /etc/init.d/lvs_dr 

#!/bin/bash

# LVS script for VS/DR

/etc/rc.d/init.d/functions

VIP=172.25.20.1
RIP1=172.25.20.2
RIP2=172.25.20.3
PORT=80

case "$1" in
        start)
                echo "starting........"
                /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
                /sbin/route add -host $VIP dev eth0:0
                        # Since this is the Director we must be able to forward packets
                echo 1 > /proc/sys/net/ipv4/ip_forward
                        # Add an IP virtual service for VIP 10.10.6.200 port 80
                        # In this recipe, we will use the round-robin scheduling method.
                        # In production, however, you should use a weighted, dynamic scheduling method.
                /sbin/ipvsadm -C
                /sbin/ipvsadm -A -t $VIP:80 -s rr
                        # Now direct packets for this VIP to
                        # the real server IP (RIP) inside the cluster
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
#               /bin/touch /var/lock/subsys/ipvsadm &> /dev/null
                echo "success"
                ipvsadm
                ;;
        stop)
                        # Stop forwarding packets
                echo 0 > /proc/sys/net/ipv4/ip_forward
                        # Reset ipvsadm
                /sbin/ipvsadm -C
                        # Bring down the VIP interface
                /sbin/ifconfig eth0:0 down
                /sbin/route del $VIP
                /bin/rm -f /var/lock/subsys/ipvsadm
                echo "ipvs is stopped..."
                ;;
        status)
                if [ ! -e /var/lock/subsys/ipvsadm ]; then
                echo "ipvsadm is stopped ..."
                else
                echo "ipvs is running ..."
                ipvsadm -L -n
                fi
                ;;
        *)
                echo "Usage: $0 {start|stop|status}"
                ;;
esac

[root@server2 ~]# /etc/init.d/lvs_dr stop
[root@server2 ~]# /etc/init.d/lvs_dr start


####Real Server启动脚本(以web1为例,web2相同)
[root@server2 ~]# vim /etc/init.d/lvs_dr

#!/bin/bash

# Script to start LVS DR real server.
# description: LVS DR real server

. /etc/rc.d/init.d/functions
VIP=172.25.20.1
host=`/bin/hostname`

case "$1" in

start)
        # Start LVS-DR real server on this machine.
    /sbin/ifconfig lo down
    /sbin/ifconfig lo up
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
    /sbin/route add -host $VIP dev lo:0
    echo "success"
    route
    ;;
stop)
        # Stop LVS-DR real server loopback device(s).
    /sbin/ifconfig lo:0 down
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    ;;
status)
        # Status 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
        # Either the route or the lo:0 device
        # not found.
    echo "LVS-DR real server Stopped."
    else
    echo "LVS-DR real server Running."
    fi
    ;;
*)
        # Invalid entry.
    echo "$0: Usage: $0 {start|status|stop}"
    exit 1
    ;;
esac


[root@server2 ~]# /etc/init.d/lvs_dr stop
[root@server2 ~]# /etc/init.d/lvs_dr start



2. LVS—NAT模式的配置

NAT模式配置通过脚本实现
a. 配置LVS服务器(server1)

#### LVS服务器(server1)

vim /etc/init.d/lvs_nat

#!/bin/bash
VIP=172.25.254.200
RIP1=172.25.20.2
RIP2=172.25.20.3
case "$1" in
start)
        echo "start LVS of DirectorServer NAT"
        echo "1" >/proc/sys/net/ipv4/ip_forward
        /sbin/iptables -F
        /sbin/ipvsadm -C
        /sbin/ifconfig eth0:0 $VIP netmask 255.255.255.0 up
        /sbin/ipvsadm -A -t $VIP:80 -s rr
        /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m
        /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
        /sbin/ipvsadm
        ;;
stop)
        echo "stop LVS of DirectorServer NAT"
        echo "0" >/proc/sys/net/ipv4/ip_forward
        /sbin/ipvsadm -C
        /sbin/ifconfig eth0:0 down
        ;;
*)

/etc/init.d/lvs_nat stop
/etc/init.d/lvs_nat start       ##启动脚本,开启LVS服务

这里写图片描述

b.配置后台的两个Real Server服务器(以web1为例,web2相同)
### Real Server服务器(server2)

[root@server2 ~] iptables -F
[root@server2 ~] nginx 
[root@server2 ~] route del default     ##删除原来的默认网关
[root@server2 ~] route add default gw 172.25.254.200       ##后添加一个默认网关为LVS服务器上的Eth1 IP
[root@server2 ~] route 

这里写图片描述

c.测试 方法同上

这里写图片描述

这里写图片描述

3. LVS—FULL—NAT模式的配置

感谢关注,该模式暂时未测试通过,稍后更新。。。

4. LVS—TUN模式的配置

1.LVS server 配置
[root@server1 ~]# ifconfig tunl0 172.25.254.200 broadcast 172.25.254.200 netmask 255.255.255.255 up
[root@server1 ~]# ipvsadm -A -t 172.25.254.200:80 -s rr
Service already exists
[root@server1 ~]# ipvsadm -D -t 172.25.254.200:80
[root@server1 ~]#  ipvsadm -A -t 172.25.254.200:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.20.2 -i
[root@server1 ~]# ipvsadm -a -t 172.25.254.200:80 -r 172.25.20.3 -i
[root@server1 ~]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.200:http rr
  -> server2:http                 Tunnel  1      0          0         
  -> server3:http                 Tunnel  1      0          0         
[root@server1 ~]# 

这里写图片描述

2.后台两个Real Server服务器的配置(以web1为例,web2相同)
[root@server2 ~]# ifconfig tunl0 172.25.254.200 broadcast 172.25.254.200 netmask 255.255.255.255 up
[root@server2 ~]# echo 1 >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
[root@server2 ~]# echo 2 >/proc/sys/net/ipv4/conf/tunl0/arp_announce
[root@server2 ~]# echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@server2 ~]# echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce
[root@server2 ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.25.20.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
[root@server2 ~]# 

[root@server2 ~]# echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter
[root@server2 ~]# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
[root@server2 ~]# route add -host 172.25.254.200 dev tunl0

[root@server2 ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.25.254.200  *               255.255.255.255 UH    0      0        0 tunl0
172.25.20.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0

这里写图片描述

3.测试
在客户端上打开LVS上的VIP地址:172.25.254.200即可打开网页,刷新也可以看到网页在变化;
以上是通过命令行的方式实现的,下面提供相应的脚本
####1.LVS server 配置

[root@server1 ~]# vim /etc/init.d/lvs_tun

#!/bin/bash
VIP=172.25.254.200
RIP1=172.25.20.2
RIP2=172.25.20.3
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of DirectorServer Tun"
/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route del -host $VIP
/sbin/route add -host $VIP dev tunl0
/sbin/ipvsadm -C
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -i
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -i
/sbin/ipvsadm
echo "success"
;;
stop)
echo "stop LVS of DirectorServer Tun"
/sbin/ifconfig tunl0 down
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

[root@server1 ~]# chmod +x /etc/init.d/lvs_tun
[root@server1 ~]# /etc/init.d/lvs_tun stop
[root@server1 ~]# /etc/init.d/lvs_tun start

这里写图片描述


####2.后台两个Real Server服务器的配置(以web1为例,web2相同)
[root@server2 ~]# vim /etc/init.d/lvs_tun

#!/bin/bash
VIP=172.25.254.200
. /etc/rc.d/init.d/functions
case "$1" in
start)
echo "start LVS of RealServer Tun"
/sbin/ifconfig tunl0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route del -host $VIP
/sbin/route add -host $VIP dev tunl0
echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "success"
;;
stop)
echo "close LVS of RealServer Tun"
/sbin/route del -host $VIP
/sbin/ifconfig tunl0 down
echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/tunl0/rp_filter

;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

[root@server2 ~]# chmod +x /etc/init.d/lvs_tun 
[root@server2 ~]# /etc/init.d/lvs_tun stop
[root@server2 ~]# /etc/init.d/lvs_tun start

这里写图片描述

测试
在客户端上打开LVS上的VIP地址:172.25.254.200即可打开网页,刷新也可以看到网页在变化;
<think>嗯,用户想了解LVS-NAT模式的工作原理和数据包转发流程。这个问题涉及网络负载均衡的核心技术,需要从请求和响应两个方向详细说明数据包的变化过程。 用户可能是运维工程师或系统架构师,正在搭建负载均衡环境。ta的提问非常专业,直接聚焦在NAT模式的核心机制上,说明对网络层有一定基础。不过从ta没有追问具体配置细节来看,可能更关注理论层面。 参考站内资料,LVS-NAT模式有几个关键特征:Director要充当网关,需要修改双方向数据包的IP地址,且响应必须回经Director。这些特性在引用[2][3]中有明确佐证。特别要注意引用[3]详细描述了七步转发流程,这和我的知识库完全吻合。 数据包处理流程需要分请求和响应两条路径解释: 请求方向,重点说明DNAT转换过程。当客户端访问VIP时,Director会通过ip_vs模块修改目标地址为Real Server的RIP,同时源地址保留为CIP。这里需要强调Director必须开启路由转发功能(如引用[4]实验步骤2所示)。 响应方向则更复杂。Real Server处理完请求后,会以RIP为源地址、CIP为目标地址返回数据包。但此时由于Director是网关(引用[2]),数据包会被路由到Director。Director必须做SNAT,把源地址替换回VIP,否则客户端会直接收到来自RIP的响应而丢弃。 技术难点在于:1)Real Server的默认网关必须指向Director(引用[4]实验步骤3/4);2)VIP和RIP需要在不同网段(引用[5]拓扑图);3)Director容易成为瓶颈。这些限制在引用[1]的DR模式对比中也有提及。 最后考虑用双色流程图辅助说明:红色表示请求路径,蓝色表示响应路径,在关键节点标注地址变化。这样比纯文字更直观,也符合用户"了解流程"的需求。拓扑示例采用引用[5]的IP设置,保持案例一致性。</think>好的,我们来详细解释 LVS-NAT 模式的工作原理和数据包转发流程。 **LVS-NAT 模式工作原理** LVS-NAT (Network Address Translation) 模式是一种基于网络层(第3层)的负载均衡技术。其核心思想是**负载均衡器(Director Server, DS)充当所有后端真实服务器(Real Server, RS)的网关**,并通过修改进出数据包的 IP 地址(主要是目标地址和源地址)来实现请求的转发和响应的返回。 关键特征: 1. **Director 是网关**: Director 拥有一个面向客户端的公网 IP(VIP, Virtual IP)和一个连接后端 RS 的内网 IP(DIP, Director IP)。所有 RS 的默认网关**必须**设置为 Director 的 DIP。 2. **地址转换**: * **入站请求 (Client -> Director -> RS)**: Director 将目标地址由 VIP 修改为选定的 RS 的 RIP(Real Server IP)。 * **出站响应 (RS -> Director -> Client)**: Director 将源地址由 RS 的 RIP 修改回 VIP。 3. **双向流量**: **所有流量**(客户端的请求和 RS 的响应)都必须经过 Director。这既是其工作原理的基础,也是其扩展性的主要瓶颈。 4. **网络要求**: RS 必须位于 Director 的**同一个私有局域网**内,使用私有 IP 地址(RIP)。Director 需要连接两个网络:公网(或客户端网络,拥有 VIP)和私网(RS 网络,拥有 DIP 和 RIPs)。 5. **端口映射(可选)**: NAT 模式也支持端口映射(PAT),即 Director 可以修改目标端口(例如,将访问 VIP:80 的请求转发到某个 RS 的 RIP:8080),并在返回响应时再修改回源端口。 **数据包转发流程详解** 假设: * 客户端 IP: `CIP` * Director 虚拟 IP (面向客户端): `VIP` * Director 内网 IP (面向 RS): `DIP` * 选定的真实服务器 IP: `RIP` (假设为 `192.168.1.100`) **1. 客户端发起请求:** * 客户端发送一个请求数据包: * **源地址 (Source IP):** `CIP` * **目标地址 (Destination IP):** `VIP` * **源端口 (Source Port):** `CIP_Port` * **目标端口 (Destination Port):** `Port` (例如 80) * 该数据包根据路由规则到达 Director 的 VIP 接口。 **2. Director 接收并修改请求 (DNAT):** * Director 的 IPVS 模块根据配置负载均衡算法(如轮询、加权轮询、最少连接等)从 RS 池中选择一个合适的 RS(假设为 `RIP = 192.168.1.100`)。 * Director **修改请求数据包**: * **目标地址 (Destination IP):** 由 `VIP` 修改为选定的 `RIP (192.168.1.100)` * **源地址 (Source IP):** **保持不变**,仍为 `CIP` (这是标准NAT模式的关键点,源地址在转发请求时不变)。 * (可选) 如果配置了端口映射,目标端口也可能被修改。 * 修改后的数据包: * **源地址 (Source IP):** `CIP` * **目标地址 (Destination IP):** `RIP (192.168.1.100)` * **源端口 (Source Port):** `CIP_Port` * **目标端口 (Destination Port):** `Port` (或映射后的端口) * Director 通过其连接 RS 网络的接口(DIP)将这个修改后的数据包发送给选定的 RS。 **3. Real Server 接收并处理请求:** * RS (`192.168.1.100`) 收到数据包: * 源地址是 `CIP`,目标地址是自己的 `RIP`。 * RS 认为这是客户端 `CIP` 直接发给自己 `RIP` 的请求。 * RS 处理该请求,并生成响应数据包。 **4. Real Server 发送响应:** * RS 发送响应数据包: * **源地址 (Source IP):** `RIP (192.168.1.100)` (RS 自己的 IP) * **目标地址 (Destination IP):** `CIP` (原始请求的源地址) * **源端口 (Source Port):** `Port` (或映射后的端口) * **目标端口 (Destination Port):** `CIP_Port` * 因为 RS 的**默认网关**被设置为 Director 的 DIP (`DIP`),所以这个目标地址为 `CIP`(通常是一个公网地址)的数据包会被 RS 发送给它的网关,即 Director 的 DIP。 **5. Director 接收并修改响应 (SNAT):** * Director 在其 DIP 接口上收到来自 RS (`192.168.1.100`) 的响应数据包: * 源地址是 `RIP (192.168.1.100)` * 目标地址是 `CIP` * Director 的 IPVS 模块识别出这个响应对应于之前转发的某个请求(通过连接跟踪表)。 * Director **修改响应数据包**: * **源地址 (Source IP):** 由 `RIP (192.168.1.100)` 修改回 `VIP` * **目标地址 (Destination IP):** **保持不变**,仍为 `CIP` * (可选) 如果之前修改了目标端口,源端口也需要相应修改回来。 * 修改后的响应数据包: * **源地址 (Source IP):** `VIP` * **目标地址 (Destination IP):** `CIP` * **源端口 (Source Port):** `Port` (原始端口,如 80) * **目标端口 (Destination Port):** `CIP_Port` **6. Director 发送响应给客户端:** * Director 通过其 VIP 接口(面向客户端网络)将修改后的响应数据包发送给客户端 `CIP`。 * 客户端收到响应数据包: * 源地址是 `VIP` * 目标地址是 `CIP` * 客户端认为响应是它最初请求的 `VIP` 发回的,完全感知不到后端 RS (`RIP`) 的存在。 **总结流程:** ```mermaid graph LR A[客户端 CIP] -- 请求: CIP -> VIP --> B[Director VIP/DIP] B -- DNAT: VIP->RIP<br>源 CIP 不变 --> C[Real Server RIP] C -- 响应: RIP -> CIP --> B B -- SNAT: RIP->VIP<br>目标 CIP 不变 --> A ``` **关键点回顾:** 1. **Director 是网关**: RS 的默认网关必须指向 Director 的 DIP[^2][^4][^5]。 2. **请求修改 (DNAT)**: Director 只修改请求包的**目标 IP** (VIP -> RIP),源 IP (CIP) 保持不变[^3]。 3. **响应路径**: RS 的响应直接发送给它的网关 (Director 的 DIP),**不是直接给客户端**。 4. **响应修改 (SNAT)**: Director 修改响应包的**源 IP** (RIP -> VIP),目标 IP (CIP) 保持不变[^3]。 5. **双向流量**: 所有请求和响应数据包都必须流经 Director[^1][^2][^3]。 6. **网络隔离**: RS 使用私有 IP (RIP),位于 Director 的内网侧[^1][^4][^5]。 7. **客户端视角**: 客户端只与 VIP 通信,对后端的 RS 完全透明。 **优缺点:** * **优点**: * 配置相对简单。 * RS 可以使用任何操作系统(只要支持 TCP/IP)。 * RS 只需要私有 IP,节省公网地址。 * 支持端口映射。 * **缺点**: * **性能瓶颈**: Director 需要处理所有进出流量(请求和响应),容易成为性能瓶颈[^1][^3]。 * **扩展性限制**: 受限于 Director 的网络带宽和处理能力。 * **单点故障**: Director 故障会导致整个服务不可用(需要 HA 方案解决)。 * **网络要求**: RS 必须和 Director 在同一个二层网络(或通过路由可达,且网关指向 Director)。 [^1]: 【lvslvs-NAT模式和lvs-DR模式。DR模式(直接路由):... 只有请求数据包需要经过负载调度器,响应数据包直接由Real Server发送给客户端。Real Server必须与Director处于同一局域网。适用于大型规模的负载均衡场景。 [^2]: LVS/NAT工作模式介绍及配置LVSLinux Virtual Server)的网络地址转换(NAT)模式... 在NAT模式中,Director Server(DS)充当所有服务器节点的网关,既是客户端请求的入口,也是Real Server响应客户端的出口。 [^3]: LVS-NAT模式的原理是什么?... 负载均衡器将请求的数据包的源地址修改为自身的IP地址,目标地址修改为选定的真实服务器的IP地址... 负载均衡器接收到真实服务器的响应后,将响应的数据包的源地址修改为虚拟IP地址,目标地址修改为客户端的IP地址。 [^4]: lvs-nat模式实验详解... 实验主机准备... lvs中开启路由转发功能... webserver1/2的ip配置(网关指向DIP)... 安装lvs软件ipvsadm... 添加策略... [^5]: LVS的NAT模式实战... 外网:(VIP 192.168.10.143)... web01真实web服务器Rs 192.168.1.200... web02真实web服务器Rs 192.168.1.201... client测试... RS 使用私有IP,网关指向DIP。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值