Layer2 misconfiguration

本页介绍 MikroTik RouterOS 中的第 2 层错误配置,重点讨论网桥硬件卸载设置不当和端口隔离等问题。它解释了低吞吐量、高 CPU 占用以及硬件卸载标志不正确等症状,并针对不支持端口隔离的设备提供了解决方案。

第 2 层错误配置


有些配置在设计上存在重大缺陷,应尽一切可能避免。配置错误的第 2 层有时会导致难以检测的网络错误、随机的性能下降、网络的某些网段无法访问、某些网络服务出现故障,或者整个网络完全失效。本页将介绍一些常见以及不太常见的、会导致网络问题的配置。

单个交换机芯片上的多个网桥


请考虑以下场景。您有一台带有内置交换机芯片的设备,需要将某些端口彼此隔离。为此,您创建了多个网桥并在它们上面启用了硬件卸载。由于每个网桥位于不同的第 2 层域中,第 2 层帧不会在这些网桥之间转发。因此,每个网桥中的端口与不同网桥上的其他端口相互隔离。

配置

/interface/bridge
add name=bridge1
add name=bridge2
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
add bridge=bridge2 interface=ether3
add bridge=bridge2 interface=ether4

问题

在一次简单的性能测试之后,您可能会注意到一个网桥能够以线速转发流量,而第二个、第三个等网桥则无法转发与第一个网桥一样多的数据。另一个症状可能是需要路由的数据包存在很大的延迟。快速检查后,您可能会注意到 CPU 始终处于满载状态。这是因为硬件卸载并非在所有网桥上可用,而只在一个网桥上可用。检查硬件卸载状态,您会发现只有一个网桥处于活动状态:

[admin@MikroTik] > /interface/bridge/port/print
Flags: X - disabled, I - inactive, D - dynamic, H - hw-offload 
 #     INTERFACE                                 BRIDGE                                 HW
 0   H ether1                                    bridge1                                yes
 1   H ether2                                    bridge1                                yes
 2     ether3                                    bridge2                                yes
 3     ether4                                    bridge2                                yes

只有一个网桥具有可用的硬件卸载标志的原因是设备不支持端口隔离。如果不支持端口隔离,那么只有一个网桥能够将流量卸载到交换机芯片。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 网桥端口缺少 "H" 标志。
  • 低吞吐量。
  • 高 CPU 占用。

解决方案

并非所有设备都支持端口隔离。目前只有 CRS1xx/CRS2xx 系列设备支持它,并且同时只支持 7 个隔离且硬件卸载的网桥。其他设备将不得不使用 CPU 在其他网桥上转发数据包。这通常是硬件限制,可能需要更换设备。网桥的 split-horizon 参数是一种会禁用硬件卸载的软件功能,而使用网桥过滤规则时,您需要启用将所有数据包转发到 CPU,这要求禁用硬件卸载。您可以使用 hw=yes 标志控制哪个网桥将被硬件卸载,并将其他网桥设置为 hw=no,例如:

/interface/bridge/port/set [find where bridge=bridge1] hw=no
/interface/bridge/port/set [find where bridge=bridge2] hw=yes

有时可以重新调整网络拓扑以使用 VLAN,这是隔离第 2 层网络的正确方式。

硬件卸载和 MAC 学习时的数据包流


请考虑以下场景:您设置了一个网桥并启用了硬件卸载,以最大化设备的吞吐量;结果是您的设备像交换机一样工作,但您想使用 Sniffer 或 Torch 工具进行调试,或者想实现数据包日志记录。

配置

/interface/bridge
add name=bridge1
/interface/bridge/port
add bridge=bridge1 hw=yes interface=ether1 learn=yes
add bridge=bridge1 hw=yes interface=ether2 learn=yes

问题

在运行 Sniffer 或 Torch 工具捕获数据包时,您可能会注意到几乎看不到任何数据包,只有一些单播数据包,捕获到的大多是广播/多播数据包,而接口报告通过某些接口的流量远大于捕获到的流量。如果您将两个或更多以太网接口添加到网桥并启用 硬件卸载,那么交换机芯片将用于在端口之间转发数据包。要理解为什么只能捕获到部分数据包,我们必须首先了解交换机芯片如何与 CPU 互连。在此示例中,我们可以使用一个通用 5 端口以太网路由器的框图:

Switch Chip Block Diagram

对于此设备,每个以太网端口都连接到交换机芯片,而交换机芯片通过 CPU 端口(有时称为 switch-cpu 端口)连接到 CPU。要使数据包在 Sniffer 或 Torch 工具中可见,数据包必须从以太网端口发送到 CPU 端口,这意味着数据包必须发往 CPU 端口(数据包的目的 MAC 地址与网桥的 MAC 地址匹配),或者数据包的 MAC 地址尚未学习(数据包被泛洪到所有端口),此行为是由 MAC 学习导致的。

交换机芯片维护一个称为 主机表(Host table) 的 MAC 地址和端口列表。每当需要转发数据包时,交换机芯片会在主机表中检查数据包的目的 MAC 地址,以找到应该使用哪个端口来转发数据包。如果交换机芯片找不到目的 MAC 地址,则数据包将被泛洪到所有端口(包括 CPU 端口)。在数据包应从例如 ether1 转发到 ether2,并且 ether2 后面设备的 MAC 地址在主机表中的情况下,数据包永远不会被发送到 CPU,因此对 Sniffer 或 Torch 工具不可见。

症状

以下是可能由这种错误配置导致的一系列症状:

  • Sniffer 或 Torch 工具看不到数据包。
  • 过滤规则不生效。

解决方案

具有已学习目的 MAC 地址的数据包不会被发送到 CPU,因为这些数据包没有被泛洪到所有端口。如果您确实需要将某些数据包发送到 CPU 以供数据包分析器或防火墙使用,那么可以使用 ACL 规则将数据包复制或重定向到 CPU。下面是一个示例,说明如何发送发往 4C:5E:0C:4D:12:4B 的数据包副本:

