• 三层交换机之ACL


    概述

    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等场景。

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

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

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

     

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

    原则上,不同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查找。

    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命令

  • 相关阅读:
    【Redis】跳跃表原理分析与基本代码实现(java)
    小鹤音形指引
    Maven
    算法思维(长期更)
    多路平衡树之红黑树
    多路平衡树之B树
    多路平衡树之2-3查找树
    栈与队列
    树基本概念
    Vue学习
  • 原文地址:https://www.cnblogs.com/justin-y-lin/p/15883365.html
Copyright © 2020-2023  润新知