HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • 网络架构师学习手册

    • 网络架构师学习教程
    • 基础篇

      • 第1章 网络模型与数据流转
      • 第2章 以太网与二层通信
      • 第3章 IP路由与三层转发
      • 第4章 TCP与可靠传输
      • 第5章 应用层协议
    • Linux网络栈

      • 第6章 数据包接收路径
      • 第7章 多核网络优化
      • 第8章 Netfilter与防火墙
      • 第9章 流量控制与QoS
    • 虚拟网络

      • 第10章 Network Namespace基础
      • 第11章 Bridge与互联
      • 第12章 VXLAN与Overlay网络
      • 第13章 OVS与SDN
    • Kubernetes网络

      • 第14章 CNI模型与实现
      • 第15章 kube-proxy与Service实现
      • 第16章 CoreDNS与服务发现
      • 第17章 NetworkPolicy与安全隔离
      • 第18章 Calico网络深度解析
      • 第19章 Cilium与eBPF网络
    • 网络架构

      • 第20章 网络设备与拓扑设计
      • 第21章 网络容量规划与计算
      • 第22章 负载均衡架构设计
      • 第23章 高可用网络架构
      • 第24章 网络安全架构
    • 性能调优

      • 第25章 系统级网络调优
      • 第26章 故障排查方法论
      • 第27章 生产环境案例分析
    • 前沿技术

      • 第28章 eBPF深度实践
      • 第29章 ServiceMesh与边车代理
      • 第30章 网络技术趋势与未来展望
    • 附录

      • 附录A:命令速查手册
      • 附录B:排错决策树
      • 附录C:学习资源
      • 附录D:技能图谱

第12章 VXLAN与Overlay网络

学习目标

  • 理解VXLAN协议原理和封装机制
  • 掌握VXLAN的配置和故障排查方法
  • 了解Overlay网络在云环境中的应用
  • 能够设计基于VXLAN的容器网络方案

前置知识

  • 第10章:Network Namespace基础
  • 第11章:Linux Bridge与互联
  • 第3章:IP与路由

12.1 VXLAN协议原理

12.1.1 什么是VXLAN

VXLAN(Virtual eXtensible LAN)是一种网络虚拟化技术,通过UDP封装实现跨三层的二层网络扩展。

核心特点:

  • 24位VNI(VXLAN Network Identifier),支持1600万个虚拟网络
  • 基于UDP封装,可穿越传统网络设备
  • 支持多播和单播模式
  • 与现有网络基础设施兼容

12.1.2 VXLAN数据包结构

+-------------------+
|   Outer Ethernet  | 14 bytes
+-------------------+
|   Outer IP        | 20 bytes (IPv4)
+-------------------+
|   Outer UDP       | 8 bytes
+-------------------+
|   VXLAN Header    | 8 bytes
+-------------------+
|   Inner Ethernet  | 14 bytes
+-------------------+
|   Inner IP        | 20 bytes
+-------------------+
|   Inner TCP/UDP   | 8 bytes
+-------------------+
|   Payload         | Variable
+-------------------+

VXLAN Header结构:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|R|R|R|I|R|R|R|            Reserved                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                VXLAN Network Identifier (VNI)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Reserved                                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

12.1.3 VXLAN工作流程

  1. 学习阶段:VTEP学习MAC地址与IP地址的映射关系
  2. 封装阶段:将原始以太网帧封装在UDP包中
  3. 传输阶段:通过底层IP网络传输
  4. 解封装阶段:目标VTEP解封装并转发到目标主机

12.2 Linux VXLAN实现

12.2.1 VXLAN接口创建

# 创建VXLAN接口
ip link add vxlan0 type vxlan \
    id 100 \
    local 192.168.1.10 \
    remote 192.168.1.20 \
    dstport 4789 \
    dev eth0

# 启动接口
ip link set vxlan0 up

# 配置IP地址
ip addr add 10.0.0.1/24 dev vxlan0

