[i=s] 本帖最后由 569305227 于 2025-5-28 10:11 编辑 [/i]
Linux 基于 VXLAN 透传交换机 VLAN 建立 OSPF 邻居实验指南
一、实验概述
本实验旨在于两台 Linux 设备之间通过配置 VXLAN 隧道,模拟二层专线通信,将两台分别连接到 Linux 设备的交换机上的特定 VLAN 流量(包含 OSPF 报文)透明地传输过去,最终实现跨越底层网络的交换机在该 VLAN 内建立 OSPF 邻居关系。

二、实验设备清单
- 两台支持 VLAN Trunking 和 OSPF 的交换机。
- 两台安装 Linux 操作系统(内核版本支持 VXLAN)的设备。
- 核心要求:两台 Linux 设备(即 VXLAN 隧道端点 VTEP)之间具备 IP 层可达性。这里我使用管理接口来自动下发IP地址
三、技术原理
实验的关键在于在 Linux 设备上构建一个二层网桥 (br0
),并将连接本地网络的接口 (eth1
) 和 VXLAN 接口 (vxlan0
) 加入该网桥。
- 连接本地交换机的接口 (
eth1
) 配置为混杂模式,接收包含 VLAN 标签的二层报文。
- 这些报文进入网桥 (
br0
)。
- 网桥根据目的 MAC 地址学习到的转发表决定出接口。如果目的 MAC 地址在对端 VXLAN 接口 (
vxlan0
) 学习到,网桥会将报文转发至 vxlan0
。
- VXLAN 接口 (
vxlan0
) 对接收到的二层报文进行 VXLAN 封装:
-
在外层添加 VXLAN 头部(包含 VNI)。
绿色部分为vxlan封装
黄色部分为原始封装,图是我后补的,看现象就行

-
在外层添加 UDP 头部(默认目标端口 4789,但是我这个实验linux生成的是8472)。

