VXLAN互通实验
# VxLAN互通实验
# 同VXLAN、同子网
# 原理
同一VXLAN(VNI=100)内的设备处于同一逻辑二层网络,VTEP通过底层IP网络(192.168.122.0/24)封装VXLAN隧道,实现跨主机的二层互通。
# 拓扑图
Host A (192.168.122.10) Host B (192.168.122.11)
+-------------------+ +-------------------+
| OVS: br-vxlan100 | <--VXLAN--> | OVS: br-vxlan100 |
| Namespace: ns1 | | Namespace: ns2 |
| 10.0.0.1/24 | | 10.0.0.2/24 |
+-------------------+ +-------------------+
1
2
3
4
5
6
2
3
4
5
6
# 实验步骤
配置Host A:
# 创建OVS桥并添加VXLAN端口 sudo ovs-vsctl add-br br-vxlan100 sudo ovs-vsctl add-port br-vxlan100 vxlan100 -- set interface vxlan100 type=vxlan options:remote_ip=192.168.122.11 options:key=100 # 创建Namespace并连接到OVS sudo ip netns add ns1 sudo ip link add veth-ns1 type veth peer name veth-ovs sudo ip link set veth-ovs up sudo ip link set veth-ns1 netns ns1 sudo ovs-vsctl add-port br-vxlan100 veth-ovs # 配置Namespace IP sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth-ns1 sudo ip netns exec ns1 ip link set veth-ns1 up
1
2
3
4
5
6
7
8
9
10
11
12
13
14配置Host B(类似Host A,修改IP为
10.0.0.2/24
):sudo ovs-vsctl add-br br-vxlan100 sudo ovs-vsctl add-port br-vxlan100 vxlan100 -- set interface vxlan100 type=vxlan options:remote_ip=192.168.122.10 options:key=100 sudo ip netns add ns2 sudo ip link add veth-ns2 type veth peer name veth-ovs sudo ip link set veth-ovs up sudo ip link set veth-ns2 netns ns2 sudo ovs-vsctl add-port br-vxlan100 veth-ovs sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth-ns2 sudo ip netns exec ns2 ip link set veth-ns2 up
1
2
3
4
5
6
7
8
9验证互通:
sudo ip netns exec ns1 ping 10.0.0.2 # 从Host A的ns1 ping Host B的ns2
1
# 基于集中式网关的 VXLAN 跨子网互通方案
VXLAN 的 VNI(VXLAN Network Identifier) 默认对应一个 二层广播域,即同一 VNI 内的所有设备属于同一逻辑二层网络(同子网)。若要在同 VXLAN 内划分不同子网并实现互通,本质上是 在同一个二层域中运行多个子网,需依赖 三层路由 实现跨子网通信。
# 互通原理
需求:实现不同 子网 的 VXLAN 互通,主机 C 作为集中式网关。
原理:
- VXLAN 基础:VXLAN 通过 VNI 隔离二层域。不同 VNI 默认无法直接通信。
- 集中式网关:主机 C 作为网关连接不同 VNI 的子网(如 VNI1000:10.1.1.0/24 和 VNI1000:1.1.2.0/24),通过三层路由实现跨子网通信。
- 流量路径:
- 同 VNI 流量:直接通过 VXLAN 隧道二层转发。
- 跨 VNI 流量:发往网关,由网关路由到目标子网,再通过 VXLAN 隧道转发。
# 实现原理
- 二层互通性:
- 同一 VXLAN 内的所有设备(即使属于不同子网)可以直接通过 MAC 地址进行二层通信。
- 不同子网的 IP 地址若未配置网关,无法直接通过 ARP 发现对方,但可通过手动添加静态 ARP 或路由实现通信。
- 三层路由需求:
- 若希望不同子网自动互通,需在 VXLAN 内配置 三层网关,由网关负责跨子网路由。
- 网关需为每个子网分配虚拟接口,并启用 IP 转发。
# 拓扑架构
+-------------------------------------------------+
| 物理网络 |
| 192.168.122.0/24 (Underlay) |
| +----------------+----------------+---------+|
| | Host A | Host B | Host C ||
| | 192.168.122.10 | 192.168.122.11 | 192.168.122.12 |
| +----------------+----------------+---------+|
| | | | |
| |vxlan (VNI 1000)|vxlan (VNI 1000)| |
| | | | |
| +-----+------+ +-----+------+ +-----+------+
| | br-vxlan | | br-vxlan | | br-vxlan |
| | 无IP | | 无IP | | 无IP |
| +-----+------+ +-----+------+ +-----+------+
| | | |
| +-----+------+ +-----+------+ +-----+------+
| | ns1 | | ns2 | | ns-gw |
| |10.1.1.10/24| |10.1.2.10/24| |10.1.1.1/24 |
| | | | | |10.1.2.1/24 |
| +------------+ +------------+ +------------+
+-------------------------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 核心设计:
- 主机 C 作为集中式网关:在主机 C 上创建网关命名空间
ns-gw
,配置两个子网的网关 IP10.1.1.1/24
和10.1.2.1/24
。 - VXLAN 隧道:主机 A 和 B 仅与主机 C 建立 VXLAN 隧道,跨子网流量通过主机 C 路由。
- VM 子网:
- Host A 的 VM(
ns1
)子网:10.1.1.0/24
,网关10.1.1.1
(主机 C 的ns-gw
)。 - Host B 的 VM(
ns2
)子网:10.1.2.0/24
,网关10.1.2.1
(主机 C 的ns-gw
)。
- Host A 的 VM(
- 主机 C 作为集中式网关:在主机 C 上创建网关命名空间
# 实验步骤
# 1. 配置主机 C 的网关命名空间和 OVS
# 在主机 C 上操作
# 创建 OVS 网桥(不分配 IP)
sudo ovs-vsctl add-br br-vxlan
# 添加 VXLAN 隧道连接到主机 A 和 B
sudo ovs-vsctl add-port br-vxlan vxlan-a -- set interface vxlan-a type=vxlan \
options:remote_ip=192.168.122.10 options:key=1000 # 主机 C → 主机 A
sudo ovs-vsctl add-port br-vxlan vxlan-b -- set interface vxlan-b type=vxlan \
options:remote_ip=192.168.122.11 options:key=1000 # 主机 C → 主机 B
# 创建网关命名空间并分配子网网关 IP
sudo ip netns add ns-gw
# 创建两对 veth 接口连接 OVS 和网关命名空间
sudo ip link add veth-gw1 type veth peer name veth-gw1-ovs
sudo ip link add veth-gw2 type veth peer name veth-gw2-ovs
# 将接口对的一端放入 ns-gw,另一端连接到 OVS
sudo ip link set veth-gw1 netns ns-gw
sudo ip link set veth-gw2 netns ns-gw
sudo ovs-vsctl add-port br-vxlan veth-gw1-ovs
sudo ovs-vsctl add-port br-vxlan veth-gw2-ovs
# 激活接口并配置 IP
sudo ip netns exec ns-gw ip link set veth-gw1 up
sudo ip netns exec ns-gw ip link set veth-gw2 up
sudo ip netns exec ns-gw ip addr add 10.1.1.1/24 dev veth-gw1 # Host A 子网的网关
sudo ip netns exec ns-gw ip addr add 10.1.2.1/24 dev veth-gw2 # Host B 子网的网关
# 启用 IP 转发
sudo ip netns exec ns-gw sysctl -w net.ipv4.ip_forward=1
# 激活 OVS 端口
sudo ip link set veth-gw1-ovs up
sudo ip link set veth-gw2-ovs up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 2. 配置主机 A 的 OVS 和 VM
# 在主机 A 上操作
# 创建 OVS 网桥(不分配 IP)
sudo ovs-vsctl add-br br-vxlan
# 添加 VXLAN 隧道连接到主机 C
sudo ovs-vsctl add-port br-vxlan vxlan-c -- set interface vxlan-c type=vxlan \
options:remote_ip=192.168.122.12 options:key=1000 # 主机 A → 主机 C
# 创建 VM 命名空间并连接到 OVS
sudo ip netns add ns1
sudo ip link add veth-ns1 type veth peer name veth-ns1-ovs
sudo ip link set veth-ns1 netns ns1
sudo ovs-vsctl add-port br-vxlan veth-ns1-ovs
# 配置 VM 的 IP 和默认路由(网关指向主机 C 的 ns-gw)
sudo ip netns exec ns1 ip link set veth-ns1 up
sudo ip netns exec ns1 ip addr add 10.1.1.10/24 dev veth-ns1
sudo ip netns exec ns1 ip route add default via 10.1.1.1 # 网关为 10.1.1.1(主机 C)
# 激活 OVS 端口
sudo ip link set veth-ns1-ovs up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 3. 配置主机 B 的 OVS 和 VM
# 在主机 B 上操作
# 创建 OVS 网桥(不分配 IP)
sudo ovs-vsctl add-br br-vxlan
# 添加 VXLAN 隧道连接到主机 C
sudo ovs-vsctl add-port br-vxlan vxlan-c -- set interface vxlan-c type=vxlan \
options:remote_ip=192.168.122.12 options:key=1000 # 主机 B → 主机 C
# 创建 VM 命名空间并连接到 OVS
sudo ip netns add ns2
sudo ip link add veth-ns2 type veth peer name veth-ns2-ovs
sudo ip link set veth-ns2 netns ns2
sudo ovs-vsctl add-port br-vxlan veth-ns2-ovs
# 配置 VM 的 IP 和默认路由(网关指向主机 C 的 ns-gw)
sudo ip netns exec ns2 ip link set veth-ns2 up
sudo ip netns exec ns2 ip addr add 10.1.2.10/24 dev veth-ns2
sudo ip netns exec ns2 ip route add default via 10.1.2.1 # 网关为 10.1.2.1(主机 C)
# 激活 OVS 端口
sudo ip link set veth-ns2-ovs up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 4. 验证连通性
# 在主机 A 的 ns1 中 ping 主机 B 的 ns2
sudo ip netns exec ns1 ping 10.1.2.10
# 在主机 B 的 ns2 中 ping 主机 A 的 ns1
sudo ip netns exec ns2 ping 10.1.1.10
1
2
3
4
5
2
3
4
5
# 关键原理说明
集中式网关:
- 主机 C 的
ns-gw
命名空间同时充当10.1.1.0/24
和10.1.2.0/24
的网关。 - 所有跨子网流量通过主机 C 路由。
- 主机 C 的
VXLAN 隧道:
- 主机 A 和 B 仅与主机 C 建立 VXLAN 隧道,简化拓扑。
- 主机 C 的 OVS 网桥通过 VXLAN 隧道接收来自 A 和 B 的流量,并交给
ns-gw
路由。
路由流程(以
10.1.1.10 → 10.1.2.10
为例):- 流量从主机 A 的
ns1
发送到网关10.1.1.1
(主机 C 的ns-gw
)。 - 主机 C 的
ns-gw
根据路由表将流量转发到10.1.2.0/24
子网。 - 流量通过 VXLAN 隧道封装,从主机 C 发送到主机 B。
- 流量从主机 A 的
# 抓包分析
在主机A上执行抓包程序:
sudo tcpdump -i ens33 -nn -v udp port 4789 -w lap-2.pcap
1
使用Wireshark分析抓包文件:
从抓包文件分析可知经过了网关192.168.122.12
。
# 常见问题排查
VXLAN 隧道不通:
- 检查物理网络连通性(如
ping 192.168.122.12
)。 - 验证 VXLAN 端口配置:
ovs-vsctl show
。
- 检查物理网络连通性(如
路由未生效:
- 在主机 C 的
ns-gw
中检查路由表:ip netns exec ns-gw ip route
。 - 确保
net.ipv4.ip_forward=1
已启用。
- 在主机 C 的
ARP 解析失败:
- 在主机 C 的
ns-gw
中抓包验证 ARP 请求:sudo ip netns exec ns-gw tcpdump -i veth-gw1 arp sudo ip netns exec ns-gw tcpdump -i veth-gw2 arp
1
2
- 在主机 C 的
防火墙拦截:
- 开放 VXLAN 的 UDP 4789 端口:
sudo ufw allow 4789/udp
1
- 开放 VXLAN 的 UDP 4789 端口:
通过此方案,主机 A 和 B 的 VM 可通过主机 C 作为集中式网关实现跨子网互通,同时保持网络架构简洁。
# 跨VXLAN互通
# 一、跨 VXLAN 互通原理
- VXLAN 隔离性:不同 VXLAN(不同 VNI)默认属于独立的二层广播域,无法直接二层通信。
- 三层路由需求:跨 VXLAN 通信需依赖 三层网关,由网关在不同 VXLAN 之间转发流量。
- 实现方式:
- 集中式网关:指定一台主机(如 Host C)作为网关,为每个 VXLAN 提供虚拟接口并配置路由。
- 分布式网关:每台主机独立承担网关角色(需动态路由协议如 BGP/OSPF,本实验以集中式为例)。
# 二、实验拓扑
+-------------------------------------------------+
| 物理网络 |
| 192.168.122.0/24 (Underlay) |
| +----------------+----------------+---------+|
| | Host A | Host B | Host C ||
| | 192.168.122.10 | 192.168.122.11 | 192.168.122.12 |
| +----------------+----------------+---------+|
| | | | |
| |vxlan (VNI 1000)|vxlan (VNI 2000)|vxlan (VNI 1000/2000)
| | | | |
| +-----+------+ +-----+------+ +-----+------+
| | br-vxlan | | br-vxlan | | br-vxlan |
| | 无IP | | 无IP | | 无IP |
| +-----+------+ +-----+------+ +-----+------+
| | | |
| +-----+------+ +-----+------+ +-----+------+
| | ns1 | | ns2 | | ns-gw |
| |10.1.1.10/24| |10.2.2.20/24| |10.1.1.1/24 | (VNI 1000)
| | (VNI 1000) | | (VNI 2000) | |10.2.2.1/24 | (VNI 2000)
| +------------+ +------------+ +------------+
+-------------------------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- 目标:Host A 的
ns1
(VNI 1000)与 Host B 的ns2
(VNI 2000)通过 Host C 的ns-gw
实现跨 VXLAN 通信。
# 三、配置步骤
# 1. 配置 Host C(集中式网关)
# 创建 OVS 网桥并添加 VXLAN 隧道
sudo ovs-vsctl add-br br-vxlan
# 连接到 Host A(VNI 1000)和 Host B(VNI 2000)
sudo ovs-vsctl add-port br-vxlan vxlan-a -- set interface vxlan-a type=vxlan \
options:remote_ip=192.168.122.10 options:key=1000 # VNI 1000
sudo ovs-vsctl add-port br-vxlan vxlan-b -- set interface vxlan-b type=vxlan \
options:remote_ip=192.168.122.11 options:key=2000 # VNI 2000
# 创建网关命名空间 ns-gw 并配置子网接口
sudo ip netns add ns-gw
# 创建两对 veth 接口连接不同 VXLAN
sudo ip link add veth-gw1 type veth peer name veth-gw1-ovs # VNI 1000
sudo ip link add veth-gw2 type veth peer name veth-gw2-ovs # VNI 2000
# 将接口对一端放入 ns-gw,另一端连接到 OVS
sudo ip link set veth-gw1 netns ns-gw
sudo ip link set veth-gw2 netns ns-gw
sudo ovs-vsctl add-port br-vxlan veth-gw1-ovs
sudo ovs-vsctl add-port br-vxlan veth-gw2-ovs
# 配置 IP 并激活接口
sudo ip netns exec ns-gw ip addr add 10.1.1.1/24 dev veth-gw1 # VNI 1000 网关
sudo ip netns exec ns-gw ip addr add 10.2.2.1/24 dev veth-gw2 # VNI 2000 网关
sudo ip netns exec ns-gw ip link set veth-gw1 up
sudo ip netns exec ns-gw ip link set veth-gw2 up
sudo ip link set dev br-vxlan up # 确保 OVS 网桥激活
sudo ip link set dev veth-gw1-ovs up
sudo ip link set dev veth-gw2-ovs up
# 查看 mac
sudo ip netns exec ns-gw ip -o link show veth-gw1 | awk '{print $17}'
sudo ip netns exec ns-gw ip -o link show veth-gw2 | awk '{print $17}'
# 启用 IP 转发
sudo ip netns exec ns-gw sysctl -w net.ipv4.ip_forward=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 2. 配置 Host A(VNI 1000)
# 创建 OVS 网桥并添加 VXLAN 隧道
sudo ovs-vsctl add-br br-vxlan
sudo ovs-vsctl add-port br-vxlan vxlan-c -- set interface vxlan-c type=vxlan \
options:remote_ip=192.168.122.12 options:key=1000 # VNI 1000
# 创建 Namespace ns1 并连接到 OVS
sudo ip netns add ns1
sudo ip link add veth-ns1 type veth peer name veth-ns1-ovs
sudo ip link set veth-ns1 netns ns1
sudo ovs-vsctl add-port br-vxlan veth-ns1-ovs
# 配置 IP 和默认路由
sudo ip netns exec ns1 ip addr add 10.1.1.10/24 dev veth-ns1
sudo ip netns exec ns1 ip link set veth-ns1 up
sudo ip netns exec ns1 ip route add default via 10.1.1.1 # 网关指向 Host C
sudo ip link set dev br-vxlan up # 确保 OVS 网桥激活
sudo ip link set dev veth-ns1-ovs up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 3. 配置 Host B(VNI 2000)
# 创建 OVS 网桥并添加 VXLAN 隧道
sudo ovs-vsctl add-br br-vxlan
sudo ovs-vsctl add-port br-vxlan vxlan-c -- set interface vxlan-c type=vxlan \
options:remote_ip=192.168.122.12 options:key=2000 # VNI 2000
# 创建 Namespace ns2 并连接到 OVS
sudo ip netns add ns2
sudo ip link add veth-ns2 type veth peer name veth-ns2-ovs
sudo ip link set veth-ns2 netns ns2
sudo ovs-vsctl add-port br-vxlan veth-ns2-ovs
# 配置 IP 和默认路由
sudo ip netns exec ns2 ip addr add 10.2.2.20/24 dev veth-ns2
sudo ip netns exec ns2 ip link set veth-ns2 up
sudo ip netns exec ns2 ip route add default via 10.2.2.1 # 网关指向 Host C
sudo ip link set dev br-vxlan up # 确保 OVS 网桥激活
sudo ip link set dev veth-ns2-ovs up
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 四、验证跨 VXLAN 通信
在主机C上抓包验证ICMP:
# 在 Host A 的 ns1 中 ping Host B 的 ns2
sudo ip netns exec ns1 ping 10.2.2.20
# 在 Host C 的 ns-gw 中抓包验证路由转发,可以抓到PING的包,已经解封装
sudo ip netns exec ns-gw tcpdump -i veth-gw1 icmp -nn -v -w veth-gw1.pcap # 查看 VNI 1000 流量
sudo ip netns exec ns-gw tcpdump -i veth-gw2 icmp -nn -v -w veth-gw2.pcap # 查看 VNI 2000 流量
# 预期结果:ICMP 请求从 VNI 1000 进入,从 VNI 2000 转发
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
在主机C上抓包验证VXLAN:
# 在 Host A 的 ns1 中 ping Host B 的 ns2
sudo ip netns exec ns1 ping 10.2.2.20
# 在 Host C 的 ns-gw 中抓包验证VXLAN
sudo tcpdump -i ens33 -nn -v udp port 4789 -w veth-gw.pcap
1
2
3
4
5
6
2
3
4
5
6
# 五、常见问题排查
PING不同的解决方式,将配置网卡都UP起来,手动配置ARP。
# 1. 跨 VXLAN 流量不通
- 检查点:
- VXLAN 隧道配置:确保
ovs-vsctl show
中 VXLAN 端口 VNI 和 remote_ip 正确。 - 网关路由表:在 Host C 的
ns-gw
中检查路由表:sudo ip netns exec ns-gw ip route # 预期输出应有默认路由或明确子网路由
1
2
- VXLAN 隧道配置:确保
# 2. ARP 解析失败
- 手动绑定 ARP:
# 在 Host A 的 ns1 中绑定 Host C 的网关 MAC sudo ip netns exec ns1 arp -s 10.1.1.1 <veth-gw1的MAC地址>
1
2
# 3. 防火墙拦截
- 开放 VXLAN 端口:
sudo ufw allow 4789/udp
1
# 六、总结
- 跨 VXLAN 互通必须依赖三层网关,通过路由实现不同逻辑网络间的通信。
- 集中式网关简化了配置,但可能成为性能瓶颈;分布式网关需动态路由协议支持。
- 关键配置步骤:
- 为每个 VXLAN 分配独立网关接口。
- 启用 IP 转发并配置静态路由。
- 确保 VXLAN 隧道和物理网络连通性。
上次更新: 2025/05/13, 13:10:35