/interface/ethernet/switch/rule
add copy-to-cpu=yes dst-mac-address=4C:5E:0C:4D:12:4B/FF:FF:FF:FF:FF:FF ports=ether1 switch=switch1

警告

如果数据包被发送到 CPU,那么该数据包必须由 CPU 处理;这会增加 CPU 负载。

LAG 接口与负载均衡


请考虑以下场景:您创建了一个 LAG 接口以提高两个网络节点之间的总带宽;通常这些节点是交换机。为了测试目的以确保 LAG 接口正常工作,您连接了两台传输数据的服务器,最常用的是众所周知的网络性能测量工具 Iperf 来测试此类设置。例如,您可能用两个千兆以太网端口组成了一个 LAG 接口,从而获得一个可以在两个接口上进行流量负载均衡、理论上可达 2Gbps 吞吐量的虚拟接口,而服务器使用 10Gbps 接口(例如 SFP+)连接。

LACP Setup

配置

以下配置与 SW1 和 SW2 相关:

/interface/bonding
add mode=802.3ad name=bond1 slaves=ether1,ether2
/interface/bridge
add name=bridge1
/interface/bridge/port
add bridge=bridge1 interface=bond1
add bridge=bridge1 interface=sfp-sfpplus1

问题

在初步测试之后,您立即注意到网络吞吐量从未超过 1Gbps 限制,尽管服务器以及网络节点(此例中为交换机)上的 CPU 负载很低,但吞吐量仍然仅限于 1Gbps。其背后的原因是 LACP(802.ad)使用发送哈希策略来确定流量是否可以在多个 LAG 成员上均衡,在这种情况下,LAG 接口并不会创建一个 2Gbps 的接口,而是创建一个在可能的情况下可以在多个从属接口上均衡流量的接口。对每个数据包都会生成一个发送哈希,它决定数据包将通过哪个 LAG 成员发送,这是为了避免数据包乱序所必需的,有一个选项可以选择发送哈希策略,通常可以在第 2 层(MAC)、第 3 层(IP)和第 4 层(Port)之间选择,在 RouterOS 中,可以使用 transmit-hash-policy 参数进行选择。在此例中,由于您将数据包发送到相同的目标 MAC 地址、相同的 IP 地址,并且 Iperf 也使用相同的端口,因此发送哈希是相同的,这为所有数据包生成了相同的发送哈希,因此无法在 LAG 成员之间进行负载均衡。请注意,即使目的地不同,数据包也并不总是能在 LAG 成员之间均衡,这是因为标准化的发送哈希策略可能会为不同目的地生成相同的发送哈希,例如,在使用 layer2-and-3 发送哈希策略且目标 MAC 地址相同的情况下,192.168.0.1/192.168.0.2 会均衡,但 192.168.0.2/192.168.0.4 不会均衡。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 流量仅通过一个 LAG 成员。

解决方案

选择正确的发送哈希策略并正确地测试网络吞吐量。测试此类设置的最简单方法是使用多个目的地,例如,不要只向一台服务器发送数据,而是向多台服务器发送数据。这将为每个数据包生成不同的发送哈希,并使跨 LAG 成员的负载均衡成为可能。对于某些设置,您可能希望更改绑定接口模式以提高总吞吐量。对于 UDP 流量,balance-rr 模式可能足够,但可能会导致 TCP 流量出现问题。您可以在此处阅读有关为您的设置选择正确模式的更多信息。

从属接口上的 VLAN 接口


请考虑以下场景:您创建了一个网桥,并希望 DHCP 服务器仅向某些已标记的 VLAN 流量分配 IP 地址,为此您创建了一个 VLAN 接口,指定了 VLAN ID 并在其上创建了 DHCP 服务器,但不知何故它无法正常工作。

配置

/interface/bridge
add name=bridge1
/interface/bridge/port
add interface=ether1 bridge=bridge1
add interface=ether2 bridge=bridge1
/interface/vlan
add name=VLAN99 interface=ether1 vlan-id=99
/ip/pool
add name=VLAN99_POOL range=192.168.99.100-192.168.99.200
/ip/address/add address=192.168.99.1/24 interface=VLAN99
/ip/dhcp-server
add interface=VLAN99 address-pool=VLAN99_POOL disabled=no
/ip/dhcp-server/network
add address=192.168.99.0/24 gateway=192.168.99.1 dns-server=192.168.99.1

问题

当您将接口添加到网桥时,网桥成为主接口,所有网桥端口成为从属端口。这意味着在网桥端口上收到的所有流量都会被网桥接口捕获,所有流量都通过网桥接口而不是物理接口转发到 CPU。因此,创建在从属接口上的 VLAN 接口将永远无法捕获任何流量,因为在任何数据包处理完成之前,它就被立即转发到主接口。通常的副作用是某些 DHCP 客户端能收到 IP 地址,而某些收不到。

症状

以下是可能由这种错误配置导致的一系列症状:

  • DHCP 客户端/服务器无法正常工作。
  • 设备不可达。
  • 网桥后面的设备无法通过已标记流量访问。

解决方案

更改 VLAN 接口将监听的接口,将其更改为主接口:

/interface/vlan/set VLAN99 interface=bridge1

网桥中的网桥上配置 VLAN


请考虑以下场景:您有一组接口(不一定是物理接口),并且希望它们都位于同一个第 2 层网段中。解决方案是将它们添加到单个网桥,但您要求来自某个端口的流量将所有流量标记到某个 VLAN 中。这可以通过在网桥接口之上创建一个 VLAN 接口,并创建一个单独的网桥,该网桥包含这个新创建的 VLAN 接口以及一个应该为所有收到的流量添加 VLAN 标记的接口来实现。网络图如下:

VLAN on Bridge in Bridge

配置

