Bridge VLAN Table

本页介绍 MikroTik RouterOS 的网桥 VLAN 表功能,说明如何使用已标记/未标记端口、PVID 以及入站/出站规则在网桥中配置 VLAN 过滤。其中包含干道和接入端口的设置示例,强调通过管理访问控制和 EtherType 过滤来实现安全性。

网桥 VLAN 表


可以使用网桥来过滤网络中的 VLAN。为此,您应使用网桥 VLAN 过滤功能。应使用此功能来替代许多已知的 VLAN 错误配置,这些错误配置很可能导致性能问题或连接问题。您可以在具有物理接口的网桥中的 VLAN 一节中了解一种最常见的错误配置。网桥 VLAN 过滤功能最重要的部分是网桥 VLAN 表,它指定每个端口允许哪些 VLAN,但如果您尝试进行更高级的设置,配置它可能会变得相当复杂;对于通用设置,您应该能够使用干道和接入端口示例来配置设备,但本指南的目的是提供深入的解释,并指出使用网桥 VLAN 过滤时的一些行为特征。

背景


在深入解释网桥 VLAN 过滤之前,您应该了解网桥 VLAN 过滤中涉及的几个基本概念。

  • 已标记/未标记(Tagged/Untagged) - 在 /interface/bridge/vlan 菜单下,您可以指定一个包含已标记和未标记端口的条目。通常,已标记端口应该是您的干道端口,未标记端口应该是您的接入端口。通过指定已标记端口,网桥将始终为通过此端口发送的数据包(出站)设置 VLAN 标签。通过指定未标记端口,网桥将始终从出站数据包中移除 VLAN 标签。

  • VLAN-ids - 在 /interface/bridge/vlan 菜单下,您可以指定一个条目,其中某些 VLAN 在特定端口上被允许。VLAN ID 在出站端口上检查。如果数据包包含的 VLAN ID 在出站端口的网桥 VLAN 表中不存在,则该数据包在发送出去之前被丢弃。

  • PVID - 端口 VLAN ID 用于接入端口,以使用特定 VLAN ID 标记所有入站流量。对于每个使用的 PVID,都会在网桥 VLAN 表中添加一个动态条目,并且该端口会自动添加为未标记端口。

  • 入站过滤(Ingress filtering) - 默认情况下,网桥 VLAN 表中不存在的 VLAN 在发送出去之前(出站)被丢弃,但此属性允许您在数据包被接收时(入站)丢弃它们。

  • 管理访问(Management access) - 网桥本应只是在网桥端口之间转发数据包,对其他设备来说它们之间就好像只有一根线。通过网桥 VLAN 过滤,您可以限制哪些数据包被允许访问配置了网桥的设备。最常见的做法是仅使用非常特定的 VLAN ID 允许访问设备,但还有 other 方式可以授予对设备的访问权限。管理访问是通过网桥端口访问设备时增加另一层安全性的好方法;这种类型的访问有时称为管理端口。对于支持带硬件卸载的 VLAN 过滤的设备,它也与网桥的 CPU 端口相关。

  • CPU 端口 - 每个具有交换机芯片的设备都有一个称为 CPU 端口的特殊用途端口,用于与设备的 CPU 通信。对于支持带硬件卸载的 VLAN 过滤的设备,此端口就是网桥接口本身。此端口主要用于创建管理访问,但也可用于其他目的,例如在 VLAN 之间路由流量、标记数据包和应用队列。

  • frame-type - 您可以根据数据包是否带有 VLAN 标签来过滤数据包;这对于为网桥端口增加额外的安全层很有用。

  • EtherType - 默认情况下,VLAN 感知网桥将通过检查 C-TAG(0x8100)来过滤 VLAN;所有其他 VLAN 标签类型都被视为未标记数据包(不带 VLAN 标签)。所选的 EtherType 将用于 VLAN 过滤和 VLAN 标记/去标记。

  • VLAN 隧道(VLAN Tunnelling) - 如果数据包的 EtherType 与为网桥配置的 EtherType 不匹配,则入站数据包被视为未标记数据包;此行为使得可以将 VLAN 封装到另一个不同的 VLAN 中。这也使得可以将特定流量通过您网络中的不同设备转移。

  • 标签堆叠(Tag stacking) - 如果数据包带有与 EtherType 匹配的 VLAN 标签,则该数据包被视为已标记数据包,但您可以强制添加另一个 VLAN 标签,无论数据包的内容如何。通过在网桥端口上设置 tag-stacking=yes,您将为所有入站数据包在任何其他标签之上添加一个带有 PVID 值的新 VLAN 标签。

