ACL里面匹配网段的规则原来是这样,终于理解了
一直对ACL和OSPF里面匹配网段的掩码有点模糊,OSPF使用反掩码,ACL则使用通配符掩码,看样子一样,其实略有点区别。
先来看看度娘对通配符掩码的定义。
通配符掩码(wildcard-mask)
通配符掩码(wildcard-mask)路由器使用的通配符掩码与源或目标地址一起来分辨匹配的地址范围,它与子网掩码不同。它不像子网掩码告诉路由器IP地址的哪一位属于网络号一样,通配符掩码告诉路由器为了判断出匹配,它需要检查IP地址中的多少位。这个地址掩码可以只使用两个32位的号码来确定IP地址的范围。这是十分方便的,因为如果没有掩码的话,不得不对每个匹配的IP客户地址加入一个单独的访问列表语句。这将造成很多额外的输入和路由器大量额外的处理过程。所以地址掩码相当有用。
TIP:通配符掩码中,0表示要检查的位,1表示不需要检查的位。
浅薄之见
经常使用ACL的朋友应该能明白以下的ACL匹配的网段内容:
由于业务需要
eg1:匹配172.16.8.0 /24的网段,那么ACL的通配符掩码通常是:0.0.0.255
eg2:匹配172.16.8.1 /32的主机IP,那么ACL的通配符掩码通常是:0.0.0.0
#rule 1 deny ip source 172.16.8.0 0.0.0.255
#rule 2deny ip source 172.16.8.1 0.0.0.0
度娘说的0要检查,1不检查到底是什么意思呢?
TEST1
我们首先将eg1例中的IP地址172.16.8.0 /24转换为二进制:10101100.00010000.00001000.00000000(使用calc自行计算)
ACL的通配符掩码通常是:0.0.0.255,转化为二进制是:00000000.00000000.00000000.11111111
0,1表示要检查的位(这里说的0和1是通配符掩码的0和1,本例中的0.0.0.255)
当通配符掩码是0时,需要检查位,IP地址必须精确匹配,通俗来讲,此时,要求匹配的IP段或者主机,它们二进制的每一位都不能发生变化
即匹配还是10101100(十进制:172)同理此IP段,点分十进制前三段匹配后还是172.16.8
而最后的通配符掩码是255,转换为二进制即8位的1:11111111,当通配符掩码是1时,表示不需要检查位,IP地址可以模糊匹配,(这里说的0和1是通配符掩码的0和1,本例中的0.0.0.255),模糊匹配就是0/1都可以,所以此时通配符的掩码255匹配了多少个地址呢?
是的,00000000-11111111 共256个地址(0-255共256个地址,其中主机位全0的是网络地址,主机位全1的是广播地址),所以
#rule 1 deny ip source 172.16.8.0 0.0.0.255 就将172.16.8.0/24的网段匹配出来了。
举例1:192.168.1.0 0.0.0.255这条规则匹配了192.168.1.0 /24 这个网段,共有256个地址
举例2:172.16.1.0 0.0.255.255这条规则匹配了172.16.0.0 /16这个网段,共有个地址65536个地址
特殊例子
通配符掩码:0.0.0.0,表示唯一的一个主机地址
通配符掩码:255.255.255.255,表示任意的IP地址
TEST2
上面笔者举的例子都是一些较为规则的匹配网段,容易读懂,看明白,那么遇上这类伤脑筋的通配符掩码呢?
#rule 1 deny ip source 172.16.1.0 0.0.0.7
这一条ACL又是覆盖了哪些段呢?我们不妨将上面的IP和通配符掩码都转化二进制来看看:
172.16.1.0 ➡10101100.00010000.00000001.00000000
0.0.0.7 ➡00000000.00000000.00000000.00000111
那么根据匹配规则我们知道,点分十进制前3位精确匹配,(因为通配符掩码都是0)所以依然是172.16.1
但是最后面的十进制7有点陌生,它转换为二进制:00000111,那么不难看出,前5位我们要检查位(检查的是IP地址的位),也就是精确匹配,即IP地址的二进制前5位还是它本身,等到通配符掩码是111的时候,这三位可以表示000-111,共8个地址。也就是说#rule 1 deny ip source 172.16.1.0 0.0.0.7 匹配的IP地址是:
172.16.1.0 -172.16.1.7
不难发现,我们总是用通配符掩码来检查IP地址的位,而此条ACL代表的网段是由IP地址和通配符掩码共同决定的。
eg2:还是这条ACL,但是我们改变一下通配符的掩码
#rule 1 deny ip source 172.16.1.0 0.0.7.7
172.16.1.0 ➡10101100.00010000.00000001.00000000
0.0.7.7 ➡00000000.00000000.00000111.00000111
那么根据匹配规则我们知道,点分十进制前2位精确匹配,(因为通配符掩码都是0)所以依然是172.16
IP地址第三段,1的二进制是00000001,而通配符掩码是00000111,所以,IP地址前5位依然是精确匹配,即0(DEC,十进制),但是后3位是111(BIN,二进制),所以依然有0-7这个段,那么我们是不是可以得出点分十进制的前三段:
172.16.0 -172.16.7,最后一段点分十进制,同样的道理,那么我们现在能知道#rule 1 deny ip source 172.16.1.0 0.0.7.7 这条ACL匹配的网段范围:
172.16.0.0~172.16.0.7
172.16.1.0~172.16.1.7
172.16.2.0~172.16.2.7
172.16.3.0~172.16.3.7
172.16.4.0~172.16.4.7
172.16.5.0~172.16.5.7
172.16.6.0~172.16.6.7
172.16.7.0~172.16.7.7
172.16.1.0 0.0.7.7 这条ACL匹配的网段范围内共有64个IP地址。
TEST3
上面的例子,笔者依然觉得自己举了一些特殊的例子,并不能更贴切的让读者明白,我们再来看个例子:
#rule 1 deny ip source 172.16.132.9 0.0.10.1
我们吧IP地址点分位四段,172,16,132,9
同样,我们进行进制转换:
172.16.132.9 ➡10101100.00010000.10000100.00001001
0.0.10.1 ➡00000000.00000000.00001010.00000001
我们依然不难看出,这条ACL的前两段是精确匹配,那么最终结果的点分十进制,
前两段点分十进制可以确定是:172.16
那么来看第三段:
IP:132➡ 10000100
通配符掩码10:00001010
通过通配符我们知道前4位是精确匹配,则IP地址是128(DEC,十进制),
第5位是1,所以,是模糊匹配。有0/1两种情况,而第5位的值是8,
可以预想的是会有:128,128+8这两个IP地址;
继续向后看第6位,通配符掩码是0,所以IP的第6位必须是1,而第6位的值是4
可以预想的是会有:128+4,128+16+4,这两个地址;
继续向后看第7位,通配符掩码是1,所以是模糊匹配。有0/1两种情况,而第7位的值是2
可以预想的是会有:
128+4=132,
128+8+4=140,
128+8+4+2=142,
128+4+2=134,
这4个地址;
继续来看第4段:
IP:9 的二进制: ➡ 00001001
通配符掩码1的二进制:➡ 00000001
因为通配符前7位是0,所以我们要求IP的前7位精确匹配,即前7位它的值是8(DEC,十进制),
最后一位通配符掩码是1,所以不需要IP精确匹配,即它的值是0或者1,这样第四段会有两个结果,即
9(DEC)或者8(DEC)
那么,我们总结全部的四段,可以得出
#rule 1 deny ip source 172.16.132.9 0.0.10.1这条规则匹配的IP是:
172.16.132.8~172.16.132.9
172.16.134.8~172.16.134.9
172.16.140.8~172.16.140.9
172.16.142.8~172.16.142.9
共8个IP。
总结
关注ACL匹配的网段或者IP时,我们总是将IP和通配符掩码结合起来,它们共同决定了即将匹配的网段或者IP。并且我们遵循
0要检查的位,1不需要检查的位的原则,就可以轻松得出这条ACL或者前缀列表匹配的是哪些IP了。
拓展
给出多个连续的IP范围,我们可以用一条ACL匹配完毕吗 ?例如:192.168.10.0~20这21个IP地址,可否用一条AC匹配?
答案是不能,我们可以以分段的方式来匹配。
#192.168.10.0 0.0.0.15
#192.168.10.16 0.0.0.7
#192.168.10.20 0.0.0.0
读者可以自行,计算下过程,了解通配符的用法。
结语:匆匆写这篇文章,路过的大神若发现不足之处,还望不吝指教。
更多推荐
所有评论(0)