参数说明:

  • id 100:VNI标识符
  • local:本地VTEP IP地址
  • remote:对端VTEP IP地址
  • dstport:VXLAN端口(默认4789)
  • dev:底层网络接口

12.2.2 多播模式配置

# 创建多播VXLAN接口
ip link add vxlan1 type vxlan \
    id 200 \
    group 239.1.1.1 \
    dstport 4789 \
    dev eth0

# 启动并配置
ip link set vxlan1 up
ip addr add 10.1.0.1/24 dev vxlan1

12.2.3 查看VXLAN配置

# 查看VXLAN接口信息
ip -d link show vxlan0

# 查看VXLAN FDB表
bridge fdb show dev vxlan0

# 查看VXLAN统计信息
cat /proc/net/vxlan

12.3 实验:构建VXLAN网络

12.3.1 实验环境准备

环境要求:

  • 两台Linux主机(物理机或虚拟机)
  • 网络互通
  • 支持VXLAN的内核(3.7+)

网络拓扑:

Host A (192.168.1.10)          Host B (192.168.1.20)
┌─────────────────┐            ┌─────────────────┐
│   vxlan0        │            │   vxlan0        │
│   10.0.0.1/24   │◄──────────►│   10.0.0.2/24   │
│   VNI: 100      │            │   VNI: 100      │
└─────────────────┘            └─────────────────┘

12.3.2 实验步骤

步骤1:在Host A上配置VXLAN

# 创建VXLAN接口
ip link add vxlan0 type vxlan \
    id 100 \
    local 192.168.1.10 \
    remote 192.168.1.20 \
    dstport 4789 \
    dev eth0

# 启动接口
ip link set vxlan0 up

# 配置IP地址
ip addr add 10.0.0.1/24 dev vxlan0

# 查看配置
ip addr show vxlan0

步骤2:在Host B上配置VXLAN

# 创建VXLAN接口
ip link add vxlan0 type vxlan \
    id 100 \
    local 192.168.1.20 \
    remote 192.168.1.10 \
    dstport 4789 \
    dev eth0

# 启动接口
ip link set vxlan0 up

# 配置IP地址
ip addr add 10.0.0.2/24 dev vxlan0

步骤3:测试连通性

# 在Host A上ping Host B
ping 10.0.0.2

# 抓包观察VXLAN封装
tcpdump -i eth0 -n port 4789

# 查看VXLAN FDB表
bridge fdb show dev vxlan0

预期输出:

# ping结果
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.123 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.098 ms

# tcpdump输出
15:30:45.123456 IP 192.168.1.10.12345 > 192.168.1.20.4789: VXLAN, vni 100
15:30:45.123789 IP 192.168.1.20.4789 > 192.168.1.10.12345: VXLAN, vni 100

12.3.3 高级实验:多播VXLAN

步骤1:配置多播VXLAN

# Host A
ip link add vxlan-mcast type vxlan \
    id 200 \
    group 239.1.1.1 \
    dstport 4789 \
    dev eth0

ip link set vxlan-mcast up
ip addr add 10.1.0.1/24 dev vxlan-mcast

# Host B
ip link add vxlan-mcast type vxlan \
    id 200 \
    group 239.1.1.1 \
    dstport 4789 \
    dev eth0

ip link set vxlan-mcast up
ip addr add 10.1.0.2/24 dev vxlan-mcast

步骤2:测试多播通信

# 启动多播接收
ip maddr add 239.1.1.1 dev eth0

# 测试连通性
ping 10.1.0.2

# 查看多播组
ip maddr show

12.4 VXLAN与容器网络

12.4.1 Docker VXLAN网络

# 创建VXLAN网络
docker network create \
    --driver overlay \
    --subnet=10.0.0.0/24 \
    --opt encrypted=true \
    vxlan-net

# 运行容器
docker run -d --name web1 --network vxlan-net nginx
docker run -d --name web2 --network vxlan-net nginx

# 测试容器间通信
docker exec web1 ping web2

12.4.2 Kubernetes VXLAN配置

Flannel VXLAN配置示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
data:
  cni-conf.json: |
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        }
      ]
    }
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan",
        "VNI": 1,
        "Port": 8472
      }
    }