干道/接入端口设置


下面是一个非常典型的设置图,其中包含一个干道端口和多个接入端口:

Trunk and Access Setup

这种设置非常常见,因为它使得可以在一台交换机甚至一台路由器上就将网络划分为多个网段。这种需求对于希望分隔多个部门的公司来说非常普遍。使用 VLAN,您可以使用不同的 DHCP 服务器,它们可以根据 VLAN ID 从不同的子网分配 IP 地址,这使得创建防火墙规则和 QoS 容易得多。

在这样的设置中,您会将一些通用设备(如台式 PC)连接到 ether2 和 ether3。这些可被视为工作站,它们通常只使用未标记流量(可以为从通用工作站发送的所有流量强制添加 VLAN 标签,尽管这并不常见)。要将某些工作站与其他工作站隔离,您必须为进入 ether2 或 ether3 的所有数据包添加 VLAN 标签,但要决定数据包应获得哪个 VLAN ID,您需要使用一个称为**基于端口的 VLAN(Port-based VLANs)**的概念。在此概念中,数据包根据设备所连接的网桥端口获得带有 VLAN ID 的 VLAN 标签。例如,在此设置中,ether2 上的设备将获得带有 VLAN20 的 VLAN 标签,ether3 上的设备将获得带有 VLAN30 的 VLAN 标签。只要您有足够的网桥端口,这个概念就非常可扩展。这应该让您理解,网桥与 ether2/ether3 后面的设备之间的流量是未标记的(因为没有 VLAN 标签,故由此得名)。

当我们确定了未标记端口后,现在可以确定已标记端口。已标记端口将是干道端口(承载多个 VLAN 的端口),通常此端口连接到路由器或其他交换机/网桥。您也可以有多个干道端口。已标记端口始终承载带有 VLAN 标签的数据包(故由此得名),并且您必须始终为希望此端口转发的每个 VLAN ID 指定已标记端口。一个端口可能对某个 VLAN ID 是已标记端口,而对另一个 VLAN ID 是未标记端口,但这适用于不同类型的设置(混合端口设置)。

必须为 PVID 属性添加一个特别说明。此属性应在接入端口上使用,但也可以用于干道端口(在混合端口设置中)。通过使用 PVID 属性,您将为在该特定网桥端口上接收到的所有未标记数据包添加一个带有 PVID 中指定的 VLAN ID 的新 VLAN 标签。PVID 对已标记数据包没有任何影响,这意味着,例如,如果在 PVID=20 的 ether2 上收到带有 VLAN40 VLAN 标签的数据包,则 VLAN 标签不会改变,转发将取决于网桥 VLAN 表中的条目。

要配置干道/接入端口设置,您需要先创建网桥:

/interface/bridge
add name=bridge1

危险

暂时不要启用 VLAN 过滤,因为由于缺少管理访问(管理访问在最后配置),您可能会被锁定在设备之外。 添加网桥端口并为每个接入端口指定 PVID:

/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2 pvid=20
add bridge=bridge1 interface=ether3 pvid=30

警告

在启用 VLAN 过滤之前,PVID 没有任何效果。 在网桥 VLAN 表中添加适当的条目:

/interface/bridge/vlan
add bridge=bridge1 tagged=ether1 untagged=ether2 vlan-ids=20
add bridge=bridge1 tagged=ether1 untagged=ether3 vlan-ids=30

您可能认为可以用一个条目来简化这些条目,类似于这样:

/interface/bridge/vlan
add bridge=bridge1 tagged=ether1 untagged=ether2,ether3 vlan-ids=20,30

