查看: 126|回复: 1

Linux基于Vxlan透传交换机vlan建立ospf邻居

2

主题

31

回帖

1089

积分

高级会员

Rank: 4

积分
1089
[i=s] 本帖最后由 569305227 于 2025-5-28 10:11 编辑 [/i]

Linux 基于 VXLAN 透传交换机 VLAN 建立 OSPF 邻居实验指南

一、实验概述

本实验旨在于两台 Linux 设备之间通过配置 VXLAN 隧道,模拟二层专线通信,将两台分别连接到 Linux 设备的交换机上的特定 VLAN 流量(包含 OSPF 报文)透明地传输过去,最终实现跨越底层网络的交换机在该 VLAN 内建立 OSPF 邻居关系。

image.png

二、实验设备清单

  • 两台支持 VLAN Trunking 和 OSPF 的交换机。
  • 两台安装 Linux 操作系统(内核版本支持 VXLAN)的设备。
  • 核心要求:两台 Linux 设备(即 VXLAN 隧道端点 VTEP)之间具备 IP 层可达性。这里我使用管理接口来自动下发IP地址

三、技术原理

实验的关键在于在 Linux 设备上构建一个二层网桥 (br0),并将连接本地网络的接口 (eth1) 和 VXLAN 接口 (vxlan0) 加入该网桥。

  1. 连接本地交换机的接口 (eth1) 配置为混杂模式,接收包含 VLAN 标签的二层报文。
  2. 这些报文进入网桥 (br0)。
  3. 网桥根据目的 MAC 地址学习到的转发表决定出接口。如果目的 MAC 地址在对端 VXLAN 接口 (vxlan0) 学习到,网桥会将报文转发至 vxlan0
  4. VXLAN 接口 (vxlan0) 对接收到的二层报文进行 VXLAN 封装:
    • 在外层添加 VXLAN 头部(包含 VNI)。
      绿色部分为vxlan封装
      黄色部分为原始封装,图是我后补的,看现象就行

      image.png

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

      image.png

    • 在外层添加新的 IP 头部(源 IP 为本地 VTEP IP,目的 IP 为对端 VTEP IP)。

    • 在外层添加底层网络的数据链路层头部。

  5. 封装后的 IP 报文通过承载 VXLAN 流量的物理接口 (eth0) 在底层网络中传输到对端 Linux 设备。
  6. 对端 Linux 设备的 eth0 接收到 VXLAN 报文后,经过网络协议栈,最终由对端的 vxlan0 接口处理。
  7. 对端 vxlan0 接口解封装,剥离外层头部,恢复原始的二层报文(包含原始的 VLAN 标签)。
  8. 解封装后的二层报文进入对端的网桥 (br0)。
  9. 网桥将报文转发至连接本地交换机的接口 (eth1)。
  10. 本地交换机接收到带有原始 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 桥接 eth1vxlan0
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 桥接 eth1vxlan0
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

七、验证要点

完成上述配置后,按照以下步骤进行验证:

  1. 检查 Linux 接口和网桥状态:
    • 使用 ip addr show 确认 eth0 配置了正确的 IP 地址且状态为 UP
    • 使用 ip link show 确认 eth1, br0, vxlan0 接口状态为 UP
    • 使用 ip link show master br0brctl show 确认 eth1vxlan0 已正确加入 br0 网桥。
    • 检查 vxlan0 的配置是否正确 (ip -d link show vxlan0),特别是 VNI, local, remote, dev 等参数。
  2. 测试 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 网络可达。
  3. 检查 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 地址)。
  4. 在交换机上验证 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 地址和子网掩码。
  5. 在交换机上查看 OSPF 邻居:
    • 在两台交换机上使用命令 display ospf peer (或 show ip ospf neighbor 等,具体命令取决于交换机厂商)。

    • 如果配置正确,两台交换机应该能在 VLAN 100 接口上建立 OSPF Full 邻居关系。

      image.png

  6. 抓包分析 (可选但推荐):
    • 在 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 showip 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 可达。确认内核模块已加载。
回复

使用道具 举报

0

主题

92

回帖

402

积分

初级会员

Rank: 2

积分
402
发表于 2025-6-3 20:42:21 | 显示全部楼层
不错···楼主辛苦了·················
回复

使用道具 举报

本版积分规则

Copyright   ©2015-2024  EmulatedLab  Powered by Discuz!©   ( 浙ICP备2021010423号-1 )
快速回复 返回列表 返回顶部