3. 虚拟化网络基础与OVS角色

在物理数据中心里,服务器通过网卡接入交换机,再由交换机完成二层转发和三层路由。进入虚拟化环境后,一台物理主机上可能同时运行几十台虚拟机或容器,它们之间需要通信,也需要访问外部网络。如果每台虚拟机的流量都绕到物理交换机再回来,不仅浪费带宽,还会带来巨大的时延和管理复杂度。虚拟交换机正是为解决这一问题而出现的:它把交换能力下沉到主机内部,让同一主机上的虚拟接口可以直接完成二层转发。

Open vSwitch(OVS)是目前云数据中心中最主流的开源虚拟交换机实现。它既是一个软件交换机,也是一个可编程的转发平台。理解 OVS 的角色,需要先理解它周围的一组基础构件:网桥、veth、tap、VXLAN/Geneve 隧道以及 OpenFlow 流表。这些构件共同构成了虚拟化网络的“骨架”。

网桥与虚拟交换机的关系

网桥(bridge)是二层转发设备,负责在同一广播域内根据 MAC 地址转发帧。Linux 内核自带 Linux Bridge,而 OVS 则是一个功能更强的用户态/内核态协同虚拟交换机。两者都可以创建网桥,但 OVS 的网桥支持 OpenFlow 流表、隧道封装、QoS、镜像等高级能力,因此更适合云数据中心。

在 OVS 中,一个网桥(如 br-int)就是一个独立的二层转发域。网桥内部维护 MAC 学习表,也可以被控制器下发流表来精确控制转发行为。物理网卡、虚拟机的虚拟网卡、隧道端口都可以挂接到同一个网桥上,从而在主机内部形成一个可编程的交换平面。

veth 与 tap:虚拟接口的两种形态

虚拟接口是虚拟网络中最基础的“连接件”。常见的有两类:

  • veth pair:一对虚拟网卡,像一根网线的两端。向一端发送的数据会从另一端出来。常用于连接两个网桥、连接网桥与命名空间、连接容器与主机网络。
  • tap:一种虚拟二层接口,通常由 QEMU/KVM 创建,一端连接虚拟机内部的虚拟网卡,另一端连接主机上的网桥或 OVS。虚拟机发出的帧通过 tap 进入主机网络栈,再被 OVS 转发。

举例来说,一台 KVM 虚拟机的虚拟网卡 vnet0 实际就是一个 tap 设备,它被挂到 OVS 网桥 br-int 上。虚拟机发出的以太帧从 vnet0 进入 OVS,OVS 根据流表决定是转发给同主机上的另一台虚拟机,还是通过隧道送到另一台物理主机。

VXLAN 与 Geneve:跨主机的隧道封装

当两台虚拟机位于不同物理主机上时,它们之间的二层帧必须跨越三层物理网络。VXLAN 和 Geneve 就是两种主流的 Overlay 封装协议。它们把原始以太帧封装在一个 UDP 报文中,外层使用物理主机的 IP 地址进行路由,内层保留原始虚拟机的 MAC 和 VLAN 信息。

VXLAN 使用 24 位 VNI(VXLAN Network Identifier),可支持约 1600 万个租户网络;Geneve 使用可变长度的 TLV 选项,扩展性更强,逐渐成为新一代云数据中心的选择。在 OVS 中,隧道端口以 type=vxlan 或 type=geneve 的方式创建,并指定 remote_ip 和 key。当 OVS 发现目的 MAC 位于远端隧道时,就会自动封装并发送。

OpenFlow 与流表:OVS 的可编程核心

OVS 之所以被称为“可编程交换机”,核心在于它支持 OpenFlow 协议。OpenFlow 把转发决策抽象为“流表 + 动作”。每个流表项由匹配字段和指令组成,匹配字段可以包括入端口、源/目的 MAC、VLAN ID、源/目的 IP、TCP/UDP 端口等;指令则包括转发到某端口、丢弃、修改字段、跳转到另一张流表等。