请不要在接入端口上使用多个 VLAN ID。这会无意中在两个接入端口上都允许 VLAN20 和 VLAN30。在上面的示例中,ether3 本应为所有入站数据包设置使用 VLAN30 的 VLAN 标签(因为 PVID=30),但这并不限制通过此端口发送 VLAN 时该端口上允许的 VLAN。网桥 VLAN 表负责决定是否允许某个 VLAN 通过特定端口发送。上面的条目指定 VLAN20 和 VLAN30 都允许通过 ether2 和 ether3 发送,此外该条目还指定数据包应在不带 VLAN 标签的情况下发送(数据包作为未标记数据包发送)。结果是,您可能会造成数据包从 VLAN 泄漏到甚至不应接收此类流量的端口,请参见下图。

Trunk and Access Setup Bad

配置错误的 VLAN 表允许 VLAN20 通过 ether3 发送;它还将允许 VLAN30 通过 ether2

危险

对于接入端口,不要在网桥 VLAN 表条目中指定多个 VLAN ID;您应该仅为干道端口指定多个 VLAN ID。 不一定需要将网桥端口添加为未标记端口,因为每个网桥端口都会以 PVID 属性中指定的 VLAN ID 动态添加为未标记端口。这是由于一项出于便利性和性能原因自动在网桥 VLAN 表中添加适当条目的功能。此功能确实有一些您必须注意的注意事项。所有具有相同 PVID 的端口都将作为未标记端口添加到相应 VLAN ID 的单个条目中,但请注意网桥接口也有一个 VLAN ID。

出于测试目的,我们将启用 VLAN 过滤,但请注意,这可能会使您失去对设备的访问,因为它尚未配置管理访问(我们稍后将配置它)。始终建议在使用串行控制台时配置 VLAN 过滤,不过您也可以通过未添加到网桥的端口配置设备。请确保使用串行控制台或通过不同的端口(不在网桥中)连接,然后启用 VLAN 过滤:

/interface/bridge/set bridge1 vlan-filtering=yes

警告

您可能不会在启用 VLAN 过滤后立即失去对设备的访问,但可能会断开连接,因为网桥必须重置自身才能让 VLAN 过滤生效,这会迫使您重新连接(这主要与使用 MAC-telnet 时相关)。您有可能能够使用未标记流量访问设备。此场景描述如下。 如果您现在启用了 VLAN 过滤并打印当前的 VLAN 表,您会看到这样的表:

[admin@MikroTik] > /interface/bridge/vlan/print
Flags: X - disabled, D - dynamic 
 #   BRIDGE                     VLAN-IDS  CURRENT-TAGGED       CURRENT-UNTAGGED
 0   bridge1                    20        ether1               ether2
 1   bridge1                    30        ether1               ether3
 2 D bridge1                    1                              bridge1
                                                               ether1

为 VLAN1 添加了一个动态条目,因为默认情况下所有网桥端口(包括我们的干道端口 ether1)都设置了 PVID=1,但您还应注意到 bridge1 接口(CPU 端口)也会被动态添加。您应该意识到 bridge1 也是一个网桥端口,因此可能会被动态添加到网桥 VLAN 表中。由于此功能,您有可能无意中允许访问设备。例如,如果您遵循了本指南,并为干道端口(ether1)保留了 PVID=1,而没有同时更改 CPU 端口(bridge1)的 PVID,则允许通过 ether1 使用未标记流量访问设备。这在您打印网桥 VLAN 表时也可见。此场景如下图所示:

Trunk and Access Setup Unintentional Management

无意中允许通过干道端口使用未标记流量进行管理访问

危险

如果您没有无意中允许某些 VLAN 或未标记流量进入特定端口(尤其是 CPU 端口(网桥)),请始终检查网桥 VLAN 表。 有一种简单的方法可以防止网桥(CPU 端口)被添加为未标记端口。您可以简单地将干道端口上的 PVID 设置为与网桥的 PVID 不同(或更改网桥的 PVID),但还有另一个选项,它更直观且推荐使用。由于您期望干道端口只应接收已标记流量(在此示例中,它应只接收 VLAN20/VLAN30),而不接收未标记流量,您可以结合 frame-type 使用 ingress-filtering 来过滤掉不需要的数据包,但要完全理解入站过滤的行为,我们必须先了解管理访问的细节。

