VXLAN

本页记录 MikroTik RouterOS 的 VXLAN 实现,涵盖其扩展 VLAN ID 的用途、VXLAN 接口和 VTEP 的配置选项以及转发表监控。它详细介绍了 MTU、VNI、ARP 处理以及用于基于 UDP 的第 2 层覆盖网络的组播组管理等设置。

VXLAN


虚拟可扩展局域网(VXLAN)是一种隧道协议,旨在解决 IEEE 802.1Q 中 VLAN ID 数量有限(4096)的问题,由 IETF RFC 7348 描述。使用 VXLAN,标识符的大小扩展到 24 位(16777216)。它在第 3 层网络上创建第 2 层覆盖方案,该协议运行在 UDP 之上。RouterOS VXLAN 接口支持 IPv4 或 IPv6(自 7.6 版本起),但不支持双栈。

信息

VXLAN 对 IPv4 造成 50 字节开销,对 IPv6 造成 70 字节开销。配置 VXLAN 时,建议通过相应配置 MTU 或限制以太网帧的大小,确保封装的以太网帧大小不超过底层网络的 MTU。 只有同一 VXLAN 段内的设备才能相互通信。每个 VXLAN 段通过一个 24 位的段 ID 来标识,称为 VXLAN 网络标识符(VNI)。与大多数隧道不同,VXLAN 是一种 1 对 N 的网络,而不仅仅是点对点。终止 VXLAN 隧道的 VXLAN 端点称为 VXLAN 隧道端点(VTEP)。RouterOS 仅支持静态配置的远程 VTEP。当需要通过 VXLAN 发送单播流量时,设备可以以类似于学习型网桥的方式动态学习另一端点的 IP 地址,并仅将流量转发到必要的 VTEP。对于需要泛洪(广播、未知单播和组播)到同一段上所有 VTEP 的流量,VXLAN 可以使用组播,或使用带首端复制(head-end replication)的单播,为每个远程 VTEP 发送一个副本。

配置选项


本节介绍 VXLAN 接口和 VTEP 配置选项。

子菜单: /interface/vxlan