/interface/bridge
add name=bridge1
add name=bridge2
/interface/vlan
add interface=bridge1 name=VLAN vlan-id=99
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
add bridge=bridge2 interface=VLAN
add bridge=bridge2 interface=ether3

问题

为了更好地理解潜在问题,让我们首先查看网桥主机表。

[admin@switch] /interface/bridge/host/print where !local 
Flags: X - disabled, I - invalid, D - dynamic, L - local, E - external 
 #       MAC-ADDRESS        VID ON-INTERFACE    BRIDGE
 0   D   CC:2D:E0:E4:B3:A1      ether1          bridge1
 1   D   CC:2D:E0:E4:B3:A2      ether2          bridge1
 2   D   CC:2D:E0:E4:B3:A1      VLAN            bridge2
 3   D   CC:2D:E0:E4:B3:A2      VLAN            bridge2
 4   D   CC:2D:E0:E4:B3:A3      ether3          bridge2

ether1 和 ether2 上的设备需要发送 VLAN-ID 为 99 的已标记数据包才能到达 ether3 上的主机(其他数据包不会传递到 VLAN 接口并进一步与 ether3 桥接)。我们可以在主机表中看到 bridge2 已学习到这些主机。从 ether3 发往 ether1 的数据包将被正确地以已标记方式发出,流量不会在 bridge1 中被泛洪。但是由于 MAC 学习只能在网桥端口之间进行,而不能在网桥接口之上创建的接口上进行,因此从 ether2 发往 ether3 的数据包将在 bridge1 中被泛洪。

此外,如果 ether3 后面的设备使用 (R)STP,那么 ether1 和 ether2 将发送违反 IEEE 802.1W 标准的已标记 BPDU。由于损坏的 MAC 学习功能和损坏的 (R)STP,必须避免这种设置和配置。还已知在某些设置中,这种配置可能会阻止您使用 MAC telnet 连接到设备。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 端口被 RSTP 阻塞。
  • 网络中出现环路。
  • 端口抖动。
  • 流量被泛洪到所有端口。
  • MAC telnet 无法连接。
  • 设备无法访问。

解决方案

使用网桥 VLAN 过滤。标记流量的正确方法是在流量进入网桥时分配 VLAN ID。通过为网桥端口指定 PVID 值,并指定哪些端口是 tagged(干道)端口、哪些是 untagged(接入)端口,可以轻松实现此行为。下面是这种设置本应如何配置的示例:

/interface/bridge
add name=bridge1 vlan-filtering=yes
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=ether3 pvid=99
/interface/bridge/vlan
add bridge=bridge1 tagged=ether1,ether2 untagged=ether3 vlan-ids=99

危险

启用 vlan-filtering 会过滤发往 CPU 的流量,在启用 VLAN 过滤之前,您应确保已设置管理端口。

含物理接口的网桥中的 VLAN


与 网桥中的网桥上配置 VLAN 非常相似的情况。最常见的用例是您希望将物理接口与 VLAN 桥接(简化的干道/接入端口设置)。在这样的设置中,您可能希望在一侧发送已标记流量,在另一侧发送未标记流量。为实现这一点,您可以在干道端口(已标记侧)上创建一个 VLAN 接口,然后创建一个网桥,并将 VLAN 接口和物理接口(未标记侧)都添加为网桥端口。

配置

/interface/vlan
add interface=ether1 name=VLAN99 vlan-id=99
/interface/bridge
add name=bridge1
/interface/bridge/port
add interface=ether2 bridge=bridge1
add interface=VLAN99 bridge=bridge1

问题

这种设置和配置在大多数情况下都能正常工作,但在使用 (R/M)STP 时违反了 IEEE 802.1W 标准。如果这是您第 2 层域中唯一的设备,那么这不应造成问题,但当存在其他厂商的交换机时可能会出现问题的原因是,网桥接口上的 RSTP 默认启用,允许从每个网桥端口发送桥接协议数据单元(BPDU)。虽然 ether2 正确地发送未标记的 BPDU,但作为网桥端口的 VLAN99 接口会通过 ether1 发送已标记的 BPDU。并非所有交换机都能理解已标记的 BPDU。在具有多个网络拓扑(针对某些 VLAN 或 VLAN 组)的更复杂网络中,应谨慎使用此配置。这与 MSTP 和混合厂商设备的 PVSTP(+) 相关。在具有多个网络拓扑(针对某些 VLAN)的环状拓扑中,交换机的一个端口将被阻塞,但在 MSTP 和 PVSTP(+) 中,可以为某个 VLAN 打开一条路径,在这种情况下,不支持 PVSTP(+) 的设备可能会去除 BPDU 的标记并转发 BPDU,结果交换机会收到自己的数据包,触发环路检测并阻塞一个端口。这也可能发生在其他协议上,但 (R)STP 是最常见的情况。如果交换机使用 BPDU guard 功能,那么这种配置可能会触发它并导致端口被 STP 阻塞。据报告,在使用 6.41 或更高版本时,这种配置可能会随时间推移阻止流量通过某些网桥端口转发。这种配置不仅会破坏 (R/M)STP,还可能导致环路警告。这可能由 MNDP 数据包或任何其他直接从接口发出的数据包引起。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 端口被 RSTP 阻塞。
  • 网络中出现环路。
  • 端口抖动。
  • 流量随时间推移停止转发。
  • BPDU 被其他启用 RSTP 的设备忽略。

解决方案

为避免兼容性问题,您应使用网桥 VLAN 过滤。下面您可以找到一个示例,说明如何使用网桥 VLAN 过滤配置实现相同的流量标记效果:

/interface/bridge
add name=bridge1 vlan-filtering=yes
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2 pvid=99
/interface/bridge/vlan
add bridge=bridge1 tagged=ether1 untagged=ether2 vlan-ids=99

危险

启用 vlan-filtering 会过滤发往 CPU 的流量。在启用 VLAN 过滤之前,您应确保已设置管理端口。

物理接口上的桥接 VLAN


