【LVS入门宝典】LVS-TUN模式原理与配置:跨越网络界限的负载均衡解决方案

目录

引言

[1 LVS-TUN模式基础概念解析](#1 LVS-TUN模式基础概念解析)

[1.1 什么是LVS-TUN模式?](#1.1 什么是LVS-TUN模式?)

[1.2 TUN模式与DR、NAT模式的对比](#1.2 TUN模式与DR、NAT模式的对比)

[1.3 TUN模式的工作原理详解](#1.3 TUN模式的工作原理详解)

[2 LVS-TUN模式环境规划与准备](#2 LVS-TUN模式环境规划与准备)

[2.1 环境设计](#2.1 环境设计)

[2.2 系统基础环境配置](#2.2 系统基础环境配置)

[3 LVS-TUN模式详细配置实践](#3 LVS-TUN模式详细配置实践)

[3.1 负载均衡器(Director)配置](#3.1 负载均衡器(Director)配置)

[3.2 真实服务器(Real Server)配置](#3.2 真实服务器(Real Server)配置)

[3.3 高级隧道配置优化](#3.3 高级隧道配置优化)

[4 LVS-TUN模式关键技术深度解析](#4 LVS-TUN模式关键技术深度解析)

[4.1 IP隧道技术原理详解](#4.1 IP隧道技术原理详解)

[4.2 数据包流向深度分析](#4.2 数据包流向深度分析)

[4.3 调度算法与持久连接](#4.3 调度算法与持久连接)

[5 总结](#5 总结)


引言

Linux Virtual Server(LVS)作为开源负载均衡领域的佼佼者,提供了三种核心工作模式:NAT、DR和TUN模式。其中,TUN(IP Tunneling)模式凭借其独特的跨网络部署能力,在分布式场景中展现出无可替代的价值。
LVS-TUN模式通过IP隧道技术打破了传统负载均衡的地理限制,允许真实服务器分布在不同网络环境中,为构建跨地域、跨数据中心的负载均衡系统提供了技术可能。这种模式特别适用于云计算环境、CDN网络和全球分布式系统等场景。

1 LVS-TUN模式基础概念解析

1.1 什么是LVS-TUN模式?

  • LVS-TUN模式是LVS的三种工作模式之一,它基于IP隧道(IP Tunneling)技术实现负载均衡
  • TUN是"Tunnel"的缩写,这种模式的核心思想是通过封装原始IP数据包,在负载均衡器(Director)和真实服务器(Real Server)之间建立虚拟的通信通道
  • 与DR模式不同,TUN模式不要求Director和Real Server位于同一物理网络段
  • 通过IP隧道技术,Real Server可以分布在不同的网络位置,甚至跨越公网进行通信,这种架构为分布式系统提供了极大的灵活性

1.2 TUN模式与DR、NAT模式的对比

|---------------|----------|------------|-----------|
| 特性维度 | NAT模式 | DR模式 | TUN模式 |
| 网络要求 | 同一网络段 | 同一网络段 | 可跨不同网络 |
| 性能表现 | 较低(双向处理) | 高(直接返回) | 较高(隧道开销) |
| 配置复杂度 | 简单 | 中等(需ARP抑制) | 复杂(需隧道支持) |
| Real Server位置 | 必须同一网络 | 必须同一网络 | 可分布式部署 |
| 可扩展性 | 有限 | 良好 | 优秀 |
| 适用场景 | 小型集群 | 高性能集群 | 分布式集群 |

1.3 TUN模式的工作原理详解

请求处理阶段:

  • 客户端发送请求:客户端向虚拟IP(VIP)发送请求包,源IP为CIP,目标IP为VIP
  • Director接收请求:Director在VIP上接收请求包,根据调度算法选择一台Real Server
  • IP隧道封装:Director将原始IP数据包封装在新的IP包中,新包源IP为DIP,目标IP为RIP
  • 隧道传输:封装后的数据包通过IP网络传输到Real Server
    响应处理阶段:
  • 解封装处理:Real Server接收隧道包,解封装恢复原始数据包(CIP→VIP)
  • 请求处理:Real Server处理请求并生成响应数据
  • 直接响应:Real Server直接将响应包发送给客户端,源IP为VIP,目标IP为CIP
  • 客户端接收:客户端收到响应,认为来自VIP

2 LVS-TUN模式环境规划与准备

2.1 环境设计

|--------|----------|---------------|--------------|----------|
| 角色 | 主机名 | 公网IP | 内网IP | 隧道IP |
| 负载均衡器 | director | 203.0.113.10 | 192.168.1.10 | 10.0.0.1 |
| 真实服务器1 | rs1 | 203.0.113.11 | 192.168.1.11 | 10.0.0.2 |
| 真实服务器2 | rs2 | 198.51.100.22 | 192.168.2.22 | 10.0.0.3 |
| 客户端 | client | 203.0.113.50 | - | - |

网络规划说明:

  • 公网IP:模拟互联网环境,Director和Real Server可以通过公网通信
  • 内网IP:各节点的内部网络地址
  • 隧道IP:用于IP隧道通信的虚拟IP地址段
  • VIP(虚拟IP):203.0.113.100,对外提供服务的虚拟IP

2.2 系统基础环境配置

在所有服务器上执行基础配置:

  • 步骤1:系统更新和基础软件安装

    更新系统包

    yum update -y

    安装必要工具

    yum install -y wget curl vim net-tools iproute tcpdump

    关闭SELinux

    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

    停止防火墙(生产环境应配置规则)

    systemctl stop firewalld
    systemctl disable firewalld

  • 步骤2:配置主机名和hosts解析

    在director上

    hostnamectl set-hostname director

    在rs1上

    hostnamectl set-hostname rs1

    在rs2上

    hostnamectl set-hostname rs2

    配置hosts文件(所有节点)

    cat >> /etc/hosts << EOF
    203.0.113.10 director
    203.0.113.11 rs1
    198.51.100.22 rs2
    203.0.113.100 www.example.com
    EOF

  • 步骤3:配置网络接口

    在director上配置VIP

    cd /etc/sysconfig/network-scripts/
    cat > ifcfg-eth0:0 << EOF
    DEVICE=eth0:0
    BOOTPROTO=static
    IPADDR=203.0.113.100
    NETMASK=255.255.255.255
    ONBOOT=yes
    EOF

    systemctl restart network

3 LVS-TUN模式详细配置实践

3.1 负载均衡器(Director)配置

  • 步骤1:安装必要的软件包

    安装IPVS管理工具和隧道支持

    yum install -y ipvsadm iproute

    检查内核隧道支持

    modprobe ipip
    lsmod | grep ipip

    永久加载隧道模块

    echo "modprobe ipip" >> /etc/rc.local
    chmod +x /etc/rc.local

  • 步骤2:配置IP隧道接口

    创建隧道接口tunl0

    ip tunnel add tunl0 mode ipip remote any local 203.0.113.10
    ip addr add 10.0.0.1/24 dev tunl0
    ip link set tunl0 up

    验证隧道接口

    ip addr show tunl0
    ip route show table all

    配置隧道接口持久化

    cat > /etc/sysconfig/network-scripts/ifcfg-tunl0 << EOF
    DEVICE=tunl0
    BOOTPROTO=none
    ONBOOT=yes
    TYPE=IPIP
    PEER_OUTER_IPADDR=any
    PEER_INNER_IPADDR=10.0.0.2
    MY_INNER_IPADDR=10.0.0.1
    MY_OUTER_IPADDR=203.0.113.10
    EOF

  • 步骤3:配置IPVS规则

    添加虚拟服务

    ipvsadm -A -t 203.0.113.100:80 -s rr

    添加真实服务器(通过隧道IP)

    ipvsadm -a -t 203.0.113.100:80 -r 10.0.0.2:80 -i
    ipvsadm -a -t 203.0.113.100:80 -r 10.0.0.3:80 -i

    查看IPVS规则

    ipvsadm -Ln

    保存IPVS规则

    ipvsadm-save > /etc/sysconfig/ipvsadm

    创建持久化服务

    cat > /etc/systemd/system/ipvs-persist.service << EOF
    [Unit]
    Description=IPVS Rules Persistence
    After=network.target

    [Service]
    Type=oneshot
    ExecStart=/sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm
    ExecStop=/sbin/ipvsadm-save > /etc/sysconfig/ipvsadm
    RemainAfterExit=yes

    [Install]
    WantedBy=multi-user.target
    EOF

    systemctl daemon-reload
    systemctl enable ipvs-persist

  • 步骤4:配置内核参数

    启用IP转发

    echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

    TUN模式特定参数

    echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
    echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
    echo "net.ipv4.conf.default.rp_filter = 0" >> /etc/sysctl.conf
    echo "net.ipv4.conf.tunl0.rp_filter = 0" >> /etc/sysctl.conf

    应用配置

    sysctl -p

3.2 真实服务器(Real Server)配置

在每台Real Server上执行以下配置:

  • 步骤1:安装Web服务和隧道支持

    安装Apache

    yum install -y httpd

    创建测试页面(在rs1上)

    echo "Hello from Real Server 1 - TUN Mode" > /var/www/html/index.html

    在rs2上

    echo "Hello from Real Server 2 - TUN Mode" > /var/www/html/index.html

    启动Web服务

    systemctl start httpd
    systemctl enable httpd

  • 步骤2:配置隧道接口

    加载IPIP隧道模块

    modprobe ipip

    创建隧道接口(在rs1上)

    ip tunnel add tunl0 mode ipip remote 203.0.113.10 local 203.0.113.11
    ip addr add 10.0.0.2/24 dev tunl0
    ip link set tunl0 up

    在rs2上

    ip tunnel add tunl0 mode ipip remote 203.0.113.10 local 198.51.100.22
    ip addr add 10.0.0.3/24 dev tunl0
    ip link set tunl0 up

    验证隧道接口

    ip addr show tunl0

  • 步骤3:配置VIP和路由

    在环回接口上配置VIP

    ip addr add 203.0.113.100/32 dev lo

    添加路由,确保响应包通过正确接口

    ip route add 203.0.113.100/32 dev lo table local

    避免RPF过滤问题

    echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter
    echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

  • 步骤4:配置ARP抑制

    创建ARP抑制脚本

    cat > /etc/init.d/lvs-tun << 'EOF'
    #!/bin/bash

    LVS TUN mode configuration script

    VIP=203.0.113.100

    case "$1" in
    start)
    # 配置ARP抑制参数
    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/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

    复制代码
      # 添加VIP到lo接口
      ip addr add $VIP/32 dev lo
      
      # 配置路由
      ip route add $VIP/32 dev lo scope host
      
      # 禁用RPF过滤
      for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
          echo 0 > $i
      done
      ;;

    stop)
    # 移除VIP
    ip addr del $VIP/32 dev lo 2>/dev/null

    复制代码
      # 恢复ARP参数
      echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
      echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
      echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
      ;;

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

    chmod +x /etc/init.d/lvs-tun
    /etc/init.d/lvs-tun start

    设置开机自启动

    echo "/etc/init.d/lvs-tun start" >> /etc/rc.local
    chmod +x /etc/rc.local

3.3 高级隧道配置优化

  • 步骤1:配置持久化隧道接口

    创建隧道接口配置文件

    cat > /etc/sysconfig/network-scripts/ifcfg-tunl0 << EOF
    DEVICE=tunl0
    BOOTPROTO=none
    ONBOOT=yes
    TYPE=IPIP
    PEER_OUTER_IPADDR=203.0.113.10 # Director公网IP
    PEER_INNER_IPADDR=10.0.0.1 # Director隧道IP
    MY_INNER_IPADDR=10.0.0.2 # 本地隧道IP
    MY_OUTER_IPADDR=203.0.113.11 # 本地公网IP
    EOF

  • 步骤2:配置隧道健康检查

    创建隧道监控脚本

    cat > /usr/local/bin/tunnel-monitor.sh << 'EOF'
    #!/bin/bash

    TUNNEL_DEV="tunl0"
    DIRECTOR_IP="10.0.0.1"
    CHECK_INTERVAL=30

    while true; do
    if ! ping -c 1 -W 1 -I TUNNEL_DEV DIRECTOR_IP &> /dev/null; then
    logger "LVS-TUN: Tunnel is down, attempting to restart"
    ip link set TUNNEL_DEV down ip link set TUNNEL_DEV up
    sleep 5
    fi
    sleep $CHECK_INTERVAL
    done
    EOF

    chmod +x /usr/local/bin/tunnel-monitor.sh

    创建systemd服务

    cat > /etc/systemd/system/tunnel-monitor.service << EOF
    [Unit]
    Description=LVS TUN Tunnel Monitor
    After=network.target

    [Service]
    Type=simple
    ExecStart=/usr/local/bin/tunnel-monitor.sh
    Restart=always

    [Install]
    WantedBy=multi-user.target
    EOF

    systemctl daemon-reload
    systemctl enable tunnel-monitor
    systemctl start tunnel-monitor

4 LVS-TUN模式关键技术深度解析

4.1 IP隧道技术原理详解

IP隧道是TUN模式的核心技术,理解其工作原理对于故障排查和性能优化至关重要。
封装过程分析:

  • 原始数据包:CIP → VIP (TCP端口80)
  • 封装后数据包:DIP → RIP (IP协议号4),内部包含原始数据包
  • 协议号4:表示IP-in-IP封装,这是IP隧道的标准协议号
    解封装过程:
  • Real Server收到DIP→RIP的数据包
  • 内核识别协议号为4,进行IP-in-IP解封装
  • 提取出原始数据包CIP→VIP,交给上层协议处理

4.2 数据包流向深度分析

  • 在Director上抓包分析:

    查看原始请求和隧道封装

    tcpdump -i any -n host 203.0.113.100

    同时查看eth0和tunl0接口

    tcpdump -i eth0 -n host 203.0.113.10
    tcpdump -i tunl0 -n

  • 在Real Server上抓包分析:

    查看隧道包和解封装后的包

    tcpdump -i eth0 -n ip proto 4
    tcpdump -i tunl0 -n
    tcpdump -i lo -n host 203.0.113.100

4.3 调度算法与持久连接

  • 调度算法选择建议:

    查看支持的调度算法

    cat /proc/net/ip_vs_schedulers

    根据场景选择算法

    ipvsadm -E -t 203.0.113.100:80 -s wlc # 加权最少连接
    ipvsadm -E -t 203.0.113.100:80 -s sh # 源地址哈希(会话保持)

  • 持久连接配置:

    设置持久连接超时(秒)

    ipvsadm -E -t 203.0.113.100:80 -p 3600

    基于客户端IP的持久性

    ipvsadm -A -t 203.0.113.100:80 -s sh -p 3600

5 总结

LVS-TUN模式作为一种先进的负载均衡解决方案,通过IP隧道技术实现了跨网络边界的服务器集群部署。与DR模式相比,TUN模式的最大优势在于支持分布式部署,适用于云计算、CDN等需要跨地域负载均衡的场景。然而,这种灵活性也带来了配置复杂性和性能开销的增加。
在实际应用中,建议根据具体业务需求选择合适的工作模式。对于同数据中心的集群,DR模式可能是更优选择;而对于分布式环境,TUN模式则展现出其独特价值。

相关推荐
Yyyy4822 小时前
LVS -DR模式
lvs
IT成长日记2 小时前
【LVS入门宝典】LVS-TUN模式配置实战以及配置关键点:Real Server的路由表调整、ipip模块加载
linux·运维·服务器·lvs·tun
有谁看见我的剑了?2 小时前
LVS虚拟调度器学习
学习·lvs
“αβ”2 小时前
网络编程套接字(三)---简单的TCP网络程序
linux·服务器·网络·c++·网络协议·tcp/ip·套接字
HCIE考证研究所2 小时前
CCIE网络工程师考哪个方向最好?CCIE选择攻略
网络
x-cmd2 小时前
[x-cmd] x-cmd 对 Xonsh 的支持
linux·运维·服务器·终端·命令行
会开花的二叉树3 小时前
实战:基于 BRPC+Etcd 打造轻量级 RPC 服务 —— 从注册到调用的完整实现
网络·数据库·c++·rpc·etcd
打不了嗝 ᥬ᭄3 小时前
【Linux】网络基础
linux·运维·网络
敲上瘾3 小时前
HTTP协议工作原理与生产环境服务器搭建实战
服务器·网络·c++·网络协议·http