在上次分享完了华为二层ACL应用配置后,今天深入的对二层ACL的通配符定义做一下技术说明:(认证考试可能会提及,但也不会有多深,需要大概的了解下即可。)
拓扑如下:我现在查看sw1的配置。
我可以看到的是:在acl4001--4002中,其中的定义规则里面全部都是mac地址
而配置基本或者高级ACL时,里面IP定义的规则:
格式如图:一个IP 地址+一个反掩码。
在二层ACL中却不需要反码,我们可以把这样的掩码和反码称之为通配符(表示一批的地址。)。
可以复习下反码的作用:如下图掩码和反码的定义和区别!
对于二层ACL完全可以认为后面跟着就是子网掩码(跟基本和高级ACL定义IP地址跟反码是相反的!),意味着有1的部分对应的IP地址不可动(进行检查)!
假设,我在二层ACL中定义了源mac,后面不跟任何信息,我们可以认为后面跟了FFFF-FFFF-FFFF ,这就是主机掩码(255.255.255.255.255)!
而通配符的作用:表示一批的地址。可以在二层ACL中利用通配符这一特性来完成ACL你需要的某种需求!
先将pc1和pc14的mac地址单独取出来,然后按照华为二层ACL规则定义对mac地址格式比对:
pc1 :54-89-98-1D-03-2B = 5489-981D-032B
pc14:54-89-98-FE-4C-1E = 5489-98FE-4C1E
按照掩码的写法,最后将通配符定义成如下:
FFF-FF00-0000
如果这样写的话,会造成很大一个范围的mac地址,( 其中00-0000并不是代表连续的数字,而是 5489-98xx-xxxx ,其中x代表任意一位!)
因为应用场景比较少,因为Mac地址(不是有序的排列)不会是全部包容进来的,这里我就不详细说明。这里,我们只需要知道二层ACL的应用场所和配置了。有空后续会拿出一个详细的说明分享。
回到ACL主线上来,分享一下用户自定义ACL的格式(格式比较复杂,涉及到偏移量)
华为官方按照ACL的规则来区别定义ACL:
1.基本ACL
2.高级ACL
3.二层ACL
4.用户自定义ACL
5.用户ACL
6.IPV4 ACL
7.IPV6 ACL
用户自定义ACL:根据报文头,偏移量,字符串掩码和用户自定义字符串来定义规则,达到过滤的目的。
在OSI七层模型中,二层数据报文的头部叫帧头;三层数据报文叫IP报头。
对照拓扑,随意抓取一个报文,就可以看到二层和三层的报头部分:
每个头部的内部都有很多字段。
比如在二层以太网帧里面的目的,源mac 、类型。
用户自定义ACL的工作机制无非就是控制(匹配)二层以太网帧头部、三层的IP报文头部内的某些字节,匹配成功允许通过,反之拒绝!
先来简单看下用户自定义ACL的格式:涉及帧头和IP报头。
[sw1]acl 5001
[sw1-acl-user-5001]rule per
[sw1-acl-user-5001]rule permit ?
ipv4-head Offset from IP(v4) head
ipv6-head Offset from IP(v6) head
l2-head Offset from l2 head
l4-head Offset from L4 head (一般不用)
time-range Specify a special time
因为用户自定义ACL涉及到数据报文的帧头和IP报头:
①帧头部分:
[sw1-acl-user-5001]rule permit l2-head ?
STRING<3-10> Rule string, the string must be hexadecimal and start with '0x'
翻译过来的意思是:规则的字符串指的是比较头部中的哪个字段。
举个例子,我拿以太网头部中的类型字段来讲解:
0x0800;0x不难理解就是16进制,其中0x????代表告知设备二层以太网内部携带的数据使用的是何种协议 ,其中0x0800在图中我可以很清楚的看到使用的是IP协议。这就跟数据的解封装有关了,封装是从上层到下层;而解封装是从下层上层协议的,当解封到二层以太网帧头部分,发现三层协议时,设备就会用0x0800这个IP字段翻译出三层数据的意思。属于一个脉络的范围。
[sw1-acl-user-5001]rule permit l2-head 0x0800
STRING<3-10> Mask to the rule string, the string must be hexadecimal and
start with '0x'
因此,用户自定义的具体格式如下:(这里请忽略配置参数的具体数值。)
[sw1-acl-user-5001]rule permit l2-head 0x0800 0xffff 30
最后查看配置时,发现多了4个0:系统自动补充。
rule 10 permit 0x00000800 0x0000ffff 30
系统自动补全的原因在于:
00000800中的十六进制数有4位2进制数
例如,我在抓包中查看0x0800的类型字段,可以看到占用了两个字符,而这个固定的数值,我们也可以理解成为偏移量。
依此类推各字符占用的位置:
① 二层/三层从报头中,最多可以取出4个字符。(相当于8个16进制数,用户自己指定的值)
而在MAC地址中,它占据了6个字符!在命令行中只允许有4个字符出现,所以在用户自定义ACL中要过滤MAC地址却显得力不从心(一条命令是无法概括的表现。)!
在每个数据报文内部的各种数值都是不一样的,比如说0x0800,这里面有个固定的数值,08 00,我们也可以理解成为偏移量的值。
偏移量的概念就是从报头字段中从左往右的位数,数数即可得知。
例如,我抓取以太网帧头部的目的mac地址,看下数据报文中的目的Mac地址的值:分别占用了第一行的1 2 3 4 5 6 个字符。
而依据16进制的原则,我再来看0x0800的数值:实际上它占据了12 13 ,我把54这个字符位是从0开始计算。4位二进制是0-15!这一点需要注意!
所以08 是第十二位置!
因此这里的偏移量我就可以手工的去指定!(那个字段,那个报文数据去取偏移量)29 15:00