概述

ACL(Access Control List)访问控制列表,俗称“防火墙”,它的作用是对入端口报文进行分类和过滤。

博通XGS系列交换芯片使用ContentAwareTM核(早期称为Fast Filter Processor)实现ACL功能,包括以下三种:

  • VLAN ContentAware Processor     (VCAP,也称为VFP - VLAN Filter Processor)
  • Ingress ContentAware Processor  (ICAP,也称为IFP - Ingress Filter Processor)
  • Egress ContentAware Processor   (ECAP,也称为EFP - Egress Filter Processor)

它们在报文处理流水线中的位置如下图所示:

三层交换机防火墙路由器经典架构配置详细教程 三层交换机 防火墙_三层交换机

如下图所示,每个ContentAwreTM核包含多个并行的引擎队(Slices)。每个Slice由一组Intelligent Protocol Aware Selector、Look-up Engine、Policy Engine、Metering Stats Engine组成,主要负责报文分类、转发策略、限速和包统计,应用于QoS、ACLs和DSCP等场景。

三层交换机防火墙路由器经典架构配置详细教程 三层交换机 防火墙_Slice_02

通俗讲,就是VFP/IFP/EFP分别包含多个Slices,每个Slice(可以创建一个Group)包含多个Entries,每个Entry可以实现一个ACL规则(亦称“FP规则”)。因此一个报文可以同时匹配到不同Slice的ACL规则。当一个报文匹配到多个ACL规则时,如果Action不冲突,则都会进行处理;如果Action冲突,则优先级高的Action生效。

默认情况下,一个Slice是Single-Wide模式,匹配的报文字段位宽比较有限。如果需要匹配更多的字段,则需要按照下图所示进行拼接。

三层交换机防火墙路由器经典架构配置详细教程 三层交换机 防火墙_Slice_03

第一种是将一个Slice的规则分为前后两部分,拼成Double-Wide模式。第二种是用两个Slice,拼成Slice-Paring模式。

 

三层交换机防火墙路由器经典架构配置详细教程 三层交换机 防火墙_字段_04

有的芯片还可以同时支持上述两种拼接方式,构成Quad-Wide模式,如下图所示。这种模式一般用来匹配IPv6报文。

三层交换机防火墙路由器经典架构配置详细教程 三层交换机 防火墙_字段_05

原则上,不同Slice(Group)之间,Slice序号越大,优先级越高。同一个Slice内部,不同FP Entries,根据优先级属性决定优先级顺序,数字越大,优先级越高。

原理分析

1、Intelligent Protocol-Aware Selector根据Slice配置的key(即创建FP Group时是指定的qset字段)解析报文,生成一组key值;

2、Lookup Engine将前面获取的一组key值与Slice内每个FP Entry(按照优先级从高到低的顺序)的Qualifer配置进行比较,找到第一个匹配的FP Entry;

3、Policy Engine根据前面匹配的FP Entry,选择其配置的Action;

4、Metering and Statistics Engine负责响应前面匹配的FP Entry的meter和stat动作;

5、Action Resolution Engine负责对匹配多个ACL规则的报文的转发action进行裁决,决定报文如何转发。

VFP(VLAN Filter Processor)

VFP支持VLAN编辑、可以匹配其他报文字段,因此,通常用来实现灵活QinQ域功能。

IFP(Ingress Filter Processor)

主要对入端口报文进行处理,包括入口ACL、流重定向、流镜像、设置下一跳、为QoS数据报文分类等用途;

EFP(Egress Filter Processor)

用途与IFP类似,但是在出端口之前进行处理。

表项资源

FP本质上是一组相互之间有关联的表(Tables),FP查找主要用到Index查找和TCAM查找。

三层交换机防火墙路由器经典架构配置详细教程 三层交换机 防火墙_Slice_06

Qualifier

SDK命令fp list qualifiers可以列出所有支持的Qualifier类型,以下只介绍几个关键的、生僻的字段。

IpInfo

报文IP头状态

IpInfo (3bit)

类型

描述

0

FIRST_FRAGMENT

IPv4/IPv6超长帧在网络中通常会进行分片传输。

对于IPv4报文(无论是分片包还是完整包),IPv4头的Fragment Offset域为0则匹配规则。

对于Ipv6报文,找不到Fragment扩展头或者Fragment扩展头的Fragment Offset域为0则匹配规则。

1

WHOLE_PACKET

只匹配IPv4/IPv6整包。

对于IPv4报文,IPv4头的MF位为0且Offset域为0则匹配规则。

对于IPv6报文,找不到Fragment扩展头或者Fragment扩展头的Fragment Offset域和MF位为0则匹配规则。

2

IP4_GOOD_CHKSUM

IPv4校验OK则匹配,对于IPv6报文,不感知。

 

PacketRes

Packet Resolution Status (4bit)

报文类型

描述

4'd0

Unknown Packet

以下列出的报文类型之外的报文

4'd1

Control Packet

EtherType 0x8808的以太网控制帧