PropertyDescription
allow-fast-path (yes | no; Default: yes)是否允许 Fast Path 处理。通过 VXLAN 的分片和泛洪数据包会经由慢速路径重定向。使用 VRF 的 VXLAN 接口会禁用 Fast Path。此设置自 RouterOS 7.8 版本起可用。
arp (disabled | enabled | local-proxy-arp | proxy-arp | reply-only; Default: enabled)地址解析协议设置<code>disabled</code> - 接口将不使用 ARP<code>enabled</code> - 接口将使用 ARP<code>local-proxy-arp</code> - 路由器在接口上执行代理 ARP 并向同一接口发送回复<code>proxy-arp</code> - 路由器在接口上执行代理 ARP 并向其他接口发送回复<code>reply-only</code> - 接口仅回复来自匹配的 IP 地址/MAC 地址组合的请求,这些组合作为静态条目输入到 IP/ARP 表中。不会自动在 IP/ARP 表中存储动态条目。因此为了使通信成功,必须已存在有效的静态条目。
arp-timeout (auto | integer; Default: auto)在没有从 IP 收到数据包后,ARP 记录在 ARP 表中保留的时间。值 auto 等于 IP/Settings 中 arp-timeout 的值,默认为 30s。
bridge (name; Default: )将 VXLAN 接口作为从端口添加到的 bridge 接口名称。
bridge-pvid (integer 1..4094; Default: 1)用于为动态网桥端口分配 PVID 参数。此属性仅在 bridge vlan-filtering 设置为 yes 时才有效。
checksum(yes | no; Default: no)此设置控制是否在发送的外层 VXLAN 数据包中计算 UDP 校验和:<code>no</code> – 发送的外层数据包中 UDP 校验和被设置为零。这还允许接收 UDP 校验和为零的 IPv6 VXLAN 数据包。<code>yes</code> - 在发送的外层数据包中计算 UDP 校验和。如果数据包传输使用硬件卸载,则忽略此设置,行为默认发送 UDP 校验和为零的数据包。
comment (string; Default: )接口的简短描述。
disabled (yes | no; Default: no)更改接口是否被禁用。
dont-fragment(auto | disabled | enabled | inherit; Default: auto)不分片(DF)标志控制数据包在通过网络发送之前是否可以拆分为更小的数据包(称为分片)。配置 VXLAN 时,此设置决定外层 IPv4 报头上 DF 标志的存在,并且在被封装的数据包超过出接口 MTU 时可以控制数据包分片。此设置有三个选项:<code>auto</code> - 如果设备支持 VXLAN 卸载,则 dont-fragment 模式将按 <code>enabled</code> 运行。如果不支持 VXLAN 卸载,则将使用 <code>inherit</code> 模式。<code>disabled</code> - 不在外层 IPv4 报头上设置 DF 标志,这意味着如果数据包太大而无法通过出接口发送,则可以分片。这还允许在 VXLAN 使用 IPv6 底层时进行数据包分片。在兼容设备上禁用硬件卸载。<code>enabled</code> - 始终在外层 IPv4 报头上设置 DF 标志,这意味着数据包不会分片,如果超过出接口的 MTU 将被丢弃。这还避免了 VXLAN 使用 IPv6 底层时的数据包分片。<code>inherit</code> - 外层 IPv4 报头上的 DF 标志基于内层 IPv4 DF 标志。如果内层 IPv4 报头设置了 DF 标志,则外层 IPv4 报头也将设置它。如果数据包超过出接口的 MTU 且设置了 DF,它将被丢弃。如果内层数据包是非 IP,则外层 IPv4 报头将不设置 DF 标志,数据包可以分片。如果内层数据包是 IPv6,则外层 IPv4 报头将始终设置 DF 标志,数据包不能分片。请注意,当 VXLAN 使用 IPv6 底层时,此设置没有任何效果,并且与 <code>disabled</code> 相同对待。此设置自 RouterOS 7.8 版本起可用。
group (IPv4 | IPv6; Default: )指定后,可以使用组播组地址在 VTEP 之间转发广播、未知单播和组播流量。此属性需要指定 interface 设置。接口将使用 IGMP 或 MLD 加入指定的组播组,请确保添加必要的 PIM 和 IGMP/MLD 配置。当设置此属性时,vteps-ip-version 会自动更新为所使用的组播 IP 版本。在兼容设备上禁用硬件卸载。
hw (yes | no; Default: yes)允许禁用硬件卸载,仅适用于支持 VXLAN 卸载的设备。
interface (name; Default: )用于组播转发的接口名称。此属性需要指定 group 设置。在兼容设备上禁用硬件卸载。
learning(yes | no; Default: yes)此设置控制是否从接收的数据包动态学习内层源 MAC 地址和远程 VTEP IP/IPv6 地址。
local-address (IPv4 | IPv6; Default: )指定 VXLAN 接口的本地源地址。如果未设置,将选择出接口的一个 IP 地址作为 VXLAN 数据包的源地址。当设置此属性时,vteps-ip-version 会自动更新为所使用的本地 IP 版本。此设置自 RouterOS 7.7 版本起可用。
mac-address (MAC; Default: )接口的静态 MAC 地址。未指定时将分配一个随机生成的 MAC 地址。
max-fdb-size (integer: 1..65535**; Default: 4096)限制 VXLAN 可以在转发表(FDB)中存储的最大 MAC 地址数量。
mtu (integer; Default: 1500)对于最大传输单元,VXLAN 接口将默认将 MTU 设置为 1500。l2mtu 将根据关联的 interface 自动设置(减去对应 VXLAN 报头的 50 字节)。如果未指定接口,则使用 65535 的 l2mtu 值。l2mtu 无法更改。
name (text; Default: vxlan1)接口名称。
port (integer: 1..65535**; Default: 4789)用于监听和向远程 VTEP 发送数据包的 UDP 端口号。
rem-csum (both | none | rx | tx; Default: none)更改 VXLAN 接口的远程校验和卸载(RCO)设置。RCO 是一种省略封装数据报内层校验和的技术,允许由网络驱动程序卸载外层校验和。然而,它确实涉及对封装协议的更改,接收方也必须支持。因此,默认禁用它,并提供此设置以确保与依赖此功能的系统兼容。RCO 在以下 Internet-Draft 中有详细说明:Remote checksum offload for VXLAN, draft-herbert-vxlan-rco-00。Remote checksum offload for encapsulation, draft-herbert-remotecsumoffload-00。如果使用硬件卸载,则忽略此设置,行为默认为 none。
ttl (auto | integer: 0..255**; Default: auto)指定在发出的数据包中使用的 TTL 值。默认情况下,使用 auto 选项时 TTL 设置为 64。但是,如果 VXLAN 使用组播底层网络,则默认 TTL 设置为 1。如果组播网络涉及路由,您需要将 TTL 增加到更高的值。
vni (integer: 1..16777215; Default: )VXLAN 网络标识符(VNI)。
vtep-vrf (name; Default: main)为 VXLAN 接口设置 VRF,VTEP 在该 VRF 上监听并建立连接。使用 interface 和组播 group 设置时不支持 VRF。同一个 UDP port 不能同时在多个路由表中使用。当使用未设置为 "main" 的 VRF 时,在兼容设备上会禁用硬件卸载。此设置自 RouterOS 7.7 版本起可用。
vteps-ip-version (ipv4 | ipv6; Default: ipv4)用于静态配置的 VTEP 的 IP 协议版本。RouterOS VXLAN 接口不支持双栈,任何配置为相反 IP 版本的远程 VTEP 都将被忽略。当设置组播 group 或 local-address 属性时,vteps-ip-version 会自动更新为所使用的 IP 版本。使用 IPv6 会在兼容设备上禁用硬件卸载。此设置自 RouterOS 7.6 版本起可用。