12.5 VXLAN故障排查

12.5.1 常见问题诊断

问题1:VXLAN接口无法启动

# 检查内核支持
modinfo vxlan

# 检查端口占用
netstat -ulnp | grep 4789

# 检查网络连通性
ping <remote-vtep-ip>

问题2:VXLAN通信失败

# 检查FDB表
bridge fdb show dev vxlan0

# 检查路由表
ip route show table all

# 抓包分析
tcpdump -i eth0 -n port 4789 -v

# 检查防火墙规则
iptables -L -n

问题3:性能问题

# 检查CPU使用率
top -p $(pgrep vxlan)

# 检查网络统计
cat /proc/net/dev

# 检查中断分布
cat /proc/interrupts | grep eth0

12.5.2 性能优化建议

1. 硬件卸载

# 检查网卡VXLAN卸载支持
ethtool -k eth0 | grep vxlan

# 启用VXLAN卸载
ethtool -K eth0 vxlan on

2. 多队列配置

# 配置网卡多队列
ethtool -L eth0 combined 8

# 配置RPS
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

3. 内存优化

# 调整UDP缓冲区
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
sysctl -p

12.6 Overlay网络架构设计

12.6.1 数据中心Overlay架构

┌─────────────────────────────────────────────────────────────┐
│                    Underlay Network                        │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    │
│  │   Leaf-1    │    │   Leaf-2    │    │   Leaf-3    │    │
│  │ 192.168.1.1 │    │ 192.168.1.2 │    │ 192.168.1.3 │    │
│  └─────────────┘    └─────────────┘    └─────────────┘    │
└─────────────────────────────────────────────────────────────┘
           │                    │                    │
┌─────────────────────────────────────────────────────────────┐
│                    Overlay Network                         │
│  ┌─────────────┐    ┌─────────────┐    ┌─────────────┐    │
│  │   VTEP-1    │    │   VTEP-2    │    │   VTEP-3    │    │
│  │ VNI: 100-200│    │ VNI: 100-200│    │ VNI: 100-200│    │
│  └─────────────┘    └─────────────┘    └─────────────┘    │
└─────────────────────────────────────────────────────────────┘

12.6.2 多租户网络隔离

# 租户A网络 (VNI: 100)
ip link add vxlan-tenant-a type vxlan \
    id 100 \
    group 239.1.1.1 \
    dstport 4789 \
    dev eth0

# 租户B网络 (VNI: 200)
ip link add vxlan-tenant-b type vxlan \
    id 200 \
    group 239.1.1.2 \
    dstport 4789 \
    dev eth0

# 配置不同子网
ip addr add 10.0.1.1/24 dev vxlan-tenant-a
ip addr add 10.0.2.1/24 dev vxlan-tenant-b

12.7 排错清单

12.7.1 VXLAN配置检查

  • [ ] 内核是否支持VXLAN模块
  • [ ] VTEP IP地址是否可达
  • [ ] VXLAN端口是否被占用
  • [ ] 防火墙是否阻止VXLAN流量
  • [ ] FDB表是否正确学习MAC地址

12.7.2 性能问题检查

  • [ ] 网卡是否支持VXLAN硬件卸载
  • [ ] CPU使用率是否过高
  • [ ] 网络缓冲区是否足够
  • [ ] 多队列配置是否合理
  • [ ] 中断分布是否均衡

12.7.3 网络连通性检查

  • [ ] Underlay网络是否正常
  • [ ] 路由表配置是否正确
  • [ ] ARP表是否正常
  • [ ] 多播组是否加入
  • [ ] 封装/解封装是否正常

12.8 延伸阅读

  • RFC 7348: Virtual eXtensible LAN (VXLAN)
  • Linux VXLAN Documentation
  • Flannel VXLAN Backend
  • Open vSwitch VXLAN Support

下一章:第13章 OVS与SDN

返回目录:README

Prev
第11章 Bridge与互联
Next
第13章 OVS与SDN