虚拟可扩展局域网文档

VXLAN 协议是一种隧道协议,旨在解决 IEEE 802.1q 中 VLAN ID(4096 个)数量有限的问题。使用 VXLAN,标识符的大小扩展到 24 位(16777216)。

VXLAN 由 IETF RFC 7348 描述,并已被许多供应商实施。该协议通过 UDP 使用单个目标端口运行。本文档描述了 Linux 内核隧道设备,还有一个独立的 Openvswitch 的 VXLAN 实现。

与大多数隧道不同,VXLAN 是一个 1 对 N 的网络,而不仅仅是点对点。VXLAN 设备可以动态地学习其他端点的 IP 地址,类似于学习桥接的方式,或者使用静态配置的转发条目。

VXLAN 的管理方式类似于其两个最接近的邻居 GRE 和 VLAN。配置 VXLAN 需要与首次将 VXLAN 合并到上游的内核版本相匹配的 iproute2 版本。

  1. 创建 vxlan 设备

    # ip link add vxlan0 type vxlan id 42 group 239.1.1.1 dev eth1 dstport 4789
    

这将创建一个名为 vxlan0 的新设备。该设备使用多播组 239.1.1.1 通过 eth1 处理转发表中没有条目的流量。目标端口号设置为 IANA 分配的值 4789。Linux 的 VXLAN 实现早于 IANA 选择标准目标端口号,默认使用 Linux 选择的值以保持向后兼容性。

  1. 删除 vxlan 设备

    # ip link delete vxlan0
    
  2. 显示 vxlan 信息

    # ip -d link show vxlan0
    

可以使用新的 bridge 命令创建、销毁和显示 vxlan 转发表。

  1. 创建转发表条目

    # bridge fdb add to 00:17:42:8a:b4:05 dst 192.19.0.2 dev vxlan0
    
  2. 删除转发表条目

    # bridge fdb delete 00:17:42:8a:b4:05 dev vxlan0
    
  3. 显示转发表

    # bridge fdb show dev vxlan0
    

以下 NIC 功能可能表示支持 UDP 隧道相关的卸载(最常见的是 VXLAN 功能,但对特定封装协议的支持是 NIC 特有的)

  • tx-udp_tnl-segmentation

  • tx-udp_tnl-csum-segmentation

    能够对 UDP 封装帧执行 TCP 分段卸载

  • rx-udp_tunnel-port-offload

    接收侧解析 UDP 封装帧,这允许 NIC 执行协议感知卸载,例如内部帧的校验和验证卸载(仅当 NIC 没有协议无关的卸载时才需要)

对于支持 rx-udp_tunnel-port-offload 的设备,可以使用 ethtool 查询当前卸载的端口列表

$ ethtool --show-tunnels eth0
Tunnel information for eth0:
  UDP port table 0:
    Size: 4
    Types: vxlan
    No entries
  UDP port table 1:
    Size: 4
    Types: geneve, vxlan-gpe
    Entries (1):
        port 1230, vxlan-gpe