ACL与RouteMap的permit与deny在重分配时的动作

A — B 两台路由器通过E1/1接口直联,运行OSPF。 A路由器配置3条静态路由:

ip route 7.0.0.0 255.0.0.0 Ethernet1/1

ip route 8.0.0.0 255.0.0.0 Ethernet1/1

ip route 9.0.0.0 255.0.0.0 Ethernet1/1

A路由器ospf的配置如下:

router ospf 1 log-adjacenc

A –— B 两台路由器通过E1/1接口直联,运行OSPF。

A路由器配置3条静态路由:
ip route 7.0.0.0 255.0.0.0 Ethernet1/1
ip route 8.0.0.0 255.0.0.0 Ethernet1/1
ip route 9.0.0.0 255.0.0.0 Ethernet1/1

A路由器ospf的配置如下:
router ospf 1
log-adjacency-changes
redistribute static route-map test
network 0.0.0.0 255.255.255.255 area 1

1)
在A路由器上,不配置任何ACL,只配置RouteMap,配置如下:
route-map test permit 10
match ip address 1
此时ACL 1是一张空表。
配置完成之后过几秒钟,在B路由器上查看OSPF的路由表,如下:
Link ID         ADV Router      Age         Seq#       Checksum Tag
7.0.0.0         192.168.1.1     52          0x80000001 0x0073BA 0
8.0.0.0         192.168.1.1     1207        0x80000001 0x0066C6 0
9.0.0.0         192.168.1.1     1207        0x80000001 0x0059D2 0
A路由器上的三条静态路由都成功的重分配进OSPF,并传给了B路由器。
单步总结:当RouteMap引用的ACL是一张空表时,对应的规则是permit any。

2)
在A上配置ACL 1,只有一个permit规则,此时ACL和RouteMap的配置如下:
access-list 1 permit 7.0.0.0 0.255.255.255
!
route-map test permit 10
match ip address 1
此时,在B路由器上,就只能看到7.0.0.0这条路由,如下:
Link ID         ADV Router      Age         Seq#       Checksum Tag
7.0.0.0         192.168.1.1     140         0x80000001 0x0073BA 0
A路由器只重分配了7.0.0.0这条路有进OSPF,另外两条就被过滤掉了。
单步总结:当RouteMap引用的ACL是非空表时,ACL规则开始生效,如上例子,ACL 1允许(permit)了7.0.0.0这条路由,并且deny掉了其它的路由(每条ACL最后都有一个隐藏的deny any)。

3)
在A路由器上,修改ACL的配置,RouteMap配置不变,如下:
access-list 1 deny   7.0.0.0 0.255.255.255
!
route-map test permit 10
match ip address 1
上一步的ACL 1是permit 7.0.0.0这条路由,这一步仅仅是将permit修改成deny。
配置完成过一会儿,查看B路由器OSPF的路由表,A路由器上的三条静态路由,B路由器一条都没有。
单步总结:这一步得到的结论跟第2步的结论一样,ACL 1显示的deny掉了7.0.0.0这条路由,然后用隐藏规则deny掉了其它两条路由。

4)
为了充分测试,搞清楚每一个细节,我们再将ACL的配置做一点修改,RouteMap的配置暂时保持不变,A路由器的配置如下:
access-list 1 deny   7.0.0.0 0.255.255.255
access-list 1 permit any
!
route-map test permit 10
match ip address 1
ACL 1 的配置增加了一条permit any。
过一会儿查看B路由器OSPF的路由表,如下:
Link ID         ADV Router      Age         Seq#       Checksum Tag
8.0.0.0         192.168.1.1     12          0x80000001 0x0066C6 0
9.0.0.0         192.168.1.1     12          0x80000001 0x0059D2 0
可以看到8.0.0.0 9.0.0.0这两条路有豆成功的进行了重分配。
单步总结:ACL 1由于配置了permit any,这条规则在隐藏规则之前生效,因此8.0.0.0 9.0.0.0这两条路由成功匹配并重分配。

5)
测试到这里,可能大家会觉得这个规则已经很清楚了,其实不然阿!到目前为止,RouteMap的配置一直没有变化,下面,我们慢慢地将RouteMap的 配置进行修改,进行进一步的分析。
在上一步的基础上,我们修改一下配置,A路由器的配置如下:
access-list 1 permit 7.0.0.0 0.255.255.255
!
route-map test deny 10
match ip address 1
ACL 1仅仅允许7.0.0.0 这条路由,不过,此时RouteMap test 10已经变成了deny。读到这里,大家可以先自己想想会是一个什么样的结果。
此时B路由器上OSPF路由表为空!
单步结论:虽然ACL 1允许了一条路由,但是RouteMap的deny的优先级更高(或者可以理解为RouteMap的这个deny在后面执行),因此B路由器上没有看到任 何一个静态路由。