与 网桥中的网桥上配置 VLAN 非常相似的情况:请考虑以下场景。您的网络中有几台交换机,您使用 VLAN 来隔离某些第 2 层域,并将这些交换机连接到一台分配地址并将流量路由到外部世界的路由器。为了实现冗余,您将所有交换机直接连接到路由器并启用了 RSTP,但为了能够设置 DHCP 服务器,您决定可以针对连接到交换机的每个物理接口上的每个 VLAN 创建 VLAN 接口,并将这些 VLAN 接口添加到网桥中。网络图如下:

Bridged VLANs

配置

此案例仅与路由器部分相关,只要端口已交换,交换机配置并不重要。路由器配置如下:

/interface/bridge
add name=bridge10
add name=bridge20
/interface/vlan
add interface=ether1 name=ether1_v10 vlan-id=10
add interface=ether1 name=ether1_v20 vlan-id=20
add interface=ether2 name=ether2_v10 vlan-id=10
add interface=ether2 name=ether2_v20 vlan-id=20
/interface/bridge/port
add bridge=bridge10 interface=ether1_v10
add bridge=bridge10 interface=ether2_v10
add bridge=bridge20 interface=ether1_v20
add bridge=bridge20 interface=ether2_v20

问题

您可能会注意到网络出现一些奇怪的延迟,甚至网络无响应。您可能会注意到检测到环路(收到带有自己 MAC 地址的数据包),并且一些流量凭空产生。出现问题的原因是,来自 Router 上创建的任一 VLAN 接口的广播数据包将通过物理接口发出,数据包将经由物理接口、交换机转发,并在不同的物理接口上被接收回来,在此例中,通过 ether1_v10 发出的广播数据包将在 ether2 上收到,该数据包将被 ether2_v10 捕获,而它与 ether1_v10 桥接在一起,并将再次通过相同的路径转发(环路)。(R)STP 可能并不总能检测到此环路,因为 (R)STP 不了解任何 VLAN。未标记流量不存在环路,但已标记流量存在环路。在此场景中,环路相当明显,但在更复杂的设置中,并不总是容易检测到网络设计缺陷。有时如果您的网络不使用广播流量,这种网络设计缺陷可能会长期不被察觉,通常 邻居发现协议 会从 VLAN 接口广播数据包,并通常会在这种设置中触发环路检测。有时捕获触发环路检测的数据包很有用,这可以通过使用 sniffer 并分析数据包捕获文件来实现:

/tool/sniffer
set filter-mac-address=4C:5E:0C:4D:12:44/FF:FF:FF:FF:FF:FF \
filter-interface=ether1 filter-direction=rx file-name=loop_packet.pcap

或者使用日志记录更方便的方式:

/interface/bridge/filter
add action=log chain=forward src-mac-address=4C:5E:0C:4D:12:44/FF:FF:FF:FF:FF:FF
add action=log chain=input src-mac-address=4C:5E:0C:4D:12:44/FF:FF:FF:FF:FF:FF

症状

以下是可能由这种错误配置导致的一系列症状:

  • 端口被 (R)STP 阻塞。
  • 网络中出现环路。
  • 低吞吐量。
  • 端口抖动。
  • 网络无法访问。

解决方案

解决方案是使用网桥 VLAN 过滤,使所有网桥兼容 IEEE 802.1W 和 IEEE 802.1Q。

/interface/bridge
add name=bridge vlan-filtering=yes
/interface/bridge/port
add bridge=bridge interface=ether1
add bridge=bridge interface=ether2
/interface/bridge/vlan
add bridge=bridge tagged=ether1,ether2,bridge vlan-ids=10
add bridge=bridge tagged=ether1,ether2,bridge vlan-ids=20
/interface/vlan
add name=vlan10 interface=bridge vlan-id=10
add name=vlan20 interface=bridge vlan-id=20

危险

启用 vlan-filtering 会过滤发往 CPU 的流量。在启用 VLAN 过滤之前,您应确保已设置管理端口。

桥接 VLAN


物理接口上的桥接 VLAN 的更简化场景,但在这种情况下,您只是想将创建在不同物理接口上的两个或多个 VLAN 桥接在一起。这是一种非常常见的设置类型,值得单独撰写一篇文章,因为对这种设置的错误配置已导致多次网络故障。这种设置类型也用于 VLAN 转换。

配置

/interface/vlan
add interface=ether1 name=ether1_v10 vlan-id=10
add interface=ether2 name=ether2_v10 vlan-id=10
/interface/bridge
add name=bridge1
/interface/bridge/port
add bridge=bridge1 interface=ether1_v10
add bridge=bridge1 interface=ether2_v10

问题

您可能会注意到网络的某些部分无法访问,和/或某些链路持续抖动。这是由于 (R)STP 造成的。这种配置类型会强制设备发送已标记的 BPDU,而其他设备(包括 RouterOS)可能不支持这些 BPDU。由于设备收到格式错误的数据包(在运行 (R)STP 时,网络中不应存在已标记的 BPDU,这违反了 IEEE 802.1W 和 IEEE 802.1Q),设备将无法正确解释该数据包,并可能出现意外行为。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 端口被 (R)STP 阻塞。
  • 端口抖动。
  • 网络无法访问。

解决方案

最简单的解决方案是直接在网桥上禁用 (R)STP:

/interface/bridge
set bridge1 protocol-mode=none

不过仍建议将您的配置改写为使用网桥 VLAN 过滤:

/interface/bridge
add name=bridge1 vlan-filtering=yes
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
/interface/bridge/vlan
add bridge=bridge1 tagged=ether1,ether2 vlan-ids=10

危险

启用 vlan-filtering 会过滤发往 CPU 的流量。在启用 VLAN 过滤之前,您应确保已设置管理端口。

不使用硬件卸载的网桥 VLAN 过滤


请考虑以下场景:您了解了新的网桥 VLAN 过滤功能,并决定更改设备上的配置。您有一个非常简单的干道/接入端口设置,并且喜欢网桥 VLAN 过滤的概念。