管理访问用于创建一种通过启用了 VLAN 过滤的网桥访问设备的方式。您可以简单地允许未标记访问,这样做相当简单。假设您希望 ether3 后面的工作站能够访问设备。我们之前假设该工作站是一台通用计算机,不会使用已标记数据包,因此只会发送未标记数据包。这意味着我们应该将 CPU 端口(bridge1)作为未标记接口添加到网桥 VLAN 表中,要做到这一点,只需为 bridge1 和 ether3 端口使用相同的 PVID 值,并将两个端口都设置为该 VLAN ID 的未标记成员。在这种情况下,您将从 PVID=30 的 ether3 连接,因此您相应更改配置:

/interface/bridge/set [find name=bridge1] pvid=30
/interface/bridge/vlan/set [find vlan-ids=30] untagged=bridge1,ether3

警告

您可以使用以相同 PVID 值动态添加未标记端口的功能,或者您可以简单地更改 PVID 使 ether3 和 bridge1 匹配。 允许使用未标记流量访问设备不被认为是良好的安全实践。更好的方法是使用一个非常特定的 VLAN(有时称为管理 VLAN)允许访问设备。在我们的例子中,这将是 VLAN99。这增加了一层显著的安全性,因为攻击者必须猜测用于管理目的的 VLAN ID,然后猜测登录凭据。除此之外,您甚至可以通过仅允许特定 IP 地址访问设备来添加另一层安全性。本指南的目的是提供深入的解释。出于这个原因,我们为设置增加了一定程度的复杂性,以了解您必须考虑的一些可能的注意事项。我们将允许从接入端口使用已标记流量进行访问(如下图所示)。要允许从 ether3 使用 VLAN99 访问设备,我们必须在网桥 VLAN 表中添加适当的条目。此外,连接到 ether3 的网络设备必须支持 VLAN 标记。

/interface/bridge/vlan
add bridge=bridge1 tagged=bridge1,ether3 vlan-ids=99

Trunk and Access Setup Management Access

通过接入端口使用已标记流量进行管理访问(这使其成为混合端口)

警告

如果 ether1 和 bridge1 的 PVID 匹配(默认情况下,它确实与 1 匹配),则由于将未标记端口动态添加到网桥 VLAN 表的功能,允许从 ether1 使用未标记流量访问设备。 但您可能会注意到此时使用 VLAN99 访问不起作用。这是因为您需要一个监听已标记流量的 VLAN 接口。您可以简单地为相应的 VLAN ID 创建此接口,并且还可以为该接口设置 IP 地址:

/interface/vlan
add interface=bridge1 name=VLAN99 vlan-id=99
/ip/address
add address=192.168.99.2/24 interface=VLAN99

警告

我们的接入端口(ether3)此时同时期望已标记和未标记流量;这样的端口称为混合端口(hybrid port)。 此时,我们可以从使用 ingress-filtering 和 frame-type 中受益。首先,我们将关注 frame-type,它限制允许的数据包类型(已标记、未标记、两者),但要使 frame-type 正常工作,必须启用 ingress-filtering,否则它不会有任何效果。在我们的示例中,我们希望允许从 ether3 使用已标记流量(VLAN99)访问,同时允许通用工作站访问网络,我们可以得出结论,此端口需要允许已标记和未标记数据包,但 ether1 和 ether2 应只接收特定类型的数据包,因此我们可以增强网络的安全性。由于 ether1 是我们的干道端口,它只应承载已标记数据包,而 ether2 是我们的接入端口,因此它不应承载任何已标记数据包,基于这些结论,我们可以丢弃无效数据包:

/interface/bridge/port
set [find where interface=ether1] ingress-filtering=yes frame-types=admit-only-vlan-tagged
set [find where interface=ether2] ingress-filtering=yes frame-types=admit-only-untagged-and-priority-tagged

假设您忘记在 ether1 上启用 ingress-filtering 并更改 frame-type 属性,这会无意中允许通过 ether1 使用未标记流量访问设备,因为 bridge1 和 ether1 的 PVID 匹配,但您期望只有已标记流量才能访问设备。可以丢弃所有发往 CPU 端口的未标记数据包:

/interface/bridge
set bridge1 frame-types=admit-only-vlan-tagged ingress-filtering=yes

这不仅丢弃未标记数据包,还禁用了将未标记端口动态添加到网桥 VLAN 表的功能。如果您打印当前的网桥 VLAN 表,您会注意到 bridge1 不会作为未标记端口被动态添加:

