QinQ 和 VXLAN

QinQIEEE 802.1Q 规范 的一个修订,使您能够将多个 VLAN 标记插入到单个以太网帧中。

服务提供商通常使用 QinQ 和 VXLAN,以便在虚拟化的第 3 层提供商网络上提供不同客户数据中心之间的多租户第 2 层连接。客户 VLAN 对提供商网络是透明的。

Cumulus Linux 支持标准 802.1ad 和支持 VLAN 的网桥,您可以在其中将客户(S-tag)映射到 VNI,并在 VXLAN 数据包内保留内部 VLAN(C-tag)。

Cumulus Linux 还支持一种特殊情况,即使用不支持 VLAN 的网桥,您可以使用 S-tag、C-tag 元组进行转发查找并映射到 VNI。Cumulus Linux 在 VXLAN 封装期间删除 S-tag 和 C-tag;Cumulus Linux 将此配置称为双标记转换。

使用 QinQ 时,您必须禁用 VXLAN 网桥上的 ARP 和 ND 抑制。

采用支持 VLAN 的网桥的 802.1ad

在标准 802.1ad QinQ 模型中,面向客户的接口是 QinQ 接入端口,外部 S-tag 是表示客户的 PVID。Cumulus Linux 将 S-tag 转换为 VXLAN VNI。内部 C-tag 对提供商是透明的。提供商也可能具有连接到同一网桥的 VLAN 中继,从而在同一端口上承载来自不同客户的流量。在这种情况下,S-tag 映射到 VNI。Cumulus Linux 在 VXLAN 封装期间删除 S-tag,并在解封装后添加它。

支持 VLAN 的桥接模式下的配置示例如下所示

您配置两个交换机:一个位于面向客户的服务提供商边缘(上图左侧的交换机),另一个位于具有 VLAN 中继的远程提供商边缘(上图右侧的交换机)。

  • 所有边缘都必须支持 QinQ 和 VXLAN。
  • 不能在同一交换机端口上混合 802.1Q 和 802.1ad 子接口。
  • 传统模式 下配置网桥时,属于同一交换机端口成员的所有 VLAN 必须使用相同的 vlan_protocol
  • 当在 MLAG 对中使用交换机时
    • 为 VLAN 协议 802.1ad 配置 MLAG 对之间的对等链路 (peerlink.4094)。
    • 如果 MLAG 对等方之一丢失所有上行链路,则不能将对等链路用作备份数据路径。
  • 当网桥 VLAN 协议为 802.1ad 且启用 VXLAN 时,所有网桥端口必须是接入端口(MLAG 对等链路除外)或 VLAN 中继。

远程提供商边缘交换机

对于面向远程提供商云的交换机

  • 配置网桥,并将 vlan_protocol 设置为 802.1ad
  • VNI 映射回 S-tag(客户)。
  • 连接到公有云的中继端口是 QinQ 中继,数据包被双重标记,其中 S-tag 用于客户,C-tag 用于服务。

要配置远程提供商交换机

Cumulus Linux 不为此配置提供 NVUE 命令。

编辑 /etc/network/interfaces 文件以添加以下配置

cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto vxlan48
iface vxlan48
    bridge-vlan-vni-map 100=1000 200=3000
    bridge-learning off

auto br_default
iface br_default
    bridge-ports swp3 vxlan48
    bridge-vids 100 200
    bridge-vlan-aware yes
    bridge-pvid 1
    bridge-vlan-protocol 802.1ad
...

运行 ifreload -a 命令以加载新配置

cumulus@switch:~$ ifreload -a

面向客户的边缘交换机

对于面向客户的交换机

  • 配置网桥,并将 vlan_protocol 设置为 802.1ad
  • 客户接口是 QinQ 接入端口,PVID 是 S-tag(客户)并映射到 VNI。
  • 服务 VLAN 标记 (C-tag) 在 VXLAN 封装期间不会更改。

要配置面向客户的交换机

Cumulus Linux 不为此配置提供 NVUE 命令。

编辑 /etc/network/interfaces 文件以添加以下配置

cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto vxlan48
iface vxlan48
    bridge-vlan-vni-map 100=1000 200=3000
    bridge-learning off

auto swp3
iface swp3
    bridge-access 100

auto swp4
iface swp4
    bridge-access 200

auto br_default
iface br_default
    bridge-ports swp3 swp4 vxlan48
    bridge-vids 100 200
    bridge-vlan-aware yes
    bridge-pvid 1
    bridge-vlan-protocol 802.1ad
...

查看配置

要验证网桥 QinQ 配置,请运行 ip -d link show bridge 命令,并检查输出中是否存在 vlan_protocol 802.1ad

