QinQ 和 VXLAN
QinQ 是 IEEE 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 中继的远程提供商边缘(上图右侧的交换机)。
远程提供商边缘交换机
对于面向远程提供商云的交换机
- 配置网桥,并将
vlan_protocol
设置为 802.1ad。 - VNI 映射回 S-tag(客户)。
- 连接到公有云的中继端口是 QinQ 中继,数据包被双重标记,其中 S-tag 用于客户,C-tag 用于服务。
要配置远程提供商交换机
编辑 /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 封装期间不会更改。
要配置面向客户的交换机
编辑 /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 的配置。
双标记转换
双标记转换包括具有双标记成员接口的网桥,其中 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(表示服务)。
配置示例

要使用上面的示例配置交换机以进行双标记转换,请在文本编辑器中编辑 /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
...