FeelingLife FeelingLife
首页
  • Go

    • Go基础知识
  • Python

    • Python进阶
  • 操作系统
  • 计算机网络
  • MySQL
  • 学习笔记
  • 常用到的算法
  • Docker
  • Kubernetes
  • Observability
  • 容器底层
其他技术
  • 友情链接
  • 收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

xuqil

一介帆夫
首页
  • Go

    • Go基础知识
  • Python

    • Python进阶
  • 操作系统
  • 计算机网络
  • MySQL
  • 学习笔记
  • 常用到的算法
  • Docker
  • Kubernetes
  • Observability
  • 容器底层
其他技术
  • 友情链接
  • 收藏
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 应用层
  • 运输层
  • 抓包

  • 网络编程

  • 云网络

  • 虚拟网络

    • VLAN
    • VXLAN
    • VXLAN互通实验
      • 同VXLAN、同子网
        • 原理
        • 拓扑图
        • 实验步骤
      • 基于集中式网关的 VXLAN 跨子网互通方案
        • 互通原理
        • 实现原理
        • 拓扑架构
        • 实验步骤
        • 1. 配置主机 C 的网关命名空间和 OVS
        • 2. 配置主机 A 的 OVS 和 VM
        • 3. 配置主机 B 的 OVS 和 VM
        • 4. 验证连通性
        • 关键原理说明
        • 抓包分析
        • 常见问题排查
      • 跨VXLAN互通
        • 一、跨 VXLAN 互通原理
        • 二、实验拓扑
        • 三、配置步骤
        • 1. 配置 Host C(集中式网关)
        • 2. 配置 Host A(VNI 1000)
        • 3. 配置 Host B(VNI 2000)
        • 四、验证跨 VXLAN 通信
        • 五、常见问题排查
        • 1. 跨 VXLAN 流量不通
        • 2. ARP 解析失败
        • 3. 防火墙拦截
        • 六、总结
  • 常见面试题
  • 《计算机网络知识》
  • 虚拟网络
xuqil
2025-05-13
目录

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

# 实验步骤

  1. 配置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
  2. 配置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
  3. 验证互通:

    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 作为集中式网关。

原理:

  1. VXLAN 基础:VXLAN 通过 VNI 隔离二层域。不同 VNI 默认无法直接通信。
  2. 集中式网关:主机 C 作为网关连接不同 VNI 的子网(如 VNI1000:10.1.1.0/24 和 VNI1000:1.1.2.0/24),通过三层路由实现跨子网通信。
  3. 流量路径:
    • 同 VNI 流量:直接通过 VXLAN 隧道二层转发。
    • 跨 VNI 流量:发往网关,由网关路由到目标子网,再通过 VXLAN 隧道转发。

# 实现原理

  1. 二层互通性:
    • 同一 VXLAN 内的所有设备(即使属于不同子网)可以直接通过 MAC 地址进行二层通信。
    • 不同子网的 IP 地址若未配置网关,无法直接通过 ARP 发现对方,但可通过手动添加静态 ARP 或路由实现通信。
  2. 三层路由需求:
    • 若希望不同子网自动互通,需在 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
  • 核心设计:
    • 主机 C 作为集中式网关:在主机 C 上创建网关命名空间 ns-gw,配置两个子网的网关 IP 10.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)。

# 实验步骤

# 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. 配置主机 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

# 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

# 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

# 关键原理说明

  1. 集中式网关:

    • 主机 C 的 ns-gw 命名空间同时充当 10.1.1.0/24 和 10.1.2.0/24 的网关。
    • 所有跨子网流量通过主机 C 路由。
  2. VXLAN 隧道:

    • 主机 A 和 B 仅与主机 C 建立 VXLAN 隧道,简化拓扑。
    • 主机 C 的 OVS 网桥通过 VXLAN 隧道接收来自 A 和 B 的流量,并交给 ns-gw 路由。
  3. 路由流程(以 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上执行抓包程序:

sudo tcpdump -i ens33 -nn -v udp port 4789 -w lap-2.pcap
1

使用Wireshark分析抓包文件:

image-20250512220757684

从抓包文件分析可知经过了网关192.168.122.12。

# 常见问题排查

  1. VXLAN 隧道不通:

    • 检查物理网络连通性(如 ping 192.168.122.12)。
    • 验证 VXLAN 端口配置:ovs-vsctl show。
  2. 路由未生效:

    • 在主机 C 的 ns-gw 中检查路由表:ip netns exec ns-gw ip route。
    • 确保 net.ipv4.ip_forward=1 已启用。
  3. 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
  4. 防火墙拦截:

    • 开放 VXLAN 的 UDP 4789 端口:
      sudo ufw allow 4789/udp
      
      1

通过此方案,主机 A 和 B 的 VM 可通过主机 C 作为集中式网关实现跨子网互通,同时保持网络架构简洁。

# 跨VXLAN互通


# 一、跨 VXLAN 互通原理

  • VXLAN 隔离性:不同 VXLAN(不同 VNI)默认属于独立的二层广播域,无法直接二层通信。
  • 三层路由需求:跨 VXLAN 通信需依赖 三层网关,由网关在不同 VXLAN 之间转发流量。
  • 实现方式:
    1. 集中式网关:指定一台主机(如 Host C)作为网关,为每个 VXLAN 提供虚拟接口并配置路由。
    2. 分布式网关:每台主机独立承担网关角色(需动态路由协议如 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
  • 目标: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. 配置 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

# 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

# 四、验证跨 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

image-20250513153352929

在主机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

image-20250513153323256


# 五、常见问题排查

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

# 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 互通必须依赖三层网关,通过路由实现不同逻辑网络间的通信。
  • 集中式网关简化了配置,但可能成为性能瓶颈;分布式网关需动态路由协议支持。
  • 关键配置步骤:
    1. 为每个 VXLAN 分配独立网关接口。
    2. 启用 IP 转发并配置静态路由。
    3. 确保 VXLAN 隧道和物理网络连通性。
上次更新: 2025/05/13, 13:10:35
VXLAN
常见面试题

← VXLAN 常见面试题→

最近更新
01
VXLAN
05-13
02
VLAN
05-13
03
ip命令的使用
11-02
更多文章>
Theme by Vdoing | Copyright © 2018-2025 FeelingLife | 粤ICP备2022093535号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式