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
| Property | Description |
|---|---|
| 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
| Property | Description |
|---|---|
| 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
| Property | Description |
|---|---|
| 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 数据包)
-
不支持基于 ECMP 的 VTEP。
-
不支持基于 bond、bridge、VLAN 接口的 VTEP(仅支持独立的可路由以太网接口)。
-
不支持基于组播的 VTEP。
-
VTEP 不能在 VRF 内运行。
-
不支持使用 IPv6 的 VTEP。
覆盖层(以太网与 VXLAN 之间的转发)
-
不支持不同 VXLAN VNI 之间的路由。
-
VTEP 相互隔离,没有机制控制它们之间的“水平分割(horizon)”。
-
桥接的 VXLAN 接口不支持 IGMP snooping。启用 snooping 时,VXLAN 上的 MDB 条目不会被卸载,组播流量在以太网和 VXLAN 之间会受到限制。
-
桥接的 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