在典型的 OVS 流水线中,br-int 上会存在多张流表,例如 table 0 做入口分类,table 10 做 VLAN 处理,table 20 做隧道封装决策。控制器(如 OpenDaylight、ONOS 或厂商 SDN 控制器)通过 OpenFlow 下发流表,OVS 则在内核数据面执行快速转发。第一条报文通常走慢路径(upcall 到用户态),后续相同流走快路径,直接在内核中转发。

OVS 在云数据中心中的位置

从整体架构看,OVS 位于物理主机内部,是虚拟网络与物理网络之间的“最后一跳”。向上,它连接虚拟机、容器和主机上的虚拟接口;向下,它通过物理网卡接入物理交换机;横向,它通过 VXLAN/Geneve 隧道与其他主机上的 OVS 互联。控制平面由 SDN 控制器统一编排,数据平面由 OVS 在内核中高速执行。

下面这张图展示了单台物理主机内 OVS 的典型连接关系:虚拟机通过 tap 接入 br-int,br-int 再通过 veth 或直接挂接物理网卡 eth0 接入物理网络,同时通过 VXLAN/Geneve 隧道端口与其他主机互联。控制器通过 OpenFlow 通道向 OVS 下发流表。

单台物理主机内 OVS 虚拟交换架构 SDN 控制器 OpenFlow 流表下发 OpenFlow Open vSwitch(用户态 + 内核态) br-int 集成网桥 流表 table 0 / 10 / 20 MAC 学习 + OpenFlow VLAN / 隧道决策 QoS / 镜像 / 安全组 br-tun 隧道网桥 VXLAN / Geneve 封装 VNI / TLV 映射 远端 IP 隧道端口 解封装与转发 patch 虚拟机 A vnet0 (tap) MAC: 52:54:00:aa 虚拟机 B vnet1 (tap) MAC: 52:54:00:bb tap tap 物理网卡 eth0 10.0.0.1/24 上行物理交换机 物理口 远端主机 10.0.0.2 OVS br-tun VXLAN/Geneve 集成网桥 隧道网桥 虚拟机/tap 物理网卡 远端主机

一个可观察的转发示例

假设虚拟机 A(MAC 52:54:00:aa)要 ping 虚拟机 B(MAC 52:54:00:bb),两者在同一主机、同一网段。报文路径如下:

  1. 虚拟机 A 发出 ARP 请求,帧从 vnet0(tap)进入 OVS 网桥 br-int。
  2. br-int 的 table 0 匹配入端口 vnet0,跳转到 table 10 做 VLAN 处理。
  3. table 10 发现目的 MAC 为广播,执行泛洪,将帧复制到 vnet1 和其他端口。
  4. 虚拟机 B 收到 ARP 请求并回复,回复帧从 vnet1 进入 OVS。
  5. OVS 学习到 52:54:00:aa 位于 vnet0,后续单播帧直接转发到 vnet0,不再泛洪。

如果虚拟机 B 位于另一台物理主机上,则 br-int 会把帧交给 br-tun,br-tun 根据目的 MAC 查到对应的 VXLAN/Geneve 隧道端口,封装外层 UDP/IP 头后从 eth0 发出。远端主机收到后解封装,再交给本机 br-int 转发给目标虚拟机。

在实际排查中,可以用 ovs-vsctl show 查看网桥和端口拓扑,用 ovs-ofctl dump-flows br-int 查看流表命中情况,用 ovs-appctl ofproto/trace 模拟一条报文的完整转发路径。这些命令能帮助确认 tap、veth、隧道端口和流表是否按预期工作。

关键构件对照

构件 所在层次 核心作用 典型使用场景
网桥 / OVS 网桥 二层 MAC 学习与转发,支持流表 br-int、br-tun、br-ex
veth pair 二层 连接两个网络命名空间或网桥 容器网络、网桥互联
tap 二层 虚拟机虚拟网卡接入主机 KVM/QEMU 虚拟机
VXLAN Overlay 24 位 VNI,UDP 封装 大规模租户隔离
Geneve Overlay 可变 TLV,扩展性强 新一代云数据中心
OpenFlow 控制面 流表下发与可编程转发 SDN 控制器对接 OVS