4'd2

BPDU Packet

L2_USER_ENTRY table hit with BPDU bit set

4'd3

L2 Broadcast Packet

目的MAC为全F的广播报文

在VLAN内洪泛的IGMP_MLD_PKT_CONTROL寄存器定义的协议报文

4'd4

L2 Unicast Packet

在L2/L2_USER_ENTRY中查找到目的MAC的报文

4'd5

L2 Destination Lookup Failure Packet

在L2/L2_USER_ENTRY中查找不到目的MAC的报文

目的MAC和SVLAN在L2/L2_USER_ENTRY中查找到的表项为Pending状态的报文

4'd6

Unknown IP Multicast Packet

IPv4头校验失败报文

DIP不是组播地址,或者SIP是Martian地址

IPv4的目的MAC低23位和DIP不匹配

IPv6的目的MAC低32位和DIP不匹配

查找IPMC表失败

L3_ENTRY表中找到IPMC索引,但是IPMC索引非法或者端口匹配失败

4d'7

Known IP Multicast Packet

L2_ENTRY查表找到表项,且IPMC索引有效

4d‘8

Known L2 Multicast Packet

包括L2组播包和GPON/VPLS组播包

4d'9

Unknown L2 Multicast Packet

非法组播报文

目的MAC查找失败

目的MAC查找到L2表项,但是L2MC索引无效或者L2MC表项的VALID位置0

查找到无效IPMC索引的GPON/VPLS组播报文

4d'10

Known L3 Unicast Packet 

目的IP查找到L3 Table表项

4d'11 

Unknown L3 Unicast Packet 

目的IP查找L3 Table表项失败

包含Hop-By-Hop扩展头的IPv6报文

L3 SIP或者DIP不是有效的单播地址

TTL为0

IPv4 packet with options present and TTL is 1

校验失败的IPv4报文 

4d'12 

Known MPLS Packet 

MPLS_ENTRY lookup hit and not terminated 

4d'13 

Known L3 MPLS Packet 

Terminated L3 MPLS packet

4d'14 

Known L2 MPLS Packet 

Terminated VPLS/VPWS packet 

4d'15 

Unknown MPLS Packet 

MPLS_ENTRY表查找失败

MPLS_ENTRY表查找成功,但是MPLS_ENTRY表项ACTION域无效

Payload is IPv4 (or IPv6) but V4_ENABLE (or V6_ENABLE) bit in matched MPLS_ENTRY entry is not set 

 

UDF(User Defined Field)

UDF自定义字段,可以匹配报文前128字节的任意字段,以4字节为单位,但是可以通过掩码匹配任意位宽。

命令测试:

BCM.0> fp init
BCM.0> 
BCM.0> fp data create OffsetBase=PacketStart offset=12 length=2   (PacketStart指从报文L2头开始,即目的MAC字段开始,length指定长度)
Data qualifier created with id: 4  (返回QualId)
BCM.0> 
BCM.0> fp data format add QualId=4 RelativeOffset=0 L2=any VlanTag=any OuterIp=any InnerIp=any Tunnel=Any mpls=any
BCM.0> 
BCM.0> fp qset add data 4
BCM.0> 
BCM.0> fp group create 0 1
BCM.0> 
BCM.0> fp entry create 1 100
BCM.0> 
BCM.0> fp qual 100 data 4 0x8100 0xffff
BCM.0> 
BCM.0> fp action add 100 drop
BCM.0>
BCM.0> fp entry install 100

查看FP规则:

BCM.0> fp show entry 100
EID 0x00000064: gid=0x1,
         slice=0, slice_idx=0, part =0 prio=0, flags=0x10202, Installed, Enabled
              tcam: color_indep=0, 
 Stage 
 _bcmFieldQualifyData 
    Offset: 51 Width: 128         (此处,Offset显示不准确,实际以命令或者代码配置为准)
    DATA=0x00008100 00000000 00000000 00000000 
    MASK=0x0000ffff 00000000 00000000 00000000 
         action={act=Drop, param0=0(0), param1=0(0), param2=0(0), param3=0(0)}
         policer=
         statistics=NULL

相关API接口:

基于(base_offset + offset) / length 创建自定义qualifier

extern int bcm_field_data_qualifier_create(int unit, bcm_field_data_qualifier_t *data_qualifier);

 

获取指定qualid的qualifier配置

extern int bcm_field_data_qualifier_get(int unit, int qual_id, bcm_field_data_qualifier_t *qual);

 

删除指定qualid的qualifier

extern int bcm_field_data_qualifier_destroy(int unit, int qual_id);

 

配置UDF字段的匹配信息

extern int bcm_field_qualify_data(int unit, bcm_field_entry_t eid, int qual_id, uint8 *data, uint8 *mask, uint16 length);

Actions

SDK命令fp list actions可以列出所有支持的Action动作。

动作的优先级顺序为:Drop > Replace > Redirect > EgressMask > CopyToCpu。

SDK命令