6)
我们继续修改RouteMap的配置,此时我们增加一条RouteMap的配置,A路由器的配置如下:
access-list 1 permit 7.0.0.0 0.255.255.255
!
route-map test deny 10
match ip address 1
!
route-map test permit 20
在上一步的基础上,增加名称为test,序列号为20的RouteMap,这条RouteMap配置下什么都没有。
此时查看B路由器上OSPF的路由表,如下:
Link ID         ADV Router      Age         Seq#       Checksum Tag
8.0.0.0         192.168.1.1     9           0x80000001 0x0066C6 0
9.0.0.0         192.168.1.1     9           0x80000001 0x0059D2 0
可以看出,8.0.0.0 9.0.0.0这两条路由成功进行了重分配。
ACL 1只允许了7.0.0.0这条路由,由于RouteMap test 10 的deny动作,7.0.0.0 这条路由没有进行重分配。现在8.0.0.0 9.0.0.0这两条路由进行了重分配,只有一个解释,那就是ACL 1对这两条路由给出的deny(ACL 1的隐藏规则)并不是影响最终了重分配动作!ACL 1虽然deny了这两条路由,但是在RouteMap test 20里面,将match everything(RouteMap下如果没有配置任何match命令,则表示match everything)。
单步结论:ACL给出的deny不会影响最终的重分配动作,RouteMap如果后续还有配置,则将ACL deny的路由继续向下传递并重新进行匹配。

7)
再A路由器上,进一步修改配置,如下:
access-list 1 deny   7.0.0.0 0.255.255.255

access-list 1 permit 8.0.0.0 0.255.255.255
!
route-map test deny 10
match ip address 1
!
route-map test permit 20
我们把ACL 1修改为deny动作,RouteMap的配置保持跟第6步一致。
配置完成之后查看B路由器的OSPF路由表,如下:
Link ID         ADV Router      Age         Seq#       Checksum Tag
7.0.0.0         192.168.1.1     1           0x80000001 0x0073BA 0
8.0.0.0         192.168.1.1     1           0x80000001 0x0066C6 0
9.0.0.0         192.168.1.1     1           0x80000001 0x0059D2 0
A路由器上的三条路由都成功进行了重分配。
第6步,我们得出一个结论,ACL给出的deny并不影响最终重分配动作,那么在这一步测试进行分析,ACL是deny,RouteMap也是deny, 但是所有的静态路由都成功进行了重分配,因此,可以说明,ACL的deny就可以简单的理解为匹配失败。(将这一步的ACL配置修改成access- list 1 deny any,B路由器上的结果还是一样。有兴趣的读者可以自己进行测试。)
单步结论:ACL给出的deny就是匹配失败,这时,RouteMap的动作并不重要,因此 RouteMap的动作只有在匹配成功的时候才生效,ACL deny之后,将进入下一条RouteMap继续进行匹配。

8)
最后,综合测试一下,A路由器的配置如下:
access-list 1 permit 7.0.0.0 0.255.255.255
access-list 2 permit 8.0.0.0 0.255.255.255
access-list 3 deny   9.0.0.0 0.255.255.255
!
route-map test deny 10
match ip address 1
!
route-map test permit 20
match ip address 2
!
route-map test permit 30
match ip address 3
配置完成之后,查看B路由器上的OSPF路由表,如下:
Link ID         ADV Router      Age         Seq#       Checksum Tag
8.0.0.0         192.168.1.1     51          0x80000001 0x0066C6 0
前面7步得到的测试结论可以很好的解释这一步的测试结果。

最终结论:
1,当RouteMap引用的ACL是一张空表时,表示permit any;
2,当RouteMap引用的ACL不是一张空表时,ACL的隐藏规则是要发挥作用的;
3,ACL中的比较给出的permit表示匹配成功,然后执行相应RouteMap的动作;
4,ACL中的比较给出的deny表示匹配失败,不执行相应RouteMap的动作,但这并不是RouteMap的最终结果,后面还要根据 RouteMap自身的规则进行。(即如果RouteMap后续还有序列号大的配置项,继续进入后面的RouteMap配置进行比较;如果后面没有任何 RouteMap的配置了,则执行RouteMap的隐藏动作deny everything。)

发表回复