[admin@MikroTik] > /interface/bridge/vlan/print 
Flags: X - disabled, D - dynamic 
 #   BRIDGE       VLAN-IDS  CURRENT-TAGGED        CURRENT-UNTAGGED
 0   bridge1      20        ether1
 1   bridge1      30        ether1                ether3
 2 D bridge1      1                               ether1
 3   bridge1      99        bridge1
                            ether3  

警告

当在端口上使用 frame-type=admit-only-vlan-tagged 时,该端口不会作为 PVID 的未标记端口被动态添加。 虽然 frame-type 可用于丢弃某种类型的数据包,但 ingress-filtering 可用于在数据包发送出去之前过滤掉它们。要完全理解入站过滤的必要性,请考虑以下场景:ether3 和 bridge1 上允许 VLAN99,但您仍然可以从 ether1 向 ether3 发送 VLAN99 流量。这是因为网桥 VLAN 表仅在出站端口上检查是否允许某个端口承载某个 VLAN。在我们的例子中,ether3 被允许承载 VLAN99,因此它被转发。要防止这种情况,您必须使用 ingress-filtering。使用入站过滤,入站数据包也会被检查。在我们的例子中,网桥 VLAN 表不包含 ether1 上允许 VLAN99 的条目,因此该数据包将立即被丢弃。当然,在我们的场景中,如果没有入站过滤,连接无法建立,因为 VLAN99 只能从 ether1 转发到 ether3,而不能从 ether3 转发到 ether1,尽管如此,在这种错误配置中仍然可以使用某些可能的攻击(例如 ARP 投毒)。数据包丢弃行为如下图所示:

Trunk and Access Setup Ingress

带和不带入站过滤的干道/接入端口设置。入站过滤可以防止不需要的流量被转发。请注意,网桥 VLAN 表中不允许 ether1 承载 VLAN99。

危险

请始终尽可能使用 ingress-filtering。它增加了一层显著的安全性。 入站过滤也可以在 CPU 端口(网桥)上使用。这可用于防止某些可能的攻击向量,并限制可访问 CPU 的允许 VLAN。最好在入站端口而不是出站端口丢弃数据包。这减少了 CPU 负载,当您使用带网桥 VLAN 过滤的硬件卸载时,这一点相当关键。

警告

ingress-filtering 属性仅影响入站流量,但 frame-type 同时影响出站和入站流量。 即使您可以限制端口上允许的 VLAN 和数据包类型,允许通过接入端口访问设备也从来不是一种良好的安全实践,因为攻击者可以嗅探数据包并提取管理 VLAN 的 ID。您应该仅允许从干道端口(ether1)访问设备,因为干道端口通常具有更好的物理安全性。您应该移除先前的条目,并允许通过连接到路由器的端口访问设备(如下图所示):

/interface/bridge/vlan
add bridge=bridge1 tagged=bridge1,ether1 vlan-ids=99

Basic VLAN Switching

VLAN 隧道设置


在某些情况下,您可能希望通过某些交换机转发已标记的流量。这对于骨干基础设施来说是一种非常常见的设置,因为它提供了将来自例如边缘路由器的流量封装并无缝转发通过骨干网络到另一个边缘路由器的可能性。下面您可以找到 VLAN 隧道拓扑的示例:

Provider Bridge

提供商网桥拓扑

SVID 代表 Service VID,表示标签类型以及 VID。

警告

要完全理解如何正确配置 VLAN 隧道,您应先阅读干道/接入端口设置一节,然后再继续。 有两种可能的方法来实现这一点,一种是标准化的 IEEE 802.1ad 方法,另一种是使用标签堆叠(Tag stacking)。我们将首先回顾标准化的方法,因为相同的原理适用于两种方法,只需更改几个参数即可使用另一种方法。VLAN 隧道的工作方式是网桥检查外层 VLAN 标签是否使用与 ether-type 中指定的相同的 VLAN 标签。如果 VLAN 标签匹配,则数据包被视为已标记数据包,否则被视为未标记数据包。

警告