cumulus@switch:~$ sudo ip -d link show bridge
287: bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
    link/ether 06:a2:ae:de:e3:43 brd ff:ff:ff:ff:ff:ff promiscuity 0
    bridge forward_delay 1500 hello_time 200 max_age 2000 ageing_time 30000 stp_state 2 priority 32768 vlan_filtering 1 vlan_protocol 802.1ad bridge_id 8000.6:a2:ae:de:e3:43 designated_root 8000.6:a2:ae:de:e3:43 root_port 0 root_path_cost 0 topology_change 0 topology_change_detected 0 hello_timer    0.00 tcn_timer    0.00 topology_change_timer    0.00 gc_timer   64.29 vlan_default_pvid 1 vlan_stats_enabled 1 group_fwd_mask 0 group_address 01:80:c2:00:00:08 mcast_snooping 0 mcast_router 1 mcast_query_use_ifaddr 0 mcast_querier 0 mcast_hash_elasticity 4096 mcast_hash_max 4096 mcast_last_member_count 2 mcast_startup_query_count 2 mcast_last_member_interval 100 mcast_membership_interval 26000 mcast_querier_interval 25500 mcast_query_interval 12500 mcast_query_response_interval 1000 mcast_startup_query_interval 3125 mcast_stats_enabled 1 mcast_igmp_version 2 mcast_mld_version 1 nf_call_iptables 0 nf_call_ip6tables 0 nf_call_arptables 0 addrgenmode eui64

配置示例

此示例显示了叶节点上传统桥接模式下 802.1ad QinQ 的配置。

/etc/network/interfaces 文件示例

双标记转换

双标记转换包括具有双标记成员接口的网桥,其中 C-tag 和 S-tag 的组合映射到 VNI。您仅在面向公有云的边缘创建配置。面向客户的边缘的 VXLAN 配置不需要更改。

双标记始终是云连接。面向客户的边缘是单标记或未标记的。在公有云切换点,VNI 映射到双 VLAN 标记,其中 S-tag 表示客户,C-tag 表示服务。

Cumulus Linux 中的配置使用外部标记表示客户,内部标记表示服务。

您可以使用双标记转换

  • 仅在 Spectrum-2 及更高版本中,在仅限本机接口的 VXLAN 配置中。您不能在 bond 上配置双标记转换。
  • 仅适用于 传统模式 下的网桥。
  • 使用 802.1Q 桥接模式。
  • 不使用 MLAG。

双标记转换使用

  • 内部 ACL 资源,这可能会增加 ACL 资源利用率。要查看使用的 ACL 条目数,请运行 sudo cat /cumulus/switchd/run/acl_info/iacl_resource 命令。
  • 每个传统模式网桥的内部 VLAN,其默认范围为 275。要更改范围,请编辑 /etc/cumulus/switchd.conf 文件以取消注释 #resv_vlan_range = 3725-3999 行并指定要使用的范围。

要配置双标记接口,请将 VLAN 堆叠为 <port>.<outer tag>.<inner tag>。例如,swp1.100.10,其中外部标记是 VLAN 100(表示客户),内部标记是 VLAN 10(表示服务)。

配置示例

NVUE 不支持双标记转换。

要使用上面的示例配置交换机以进行双标记转换,请在文本编辑器中编辑 /etc/network/interfaces 文件并添加以下内容

auto swp3.100.10
iface swp3.100.10
    mstpctl-portbpdufilter yes
    mstpctl-bpduguard yes

auto vni1000
iface vni1000
    vxlan-local-tunnelip  10.0.0.1
    mstpctl-portbpdufilter yes
    mstpctl-bpduguard yes
    vxlan-id 1000

auto custA-10-azr
iface custA-10-azr
    bridge-ports swp3.100.10 vni1000
    bridge-vlan-aware no

要检查配置,请运行 brctl show 命令

cumulus@switch:~$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
custA-10-azr    8000.00020000004b       yes             swp3.100.10
                                                        vni1000
custB-20-azr    8000.00020000004b       yes             swp3.200.20
                                                        vni3000

注意事项

Linux 内核将接口名称限制为 15 个字符,这对于 QinQ 接口来说可能是一个问题。要解决此问题,请创建两个 VLAN 作为嵌套 VLAN 原始设备,一个用于外部标记,另一个用于内部标记。例如,您不能创建名为 swp50s0.1001.101 的接口,因为它包含 16 个字符。相反,请编辑 /etc/network/interfaces 文件以创建 ID 为 1001 和 101 的 VLAN

cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto vlan1001
iface vlan1001
      vlan-id 1001
       vlan-raw-device swp50s0

auto vlan1001-101
iface vlan1001-101
       vlan-id 101
       vlan-raw-device vlan1001

auto bridge101
iface bridge101
    bridge-ports vlan1001-101 vxlan1000101
...