-
在外层添加新的 IP 头部(源 IP 为本地 VTEP IP,目的 IP 为对端 VTEP IP)。
-
在外层添加底层网络的数据链路层头部。
- 封装后的 IP 报文通过承载 VXLAN 流量的物理接口 (
eth0
) 在底层网络中传输到对端 Linux 设备。
- 对端 Linux 设备的
eth0
接收到 VXLAN 报文后,经过网络协议栈,最终由对端的 vxlan0
接口处理。
- 对端
vxlan0
接口解封装,剥离外层头部,恢复原始的二层报文(包含原始的 VLAN 标签)。
- 解封装后的二层报文进入对端的网桥 (
br0
)。
- 网桥将报文转发至连接本地交换机的接口 (
eth1
)。
- 本地交换机接收到带有原始 VLAN 标签的报文,并进行进一步处理(如 OSPF 邻居发现等)。
整个过程对于上层应用(如交换机上的 OSPF)来说是透明的,仿佛通过一根二层链路直连。
四、节点配置规划
为了清晰起见,我们将两个 Linux 节点分别称为 Node A 和 Node B。
(一)Node A
参数 |
配置值 |
说明 |
物理传输接口 |
eth0 |
连接底层网络,用于 VXLAN 报文的传输 |
本地接入接口 |
eth1 |
连接本地交换机,处理原始 VLAN 流量 |
本地 VTEP IP |
192.168.17.133 |
配置在 eth0 接口上,作为 VXLAN 源 IP |
远程 VTEP IP |
192.168.17.134 |
Node B 的 VTEP IP,作为 VXLAN 目标 IP |
VNI (VXLAN ID) |
100 |
标识 VXLAN 网段,通信双方需一致 |
Linux 网桥 |
br0 |
桥接 eth1 和 vxlan0 |
VXLAN 接口 |
vxlan0 |
基于 VNI 100 创建 |
(二)Node B (对称配置)
参数 |
配置值 |
说明 |
物理传输接口 |
eth0 |
连接底层网络,用于 VXLAN 报文的传输 |
本地接入接口 |
eth1 |
连接本地交换机,处理原始 VLAN 流量 |
本地 VTEP IP |
192.168.17.134 |
配置在 eth0 接口上,作为 VXLAN 源 IP |
远程 VTEP IP |
192.168.17.133 |
Node A 的 VTEP IP,作为 VXLAN 目标 IP |
VNI (VXLAN ID) |
100 |
标识 VXLAN 网段,通信双方需一致 |
Linux 网桥 |
br0 |
桥接 eth1 和 vxlan0 |
VXLAN 接口 |
vxlan0 |
基于 VNI 100 创建 |
注意: 实际部署时,请根据您的网络环境调整接口名称(如 eth0
, eth1
可能在您的系统上是 ens33
, enp0s8
等)和 IP 地址。确保 eth0
接口所在的 IP 网络 (192.168.17.0/24
在示例中) 在 Node A 和 Node B 之间是可路由的。
五、操作步骤 (Node A/B 通用)
以下步骤在两台 Linux 设备上均需执行,注意根据 Node A/B 的规划修改 IP 地址。
重要提示: 以下 ip
命令的配置是临时性的,系统重启后会丢失。生产环境中请使用网络管理工具(如 netplan, networkd, ifupdown 或 NetworkManager)进行持久化配置。
(一)加载 Vxlan 内核模块
sudo modprobe vxlan # 加载 vxlan 模块
lsmod | grep vxlan # 检查模块是否加载成功
(二)配置物理传输接口 (eth0)
为用于承载 VXLAN 流量的物理接口配置 IP 地址并启用。
# 示例命令(根据 Node A/B 的规划和实际接口名称调整)
# --- Node A ---
# sudo ip addr add 192.168.17.133/24 dev eth0
# sudo ip link set eth0 up
# --- Node B ---
# sudo ip addr add 192.168.17.134/24 dev eth0
# sudo ip link set eth0 up
# 确认配置
ip addr show eth0
ip link show eth0
(三)启用本地接入接口 (eth1)
启用连接本地交换机的接口。注意,此接口无需配置 IP 地址,其二层流量由网桥处理。
# 示例命令(根据实际接口名称调整)
# sudo ip link set eth1 up
# 确认状态
ip link show eth1
(四)创建 Linux 网桥 (br0)
sudo ip link add name br0 type bridge # 创建网桥设备 br0
# 确认创建成功
ip link show br0
(五)创建 Vxlan 接口 (vxlan0)
创建一个 VXLAN 类型的虚拟接口,指定 VNI、本地 VTEP IP、对端 VTEP IP 以及承载 VXLAN 流量的物理接口 (eth0
)。
# 示例命令(根据 Node A/B 的规划调整)
# --- Node A ---
sudo ip link add name vxlan0 type vxlan id 100 local 192.168.17.133 remote 192.168.17.134 dev eth0
# --- Node B ---
# sudo ip link add name vxlan0 type vxlan id 100 local 192.168.17.134 remote 192.168.17.133 dev eth0
# 确认创建成功
ip link show vxlan0
id 100
:指定 VXLAN 网络标识 (VNI),两端必须一致。
local <本地IP>
:指定本地 VTEP 的源 IP 地址,必须配置在 dev
指定的接口上。
remote <对端IP>
:指定对端 VTEP 的 IP 地址。
dev eth0
:指定承载 VXLAN 封装报文的物理接口,此接口必须配置了 local
指定的 IP 地址且 IP 可达对端 remote
IP。
(六)将本地接入接口和 Vxlan 接口加入网桥
将 eth1
(连接本地交换机) 和 vxlan0
加入到 br0
网桥中。
# 将 eth1 加入网桥
sudo ip link set eth1 master br0
# 将 vxlan0 加入网桥
sudo ip link set vxlan0 master br0
# 确认接口已加入网桥 (可使用 brctl 或 ip 命令)
brctl show # 可能需要安装 bridge-utils
ip link show master br0
(七)启用网桥和 Vxlan 接口
使能网桥和 VXLAN 接口。
sudo ip link set br0 up
sudo ip link set vxlan0 up
# 确认状态
ip link show br0
ip link show vxlan0
至此,Linux 端的 VXLAN 隧道和网桥配置完成。连接到 eth1
的本地交换机将能够通过 VXLAN 隧道与对端交换机进行二层通信。
六、交换机配置示例
假设两台交换机通过 Linux 设备上的 eth1
接口接入 VXLAN 隧道。我们需要在交换机上配置相同的 VLAN ID(如 100)和 OSPF 进程/区域。交换机与 Linux eth1
连接的端口应配置为 Trunk 或允许指定 VLAN 通过。
(一)交换机 1 配置示例
假设连接 Linux Node A eth1
的物理接口是 HundredGigE1/0/1
。我们希望在 VLAN 100 中运行 OSPF。
# 进入系统视图
system-view
# 创建并配置 VLAN 100
vlan 100
quit
# 配置物理接口 HundredGigE1/0/1
interface HundredGigE1/0/1
port link-mode bridge # 配置为桥接模式(二层转发)
port link-type trunk # 配置为 Trunk 端口
port trunk permit vlan 100 # 允许 VLAN 100 通过
# 可选:配置 PVID 如果需要处理 untagged 流量,但此实验场景通常只传 tagged
# port trunk pvid vlan 1 # 示例
quit
# 创建 VLAN 接口并配置 IP(用于 VLAN 100 内的通信和 OSPF 邻居建立)
interface Vlan-interface100
ip address 100.1.1.1 255.255.255.0
quit
# 启用 OSPF 进程
ospf 1 router-id 100.1.1.1 # router-id 可选,建议配置
# 进入 OSPF 区域 0
area 0.0.0.0
# 在 VLAN 接口 100 上使能 OSPF
network 100.1.1.0 0.0.0.255 # 在 VLAN 100 网段宣告 OSPF
# (可选) passive-interface default 阻止在其他接口发送 OSPF hello
# passive-interface default
# undo passive-interface Vlan-interface100 # 允许在 VLAN 100 接口发送 hello
quit
quit
# 保存配置 (根据交换机型号使用对应的命令)
# save
注意: 有些交换机可能使用子接口 (GigabitEthernet1/0/1.100
) 并配置 dot1q termination vid 100
来处理带标签的 VLAN 流量。示例中使用了 VLAN 接口(Vlan-interface100
)配合物理口的trunk配置,这是另一种常见方式。两种方式的目的都是让交换机能在物理端口上收发带 VLAN 100 标签的报文,并在逻辑上的 VLAN 100 接口上运行 OSPF。
(二)交换机 2 配置示例
假设连接 Linux Node B eth1
的物理接口是 HundredGigE1/0/1
。
# 进入系统视图
system-view
# 创建并配置 VLAN 100
vlan 100
quit
# 配置物理接口 HundredGigE1/0/1
interface HundredGigE1/0/1
port link-mode bridge # 配置为桥接模式
port link-type trunk # 配置为 Trunk 端口
port trunk permit vlan 100 # 允许 VLAN 100 通过
quit
# 创建 VLAN 接口并配置 IP
interface Vlan-interface100
ip address 100.1.1.2 255.255.255.0
quit
# 启用 OSPF 进程
ospf 1 router-id 100.1.1.2
area 0.0.0.0
network 100.1.1.0 0.0.0.255
# (可选) passive-interface default
# passive-interface default
# undo passive-interface Vlan-interface100
quit
quit
# 保存配置
# save
七、验证要点
完成上述配置后,按照以下步骤进行验证:
- 检查 Linux 接口和网桥状态:
- 使用
ip addr show
确认 eth0
配置了正确的 IP 地址且状态为 UP
。
- 使用
ip link show
确认 eth1
, br0
, vxlan0
接口状态为 UP
。
- 使用
ip link show master br0
或 brctl show
确认 eth1
和 vxlan0
已正确加入 br0
网桥。
- 检查
vxlan0
的配置是否正确 (ip -d link show vxlan0
),特别是 VNI, local, remote, dev 等参数。
- 测试 VTEP 之间 IP 连通性:
- 在 Node A 上
ping 192.168.17.134
(Node B 的 VTEP IP)。
- 在 Node B 上
ping 196.168.17.133
(Node A 的 VTEP IP)。
- 这是 VXLAN 隧道建立的基础,必须保证底层 IP 网络可达。
- 检查 Linux 网桥学习到的 MAC 地址:
- 使用
bridge fdb show
(或 brctl showmacs br0
) 查看网桥的 MAC 地址转发表。
- 交换机上 VLAN 100 接口的 MAC 地址应该在对端的
vxlan0
接口上学到。
- 示例输出可能类似:
aa:bb:cc:dd:ee:ff dev vxlan0 dst 192.168.17.134
(其中 aa:bb:cc:dd:ee:ff
是对端交换机 VLAN 100 接口的 MAC 地址)。
- 在交换机上验证 VLAN 100 接口的连通性:
- 在交换机 1 上
ping 100.1.1.2
(交换机 2 的 VLAN 100 IP)。
- 在交换机 2 上
ping 100.1.1.1
(交换机 1 的 VLAN 100 IP)。
- 如果 ping 不通,检查交换机接口配置(trunking, permitted VLANs)、VLAN 接口状态、IP 地址和子网掩码。
- 在交换机上查看 OSPF 邻居:
- 抓包分析 (可选但推荐):
- 在 Linux Node A 的
eth0
接口上使用 tcpdump -i eth0 -n 'udp port 4789'
抓包。您应该能看到源 IP 192.168.17.133, 目标 IP 192.168.17.134, UDP 端口 4789 的 VXLAN 报文。展开报文可以看到内部封装了原始的以太网帧,其中包含 VLAN 100 标签和 OSPF 报文 (如果交换机正在发送 OSPF hello)。
- 在 Linux Node A 的
eth1
接口上使用 tcpdump -i eth1 -n 'vlan 100'
抓包。您应该能看到带 VLAN 100 标签的原始二层报文,例如 OSPF hello 报文。
八、常见问题排查
- VTEP 之间 ping 不通: 检查
eth0
IP 配置、子网掩码、路由表以及底层网络连通性(防火墙是否阻止了 ICMP 或 UDP )。
- VXLAN 接口或网桥未 UP: 使用
ip link set <interface> up
启用。
- 接口未加入网桥: 使用
ip link set <interface> master br0
加入,并用 brctl show
或 ip link show master br0
确认。确保加入网桥的接口没有 IP 地址。
- 交换机 VLAN 100 接口 ping 不通: 检查交换机 VLAN 配置、物理接口配置(trunk/access, permit VLANs, PVID)、VLAN 接口 IP 地址、子网掩码和状态。检查 Linux
eth1
接口状态。
- OSPF 邻居建立不起来:
- 检查两端交换机 VLAN 100 接口的 IP 地址是否在同一网段。
- 检查 OSPF 进程、区域 ID 是否一致。
- 检查 OSPF Network 命令是否覆盖了 VLAN 100 的网段。
- 检查防火墙是否阻止了 OSPF 报文 (IP Protocol 89)。
- 抓包确认 OSPF hello 报文是否正常发送和接收。
- 检查 Linux 网桥的 MAC 地址学习表,确认交换机的 MAC 地址能在对端 vxlan0 接口学习到。
- 抓包发现没有 VXLAN 报文: 确认
vxlan0
接口已 UP 并加入网桥。确认有流量(例如交换机 VLAN 100 的 ARP 请求或 OSPF hello)进入 br0
并尝试从 vxlan0
发出(目标 MAC 在对端 vxlan0 学习到)。确认 VTEP IP 可达。确认内核模块已加载。