网桥仅检查外层标签(最靠近 MAC 地址的标签);在任何网桥配置中都会忽略任何其他标签。网桥不感知数据包的内容;即使可能存在另一个 VLAN 标签,也只检查第一个 VLAN 标签。 ether-type 属性允许您为 VLAN 标签选择以下 EtherType:

  • 0x88a8 - IEEE 802.1ad,Service Tag。
  • 0x8100 - IEEE 802.1Q,Customer VLAN(常规 VLAN 标签)。
  • 0x9100 - 非官方标签类型(很少使用)。

要正确配置网桥 VLAN 过滤,您必须理解网桥如何区分已标记和未标记数据包。如前所述,网桥将检查 EtherType 是否与数据包中的外层 VLAN 标签匹配。例如,考虑以下数据包:

FFFFFFFFFFFF 6C3B6B7C413E 8100 6063 9999
----------------------------------------
DST-MAC = FFFFFFFFFFFF
SRC-MAC = 6C3B6B7C413E
Outer EtherType = 8100 (IEEE 802.1Q VLAN tag)
VLAN priority = 3
VLAN ID = 99 (HEX = 63)
Inner EtherType = 9999

假设我们设置了 ether-type=0x88a8,在这种情况下,上面的数据包将被视为未标记,因为网桥正在寻找不同的 VLAN 标签。现在让我们考虑以下数据包:

FFFFFFFFFFFF 6C3B6B7C413E 88A8 6063 8100 5062 9999
----------------------------------------
DST-MAC = FFFFFFFFFFFF
SRC-MAC = 6C3B6B7C413E
Outer EtherType = 88A8 (IEEE 802.1ad VLAN tag)
VLAN priority = 3
VLAN ID = 99 (HEX = 63)
Inner EtherType 1 = 8100 (IEEE 802.1Q VLAN tag)
VLAN priority = 2
VLAN ID = 98 (HEX = 62)
Inner EtherType 2 = 9999

这次假设我们设置了 ether-type=0x8100。在这种情况下,上面的数据包也被视为未标记,因为外层标签使用的是 IEEE 802.1ad VLAN 标签。相同的原理适用于其他与 VLAN 相关的功能,例如,PVID 属性将在接入端口上添加新的 VLAN 标签,并且该 VLAN 标签将使用 ether-type 中指定的 EtherType。

SW1 和 SW2 都使用相同的配置:

/interface/bridge
add name=bridge1 vlan-filtering=yes ether-type=0x88a8
/interface/bridge/port
add interface=ether1 bridge=bridge1 pvid=200
add interface=ether2 bridge=bridge1 pvid=300
add interface=ether3 bridge=bridge1
/interface/bridge/vlan
add bridge=bridge1 tagged=ether3 untagged=ether1 vlan-ids=200
add bridge=bridge1 tagged=ether3 untagged=ether2 vlan-ids=300

在此示例中,我们假设所有路由器都在传递使用常规/客户 VLAN 标签的流量。根据上述原理,交换机上的此类流量将被视为未标记流量。交换机将使用 Service VLAN 标签(外层 802.1ad 标签)封装此流量,SW1 和 SW2 之间的流量将被视为已标记。在流量到达目的地之前,交换机将解封装外层标签并转发原始的 802.1Q 已标记帧。请参见下面的数据包示例:

Service VLAN 802.1adA packet example before and after 802.1ad VLAN encapsulation

警告

适用于使用 IEEE 802.1Q 的常规干道/接入端口设置的所有原理也适用于 VLAN 隧道设置。请确保使用网桥 VLAN 表和入站过滤正确限制 VLAN 和数据包类型。 如果您想创建从例如 ether3 到设备的管理访问,并希望使用 VLAN99,那么您将使用这样的命令:

/interface/bridge/vlan
add bridge=bridge1 tagged=bridge1,ether3 vlan-ids=99
/interface/vlan
add interface=bridge1 name=VLAN99 use-service-tag=yes vlan-id=99
/ip/address
add address=192.168.99.2/24 interface=VLAN99

您可能会注意到,唯一的区别是 VLAN 接口使用 use-service-tag=yes;这将 VLAN 接口设置为监听 IEEE 802.1ad VLAN 标签。这将要求您使用 IEEE 802.1ad VLAN 标签通过管理 VLAN 访问设备 - 在启用网桥 VLAN 过滤时,您将无法使用常规 VLAN 标签连接到设备。ether-type 是全局设置的,将影响所有网桥 VLAN 过滤功能。

