第12章 VXLAN与Overlay网络
学习目标
- 理解VXLAN协议原理和封装机制
- 掌握VXLAN的配置和故障排查方法
- 了解Overlay网络在云环境中的应用
- 能够设计基于VXLAN的容器网络方案
前置知识
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工作流程
- 学习阶段:VTEP学习MAC地址与IP地址的映射关系
- 封装阶段:将原始以太网帧封装在UDP包中
- 传输阶段:通过底层IP网络传输
- 解封装阶段:目标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