配置

/interface/bridge
add name=bridge1 vlan-filtering=yes
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2 pvid=20
add bridge=bridge1 interface=ether3 pvid=30
add bridge=bridge1 interface=ether4 pvid=40
/interface/bridge/vlan
add bridge=bridge1 tagged=ether1 untagged=ether2 vlan-ids=20
add bridge=bridge1 tagged=ether1 untagged=ether3 vlan-ids=30
add bridge=bridge1 tagged=ether1 untagged=ether4 vlan-ids=40

问题

例如,您在 CRS1xx/CRS2xx 系列设备上使用此配置,并开始注意到 CPU 占用非常高,当运行性能测试以检查网络吞吐量时,您注意到总吞吐量只是本应轻松达到的线速性能的一小部分。问题的原因是并非所有设备都在硬件级别支持网桥 VLAN 过滤。所有设备都能够配置网桥 VLAN 过滤,但只有少数设备能够将流量卸载到交换机芯片。如果在带有内置交换机芯片的设备上使用了不当的配置方法,那么将使用 CPU 来转发流量。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 网桥端口缺少 "H" 标志。
  • 低吞吐量。
  • 高 CPU 占用。

解决方案

在使用网桥 VLAN 过滤之前,请检查您的设备是否在硬件级别支持它。兼容性表格可在 网桥硬件卸载 部分找到。目前每种类型的设备都需要不同的配置方法。以下列出了为了利用硬件卸载的优势,设备上应使用哪种配置:

多交换机芯片上的 VLAN 过滤


请考虑以下场景:您有一台带有两个或更多交换机芯片的设备,并决定使用单个网桥,在硬件级别设置 VLAN 过滤(通过使用 /interface/ethernet/switch 菜单),以便在网络上达到线速性能。这与 RB2011 和 RB3011 系列设备非常相关。在此示例中,假设您希望有一个干道端口,所有其他端口都是接入端口,例如 ether10 是我们的干道端口,ether1-ether9 是我们的接入端口。

配置

/interface/bridge
add name=bridge1
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=ether3
add bridge=bridge1 interface=ether4
add bridge=bridge1 interface=ether5
add bridge=bridge1 interface=ether6
add bridge=bridge1 interface=ether7
add bridge=bridge1 interface=ether8
add bridge=bridge1 interface=ether9
add bridge=bridge1 interface=ether10
/interface/vlan
add interface=bridge1 name=VLAN10 vlan-id=10
/interface/ethernet/switch/port
set ether1,ether2,ether3,ether4,ether5,ether6,ether7,ether8,ether9 default-vlan-id=10 vlan-header=always-strip vlan-mode=secure
set ether10 vlan-header=add-if-missing vlan-mode=secure
set switch1-cpu,switch2-cpu vlan-mode=secure
/interface/ethernet/switch/vlan
add ports=ether1,ether2,ether3,ether4,ether5,switch1-cpu switch=switch1 vlan-id=10
add ports=ether6,ether7,ether8,ether9,ether10,switch2-cpu switch=switch2 vlan-id=10

问题

运行几次测试后,您可能会注意到来自 ether6-ether10 的数据包按预期转发,但来自 ether1-ether5 的数据包并不总是正确转发(尤其是通过干道端口)。最明显的问题是通过 ether10 的来自 ether1-ether5 的数据包会被直接丢弃。这是因为这些端口位于不同的交换机芯片上。这意味着在硬件级别无法进行 VLAN 过滤,因为交换机芯片不知道另一个交换机芯片上 VLAN 表的内容。在位于不同交换机芯片上的端口之间转发的数据包也会由 CPU 处理,这意味着您将无法实现线速性能。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 数据包被丢弃。
  • 低吞吐量。

解决方案

正确的解决方案是考虑到这种硬件设计并相应地规划网络拓扑。要解决此问题,您必须创建两个单独的网桥并在每个交换机芯片上配置 VLAN 过滤。这限制了在交换机芯片之间转发数据包的可能性,不过可以配置两个网桥之间的路由(如果每个交换机芯片上连接的设备使用不同的网络子网)。

有一种方法可以配置设备使所有端口交换在一起,同时仍能在硬件级别使用 VLAN 过滤,不过此解决方案有一些注意事项。其思路是牺牲每个交换机芯片上的一个以太网端口,让它充当干道端口以在交换机芯片之间转发数据包,这可以通过在两个交换机芯片之间插入一根以太网网线来实现,例如,让我们在 ether5 和 ether6 之间插入一根以太网网线,然后假设这些端口是干道端口来重新配置设备:

/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=ether3
add bridge=bridge1 interface=ether4
add bridge=bridge1 interface=ether5
add bridge=bridge2 interface=ether6
add bridge=bridge2 interface=ether7
add bridge=bridge2 interface=ether8
add bridge=bridge2 interface=ether9
add bridge=bridge2 interface=ether10
/interface/ethernet/switch/port
set ether1,ether2,ether3,ether4,ether7,ether8,ether9 default-vlan-id=10 vlan-header=always-strip vlan-mode=secure
set ether5,ether6,ether10 vlan-header=add-if-missing vlan-mode=secure default-vlan-id=auto
set switch1-cpu,switch2-cpu vlan-mode=secure
/interface/ethernet/switch/vlan
add ports=ether1,ether2,ether3,ether4,ether5,switch1-cpu switch=switch1 vlan-id=10
add ports=ether6,ether7,ether8,ether9,ether10,switch2-cpu switch=switch2 vlan-id=10

警告

对于 100Mbps 交换机芯片,请使用 default-vlan-id=0 而不是 default-vlan-id=auto

使用简化网桥 VLAN 表的 VLAN 过滤


信息