子菜单: /interface/vxlan/vteps

PropertyDescription
comment (string; Default: )所配置 VTEP 的简短描述。
interface (name; Default: )VXLAN 接口的名称。
remote-ip (IPv4 | IPv6; Default: )定义 VTEP 端点的 IPv4 或 IPv6 地址,当 VXLAN 接口需要发送 BUM(广播、未知单播、组播)流量时使用。它不用作访问控制。

转发表


自 RouterOS 7.9 版本起,可以监控从远程 VTEP 学习到的 MAC 地址。

子菜单: /interface/vxlan/fdb

PropertyDescription
interface (read-only: name)VXLAN 接口的名称。
mac-address (read-only: MAC address)MAC 地址。
remote-ip (read-only: IPv4 | IPv6 address)远程 VTEP 的 IPv4 或 IPv6 目标地址。
[admin@MikroTik] > /interface/vxlan/fdb/print          
 0 remote-ip=2001::2 mac-address=56:FF:AA:1A:72:33 interface=vxlan1 

 1 remote-ip=2002::2 mac-address=AE:EC:C4:12:8B:B9 interface=vxlan1 

 2 remote-ip=192.168.10.20 mac-address=FE:AF:58:31:A7:B6 interface=vxlan2

配置示例


本配置示例在两个静态配置的 VTEP 端点之间创建单个 VXLAN 隧道。

首先,在两台路由器上创建 VXLAN 接口。

/interface/vxlan
add name=vxlan1 port=4789 vni=10

然后使用各自的 IPv4 目标地址在两台路由器上配置 VTEP。两台设备都应具有指向目标地址的活动路由。

# Router1
/interface/vxlan/vteps
add interface=vxlan1 remote-ip=192.168.10.10

# Router2
/interface/vxlan/vteps
add interface=vxlan1 remote-ip=192.168.20.20

配置完成。可以将 VXLAN 接口与其他以太网接口一起加入网桥。

硬件卸载 VXLAN


从 RouterOS 7.18 版本开始,引入了对硬件卸载 VXLAN 的初步支持。这使得卸载的 VXLAN 数据平面成为可能,支持封装和解封装,并允许在 vlan-filtering 网桥内进行静态的一对一 VLAN 到 VXLAN 映射。兼容设备列表请参阅 L3HW Device Support 文档。

目前,一些已知功能尚未实现。

底层(路由封装的 VXLAN 数据包)

  1. 不支持基于 ECMP 的 VTEP。

  2. 不支持基于 bond、bridge、VLAN 接口的 VTEP(仅支持独立的可路由以太网接口)。

  3. 不支持基于组播的 VTEP。

  4. VTEP 不能在 VRF 内运行。

  5. 不支持使用 IPv6 的 VTEP。

覆盖层(以太网与 VXLAN 之间的转发)

  1. 不支持不同 VXLAN VNI 之间的路由。

  2. VTEP 相互隔离,没有机制控制它们之间的“水平分割(horizon)”。

  3. 桥接的 VXLAN 接口不支持 IGMP snooping。启用 snooping 时,VXLAN 上的 MDB 条目不会被卸载,组播流量在以太网和 VXLAN 之间会受到限制。

  4. 桥接的 VXLAN 接口不支持 MLAG。

基本配置示例

在此示例中,使用静态路由到达远程 VTEP,但也可以使用 OSPF 或 BGP 等动态路由协议。上行接口具有更高的 MTU 以支持大数据包和 VXLAN 封装。以下是网络拓扑概览:

sfp-sfpplus1 - 上行(底层)接口
sfp-sfpplus3 - 用于未标记 VLAN 10 的桥接端口
sfp-sfpplus4 - 用于未标记 VLAN 20 的桥接端口
vxlan-10010 - 用于未标记 VLAN 10 的覆盖端口
vxlan-10020 - 用于未标记 VLAN 20 的覆盖端口

/interface/bridge
add name=bridge1 vlan-filtering=yes
/interface/ethernet
set [ find default-name=sfp-sfpplus1 ] l2mtu=9500 mtu=9500
/interface/vxlan
add bridge=bridge1 bridge-pvid=10 local-address=192.168.1.1 name=vxlan-10010 vni=10010
add bridge=bridge1 bridge-pvid=20 local-address=192.168.1.1 name=vxlan-10020 vni=10020
/interface/bridge/port
add bridge=bridge1 interface=sfp-sfpplus3 pvid=10
add bridge=bridge1 interface=sfp-sfpplus4 pvid=20
/interface/vxlan/vteps
add interface=vxlan-10010 remote-ip=192.168.1.2
add interface=vxlan-10020 remote-ip=192.168.1.2
/ip/address
add address=192.168.1.1 interface=lo network=192.168.1.1
add address=192.168.10.10/24 interface=sfp-sfpplus1 network=192.168.10.0
/ip/route
add dst-address=192.168.1.2 gateway=192.168.10.20
/interface/ethernet/switch
set 0 l3-hw-offloading=yes