危险

具有 Marvell-98DX3257 交换机芯片的设备(例如 CRS354 系列)不支持在其他 VLAN 类型(0x88a8 和 0x9100)的 1Gbps 以太网接口上进行 VLAN 过滤。

标签堆叠

在 VLAN 隧道设置中,我们添加了一个与 VLAN 标签不同的新 VLAN 标签,但无论数据包内容如何都可以添加新的 VLAN 标签。与常规 VLAN 隧道设置的区别在于,网桥不检查数据包是已标记还是未标记,它假设在特定端口上接收到的所有数据包都是未标记数据包,并将添加新的 VLAN 标签,无论是否存在 VLAN 标签。这称为标签堆叠(Tag Stacking),因为它在先前标签的顶部"堆叠" VLAN 标签,无论 VLAN 标签类型如何。对于不支持 IEEE 802.1ad 标准但仍希望将 VLAN 流量封装到新 VLAN 中的网络来说,这是一种非常常见的设置。

将要添加的 VLAN 标签取决于 ether-type 和 PVID。例如,如果端口上具有 ether-type=0x8100 和 PVID=200,则网桥将在任何其他标签(如果存在)之上添加一个新的 IEEE 802.1Q VLAN 标签。相同的 VLAN 过滤原理仍然适用。您必须确定哪些端口将成为您的干道端口并将其标记为已标记端口,确定您的接入端口并将其添加为未标记端口。

为了解释标签堆叠如何与 VLAN 标记和去标记一起工作,让我们使用与之前相同的网络拓扑:

Basic VLAN Switching 2

我们想要实现的是,无论 ether2 和 ether3 上接收到什么,都会添加一个新的 VLAN 标签来封装来自这些端口的流量。Tag-stacking 强制添加新的 VLAN 标签,因此我们可以使用此属性来实现我们想要的设置。我们将使用与干道/接入端口设置中相同的配置,但在接入端口上启用 tag-stacking:

/interface/bridge
add name=bridge1 vlan-filtering=yes ether-type=0x8100
/interface/bridge/port
add bridge=bridge1 interface=ether1
add bridge=bridge1 interface=ether2 tag-stacking=yes pvid=20
add bridge=bridge1 interface=ether3 tag-stacking=yes pvid=30
/interface/bridge/vlan
add bridge=bridge1 tagged=ether1 untagged=ether2 vlan-ids=20
add bridge=bridge1 tagged=ether1 untagged=ether3 vlan-ids=30

警告

添加的 VLAN 标签将使用指定的 ether-type。所选的 EtherType 也将用于 VLAN 过滤。仅检查外层标签,但在启用标签堆叠的情况下,标签检查被跳过,并假定无论如何都必须添加新标签。 假设 ether2 和 ether3 后面的设备正在发送已标记的 VLAN40 流量。使用此配置,所有数据包都将被新的 VLAN 标签封装,但您必须确保已将外层标签中的 VLAN ID 添加到网桥 VLAN 表。VLAN40 未添加到网桥 VLAN 表,因为它是内层标签且不被检查;我们只关注外层标签,根据端口不同它要么是 VLAN20 要么是 VLAN30。

与其他设置类似,网桥 VLAN 表将用于确定是否需要移除 VLAN 标签。例如,当 ether1 收到已标记的 VLAN20 数据包时,网桥检查 ether2 是否被允许承载 VLAN20,因此即将通过 ether2 发送它,但它还会检查网桥 VLAN 表是否应移除 VLAN 标签,由于 ether2 被标记为未标记端口,网桥将把这些数据包从 ether1 转发到 ether2 而不带 VLAN20 VLAN 标签。

从接入端口的角度来看,适用与干道/接入端口设置中相同的原理。在 ether2 上接收到的所有数据包都将获得一个新的 VLAN 标签,其 VLAN ID 在 PVID 中指定,在这种情况下,将添加带有 VLAN20 的新 VLAN 标签,此 VLAN 将接受 VLAN 过滤。请参见下面的数据包示例:

Tag Stacking

标签堆叠前后的数据包示例