此问题自 RouterOS v7.15 起已解决。现在动态 VLAN 始终作为单独的条目创建,不再与静态配置的条目合并。 您需要创建一个网络设置,其中多个客户端连接到不同的接入端口并由不同的 VLAN 隔离。此流量应被标记并发送到相应的干道端口。接入端口使用 pvid 属性配置。由于干道端口用于两个 VLAN,您决定通过添加单个网桥 VLAN 表条目并用逗号分隔 VLAN 来简化配置。当已标记的干道端口用于大量 VLAN 甚至某些 VLAN 范围(例如 vlan-id=100-200)时,这尤其有用。请参阅下面的网络图和配置。

Switch Multiple Untagged

配置

/interface/bridge
add name=bridge1 vlan-filtering=yes
/interface/bridge/port
add bridge=bridge1 interface=ether2
add bridge=bridge1 interface=ether3 pvid=10
add bridge=bridge1 interface=ether4 pvid=20
/interface/bridge/vlan
add bridge=bridge1 tagged=ether2 vlan-ids=10,20

问题

流量从接入端口正确地转发和标记到干道端口,但您可能会注意到,某些广播或多播数据包实际上在两个未标记接入端口之间被泛洪,尽管它们应该处于不同的 VLAN 上。此外,来自已标记端口的广播和多播流量也会被泛洪到两个接入端口。这可能会引起一些安全问题,因为来自不同网络的流量可以被嗅探。当您查看网桥 VLAN 表时,您会注意到为 VLAN 10 和 20 创建了单个条目,并且两个未标记端口都属于同一个 VLAN 组。

[admin@SW1] /interface/bridge/vlan/print where tagged=ether2
Columns: BRIDGE, VLAN-IDS, CURRENT-TAGGED, CURRENT-UNTAGGED
# BRIDGE   VLAN-IDS  CURRENT-TAGGED  CURRENT-UNTAGGED
;;; port with pvid added to untagged group which might cause problems, consider adding a separate VLAN entry
0 bridge1        10  ether2          ether3          
                 20                  ether4     

症状

  • 流量在不同 VLAN 之间被泛洪
  • 红色警告:port with pvid added to untagged group which might cause problems, consider adding a separate VLAN entry

解决方案

当接入端口使用 pvid 属性配置时,它们会被动态添加到相应的 VLAN 条目中。在创建包含多个 VLAN 或 VLAN 范围的静态 VLAN 条目后,具有匹配 pvid 的未标记接入端口也会被包含在同一个 VLAN 组或范围中。使用单个配置行定义大量 VLAN 可能很有用,但在配置接入端口时应格外小心。对于此示例,应创建单独的 VLAN 条目:

/interface/bridge/vlan
add bridge=bridge1 tagged=ether2 untagged=ether3 vlan-ids=10
add bridge=bridge1 tagged=ether2 untagged=ether4 vlan-ids=20

主接口上的 MTU


请考虑以下场景:您创建了一个网桥,向其中添加了几个接口,并在网桥接口之上创建了一个 VLAN 接口,但您需要增大 VLAN 接口上的 MTU 大小以接收更大的数据包。

配置

/interface/bridge
add name=bridge1
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2
/interface/vlan
add interface=bridge1 name=VLAN99 vlan-id=99

问题

一旦您尝试增大 VLAN 接口上的 MTU 大小,您就会收到 RouterOS Could not set MTU 的错误。当您尝试设置的 MTU 大于 L2MTU 时,就会发生这种情况。在这种情况下,您需要增大所有从属接口上的 L2MTU 大小,这将更新网桥接口上的 L2MTU 大小。完成此操作后,您将能够在 VLAN 接口上设置更大的 MTU。同样的原则也适用于绑定接口。只有当所有物理从属接口都设置了正确的 L2MTU 时,您才能增大 VLAN、MPLS、VPLS、Bonding 及其他接口上的 MTU。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 无法更改 MTU。

解决方案

在更改主接口上的 MTU 之前,先增大从属接口上的 L2MTU。

/interface/ethernet
set ether1,ether2 l2mtu=9018
/interface/vlan
set VLAN99 mtu=9000

MTU 不一致


请考虑以下场景:您的网络中有多台设备。它们大多用作网络中的交换机/网桥,并且有一些端点应该接收和处理流量。为减少网络中的开销,您决定增大 MTU 大小,因此在两个端点上设置了更大的 MTU 大小,但您开始注意到一些数据包被丢弃。

MTU Issues

配置

在此例中,两个端点可以是任何类型的设备,我们假设它们都是应传输大量数据的 Linux 服务器。在这种情况下,您可能已在 ServerA 和 ServerB 上将接口 MTU 设置为 9000,并在 Switch 上设置了类似以下内容:

/interface/bridge
add name=bridge1
/interface/bridge/port
add interface=ether1 bridge=bridge1
add interface=ether2 bridge=bridge1

问题

这是一个非常简单的问题,但在较大的网络中可能难以检测。例如,ping 可能正常工作,因为通用 ping 数据包长度为 70 字节(14 字节以太网报头、20 字节 IPv4 报头、8 字节 ICMP 报头、28 字节 ICMP 负载),但数据传输可能无法正常工作。某些数据包可能无法转发的原因是,运行 RouterOS 的 MikroTik 设备默认将 MTU 设置为 1500,L2MTU 设置为约 1580 字节(取决于设备),但以太网接口会静默丢弃任何不符合 L2MTU 大小的内容。请注意,L2MTU 参数与 x86 或 CHR 设备无关。对于只应转发数据包的设备,无需增大 MTU 大小;只需增大 L2MTU 大小即可。RouterOS 不允许您将 MTU 大小增大到大于 L2MTU 大小。如果您需要接口接收数据包,并且设备需要处理该数据包而不仅仅是转发它(例如在路由的情况下),则需要同时增大 L2MTU 和 MTU 大小,但如果您仅使用 IP 流量(支持数据包分片)且不在意数据包被分片,则可以将接口上的 MTU 大小保留为默认值。您可以使用 ping 工具来确保所有设备都能转发巨型帧:

/ping 192.168.88.1 size=9000 do-not-fragment

请记住,在发送和接收 ping 数据包的设备上,L2MTU 和 MTU 大小需要大于或等于 ping 数据包大小,因为 ping(ICMP)是通过第 3 层从接口发出的 IP 流量。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 网页无法加载,但 ping 正常工作。
  • 隧道丢弃流量。
  • 特定协议损坏。
  • 大量数据包丢失。

解决方案

增大 Switch 上的 L2MTU 大小:

/interface/ethernet
set ether1,ether2 l2mtu=9000

如果您的流量是封装的(VLAN、VPN、MPLS、VPLS 或其他),那么您可能需要考虑设置更大的 L2MTU 大小。在此场景中,由于上述原因,无需增大 MTU 大小。

警告

完整帧 MTU 与 L2MTU 不同。L2MTU 大小不包含以太网报头(14 字节)和 CRC 校验和(FCS)字段。FCS 字段由以太网驱动程序剥离,RouterOS 永远不会向任何数据包显示额外的 4 字节。例如,如果您将 MTU 和 L2MTU 设置为 9000,那么完整帧 MTU 为 9014 字节。使用 "/tool/sniffer/quick" 命令嗅探数据包时也可以观察到这一点。

网桥与保留 MAC 地址


请考虑以下场景:您想将两个网段透明地桥接在一起,无论是 EoIP 等隧道接口、无线接口、以太网接口,还是任何其他可以添加到网桥的接口类型。这种设置允许您将两台设备无缝连接在一起,就像它们之间只有一根物理网线一样。这有时被称为从 DeviceA 到 DeviceB 的透明网桥。

配置

对于 DeviceA 和 DeviceB 两台设备,应该有一个非常相似的配置。

/interface/bridge
add name=bridge1 protocol-mode=rstp
/interface/bridge/port
add interface=ether1 bridge=bridge1
add interface=eoip1 bridge=bridge1

问题

两台设备能够相互通信,但某些协议无法正常工作。原因是,一旦您使用任何 STP 变体(STP、RSTP、MSTP),您就会使网桥符合 IEEE 802.1D 和 IEEE 802.1Q。这些标准建议发往 01:80:C2:00:00:0X 的数据包不应被转发。在网桥中只添加了 2 个端口的情况下,不应使用 (R/M)STP,因为 2 个接口不可能产生环路,如果确实产生了环路,原因在别处,应在不同的网桥上修复。由于透明网桥设置中不需要 (R/M)STP,因此可以禁用它。一旦禁用 (R/M)STP,RouterOS 网桥就不再符合 IEEE 802.1D 和 IEEE 802.1Q,因此将转发发往 01:80:C2:00:00:0X 的数据包。

症状

以下是可能由这种错误配置导致的一系列症状:

  • LLDP 邻居不显示。
  • 802.1x 认证(dot1x)无法正常工作。
  • LACP 接口无法传递流量。

解决方案

可以部分禁用对 IEEE 802.1D 和 IEEE 802.1Q 的符合性;这可以通过更改网桥协议模式来实现。

/interface/bridge
set bridge1 protocol-mode=none

危险

IEEE 802.1x 标准用于交换机和客户端之间直接连接。如果可以在交换机和客户端之间连接设备,那么这会造成安全威胁。因此,不建议禁用对 IEEE 802.1D 和 IEEE 802.1Q 的符合性,而应设计适当的网络拓扑。

无线链路之间的绑定


请考虑以下场景:您设置了多条无线链路,为实现最大吞吐量并同时实现冗余,您决定将以太网接口放入一个绑定中,并根据正在转发的流量选择了某种绑定模式。此场景可应用于在并非直接相互连接的链路之间创建绑定接口的任何情况。

LACP over WLAN

配置

以下配置与 R1 和 R2 相关:

/interface/bonding
add mode=802.3ad name=bond1 slaves=ether1,ether2 transmit-hash-policy=layer-2-and-3
/ip/address
add address=192.168.1.X/24 interface=bond1

以下配置与 AP1、AP2、ST1 和 ST2 相关,其中 X 对应每台设备的 IP 地址。

/interface/bridge
add name=bridge1 protocol-mode=none
/interface/bridge/port
add interface=ether1 bridge=bridge1
add interface=wlan1 bridge=bridge1
/ip/address
add address=192.168.1.X/24 interface=bridge1

问题

虽然流量在 R1 和 R2 之间正确转发,负载均衡、链路故障切换也正常工作,但 R1 和 R2 之间的设备并不总是可访问,或者其中一些设备完全无法访问(在大多数情况下 AP2 和 ST2 无法访问)。检查问题后,您可能会注意到数据包并不总是通过所需的绑定从属接口转发,结果您尝试访问的设备永远收不到这些数据包。这是网络设计和绑定协议的限制。一旦需要通过绑定接口发送数据包(在此例中,您可能尝试向 AP2 或 ST2 发送 ICMP 数据包),绑定接口将根据所选的绑定模式和 transmit-hash-policy 创建哈希,并选择一个接口来发送数据包,而不考虑目标是否只能通过某个特定接口到达。有些设备会变得可访问,因为生成的哈希与该设备所在的接口匹配,但它也可能不会选择所需的接口,这将导致设备无法访问。只有广播绑定模式没有这种协议限制,但这种绑定模式的用例非常有限。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 连接性受限
  • 链路不稳定(在 balance-rr 的情况下)

解决方案

绑定接口不应使用间接链路连接,但仍然可以创建变通方法。此变通方法背后的思路是找到一种方法绕过使用绑定接口发送数据包。有多种方法可以强制数据包不通过绑定接口发送,但本质上解决方案是在物理接口之上创建新接口,并将这些新创建的接口(而不是物理接口)添加到一个绑定中。实现这一点的一种方法是在每个物理接口上创建 EoIP 隧道,但这会带来巨大的开销并降低整体吞吐量。您应该改为在每个物理接口之上创建一个 VLAN 接口。这带来的开销要小得多,并且不会明显影响整体性能。以下是 R1 和 R2 应如何重新配置的示例:

/interface/vlan
add interface=ether1 name=VLAN_ether1 vlan-id=999
add interface=ether2 name=VLAN_ether2 vlan-id=999
/interface/bonding
add mode=balance-xor name=bond1 slaves=VLAN_ether1,VLAN_ether2 transmit-hash-policy=layer-2-and-3
/ip/address
add address=192.168.1.X/24 interface=bond1
add address=192.168.11.X/24 interface=ether1
add address=192.168.22.X/24 interface=ether2

AP1 和 ST1 只需要将 IP 地址更新为正确的子网:

/ip/address
add address=192.168.11.X/24 interface=bridge1

必须对 AP2 和 ST2 应用相同的更改(确保使用正确的子网):

/ip/address
add address=192.168.22.X/24 interface=bridge1

通过这种方法,您创建的开销最小,所需的配置更改也最少。

警告

LACP(802.3ad)不适用于设备的绑定从属接口并非直接连接的设置,在这种情况下,如果两个路由器之间存在无线链路,不建议使用 LACP。LACP 要求两个绑定从属接口处于相同的链路速度,无线链路可以随时更改其速率,这会降低整体性能和稳定性。应改用其他绑定模式。

带宽测试


请考虑以下场景:您在两台设备之间建立了一条链路。这可以是任何链路:以太网网线、无线链路、隧道或任何其他连接。您决定要测试链路的带宽,但为了方便,您决定用运行该链路的相同设备开始测试链路。

Bad Bandwidth Setup

问题

一旦您启动 带宽测试 或 流量生成器,您就会注意到吞吐量远小于预期。对于非常强大的路由器,它们应该能够转发每秒数千兆比特(Gbps),但您注意到只有几 Gbps 被转发。发生这种情况的原因在于您使用的测试方法。您绝不应该在路由器上测试吞吐量时使用同一台路由器生成流量,因为这会增加 CPU 的额外负载,从而降低总吞吐量。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 低吞吐量。
  • 高 CPU 占用。

解决方案

使用正确的测试方法。不要使用 Bandwidth-test 测试大容量链路,也不要在您正在测试的同一台设备上运行任何生成流量的工具。正确地设计网络,以便您可以在两端连接生成和接收流量的设备。如果您熟悉 Iperf,那么这个概念应该很清楚。请记住,在现实世界中,路由器或交换机不会生成大量流量(至少不应该,否则可能表明存在安全问题),服务器/客户端生成流量,而路由器/交换机转发流量(并在适当的情况下对流量进行一些处理)。

Good Bandwidth Setup

网桥 split-horizon 的使用


请考虑以下场景:您有一个网桥,需要将某些网桥端口彼此隔离。在某些交换机芯片上可以选择使用内置交换机芯片来隔离某些端口,您可以使用网桥防火墙规则防止某些端口向其他端口发送任何流量,您可以使用端口隔离在 PVLAN 类型的设置中隔离端口,但还有一种基于软件的解决方案,即使用网桥 split-horizon(它会在所有交换机芯片上禁用硬件卸载)。

配置

/interface/bridge
add name=bridge1
/interface/bridge/port
add bridge=bridge1 horizon=1 hw=no interface=ether1
add bridge=bridge1 horizon=2 hw=no interface=ether2
add bridge=bridge1 horizon=3 hw=no interface=ether3
add bridge=bridge1 horizon=4 hw=no interface=ether4

问题

在每个端口上设置网桥 split-horizon 后,您开始注意到端口仍然能够相互发送数据。原因是网桥 split-horizon 的误用。网桥端口只是无法与处于同一 horizon 的端口通信,例如,horizon=1 无法与 horizon=1 通信,但可以与 horizon=2、horizon=3 等通信。

症状

以下是可能由这种错误配置导致的一系列症状:

  • 流量在不同的网桥 split-horizon 上被转发。

解决方案

为网桥 split-horizon 设置适当的值。如果您想将端口彼此隔离(PPPoE 设置的常见场景),并且每个端口只能与网桥本身通信,那么所有端口必须处于同一个网桥 split-horizon。

/interface/bridge/port
set [f] horizon=1

警告

将所有网桥端口设置在同一个网桥 split-horizon 中将导致流量只能到达网桥接口本身,然后数据包只能被路由。当您希望其他设备过滤掉某些流量时,这很有用。使用网桥过滤规则可以实现类似的行为。

不支持的 SFP 模块


请考虑以下场景:您决定使用光纤电缆通过 SFP 或 SFP+ 光模块将设备连接在一起,但为了方便,您决定使用手头可用的 SFP 光模块。

问题

一旦您配置设备在使用这些 SFP 光模块的端口上建立连接,您可能会注意到链路要么工作正常,要么出现随机连接问题。有许多厂商生产 SFP 光模块,但并非所有厂商都严格遵循 SFP MSA、SFF 和 IEEE 802.3 标准,这可能导致不可预测的兼容性问题,在 MikroTik 设备中使用不知名或不支持的 SFP 光模块时,这是一个非常常见的问题。

症状

以下是可能由这种错误配置导致的一系列症状:

  • SFP 接口无法建立链路。
  • 随机丢包。
  • 链路不稳定(抖动)。
  • 重启后 SFP 模块不工作。
  • 断电重启后 SFP 模块不工作。
  • SFP 模块仅在一侧工作。

解决方案

您应仅使用受支持的 SFP 模块。如果您打算使用 MikroTik 制造的 SFP 模块,请始终检查 SFP 兼容性表。还有其他 SFP 模块也能与 MikroTik 设备配合使用。请查看受支持的外设表,以找到已确认可与 MikroTik 设备配合使用的其他 SFP 模块。某些不支持的模块在某些速度和自动协商下可能无法正常工作。您可能想尝试禁用它并手动设置链路速度。