一、概述
distribute-list分发列表是用于控制路由更新的一个工具,只能过滤路由信息,不能过滤LSA。(所以说对距离矢量路由协议比较适用,如:RIP、EIGRP。
像OSPF 链路状态路由协议,IN方向(影响本地路由表,但LSDB里是有的),OUT方向不起作用; 但对本地始发路由可以过滤,原因是通过路由的重分发,而不是LSA传递。)
如上图,R1、R2、R3运行RIP。R2在初始情况下,会将自己的路由表更新给R1,其中假设包含三条路由1.0、2.0及3.0。现在我们可以通过在R2上部署分发列表distribute-list,使得R2在更新给R1的路由信息中过滤掉3.0这条路由。这就是分发列表的一个使用示例。当然,它还有更加广泛的应用。
二、部署要点
分发列表是用于控制路由更新的一个工具,只能过滤路由信息,不能过滤LSA。因此:分发列表在距离矢量路由协议中使用,无论是in或者是out方向,都能正常的过滤路由。但是在链路状态路由协议中的工作就有点问题了。
The command distribute-list out works only on the routes being redistributed by the Autonomous System Boundary Routers (ASBRs) into OSPF. It can be applied to external type 2 and external type 1 routes, but not to intra-area and interarea routes.
1.对于距离矢量路由协议
路由器之间,传递的是路由信息,分发列表对路由信息是有绝对的控制权的。因此如果是in方向,那么通过部署分发列表,可以过滤特定的路由,使得执行分发列表的本地路由路由表发生变化,同时,本地路由器在更新路由信息给下游路由器的时候,实际上更新的内容是受分发列表影响之后的条目。
同时在out方向,也是没有问题的。
2.对于链路状态路由协议,如OSPF
值的注意的是,对于OSPF这样的链路状态路由协议,路由器之间传递的消息不再是路由信息了,而是LSA,而分发列表是无法对LSA进行过滤的。因此,在链路状态协议中部署分发列表,就需要留意了:
- in方向,分发列表只能在本地收到LSA后,生成路由的那一刹那进行路由的过滤,执行分发列表的路由器自己路由表会被分发列表影响(但是本地LSDB仍然是有LSA的),而且该路由器仍会将LSADB中的LSA发送给邻居,因此本地被过滤的路由,邻居还有。
- out方向,分发列表只能工作在执行路由重发布动作的那个ASBR上,且只能针对外部引入的路由起作用。因为OSPF执行重发布时,其实这些外部路由是以路由的形式引入进来的,因此分发列表在这个场合下能够正常工作,但是如果不是本地始发的外部路由,或者是内部的OSPF路由,out方向的分发列表均束手无策。
例如在R1上重发布直连进OSPF,用out方向的分发列表可过滤掉1.1.1.0这条外部路由。但R1重发布进来的路由,如果在R2上用out方向的分发列表试图阻挡R3接受路由或LSA,则无法,因为这不是本地始发的外部路由。
三、配置命令
1.In方向
R1(config-router)#distribute-list 1 in ? // 都是接口
Async Async interface
BVI Bridge-Group Virtual Interface
CDMA-Ix CDMA Ix interface
Dialer Dialer interface
FastEthernet FastEthernet IEEE 802.3
Multilink Multilink-group interface
Port-channel Ethernet Channel of interfaces
Tunnel Tunnel interface
Vif PGM Multicast Host interface
Virtual-PPP Virtual PPP interface
Virtual-Template Virtual Template interface
……
2.OUT方向
R1(config-router)#distribute-list 1 out ? // 接口或协议
Async Async interface
BVI Bridge-Group Virtual Interface
Dialer Dialer interface
FastEthernet FastEthernet IEEE 802.3
Loopback Loopback interface
Multilink Multilink-group interface
Port-channel Ethernet Channel of interfaces
Tunnel Tunnel interface
Virtual-PPP Virtual PPP interface
Virtual-Template Virtual Template interface
Virtual-TokenRing Virtual TokenRing
bgp Border Gateway Protocol (BGP)
connected Connected
eigrp Enhanced Interior Gateway Routing Protocol (EIGRP)
ospf Open Shortest Path First (OSPF)
rip Routing Information Protocol (RIP)
static Static routes
……
四、应用场合
1.配置示例1(单一路由协议环境下-RIP)
初始情况下,R3能够学习到R1的三条loopback路由,以及192.168.12.0/24路由。现在我们不希望R3学习到192.168.3.0/24的路由,那么可以在R2上如下配置:
R2(config)# access-list 1 deny 192.168.3.0
R2(config)# access-list 1 permit any
R2(config)# router rip
R2(config-router)#
distribute-list 1 out fa 1/0
当然,在R3上,用in方向的分发列表也可以达到同样的效果。
2.配置示例2(单一路由协议环境下-RIP)
在R2上如果做如下配置:
R2(config)# access-list 1 deny 192.168.3.0
R2(config)# access-list 1 permit any
R2(config)# router rip
R2(config-router)#
distribute-list 1 in fa0/0
那么,首先R2自己的路由表会发生改变,3.0的路由被过滤掉了,同时R3也就是下游RIP路由器,3.0也学不到。
3.配置示例3(单一路由协议环境下-OSPF)
R2的配置如下:
R2(config)# access-list 1 deny 192.168.3.0
R2(config)# access-list 1 permit any
R2(config)# router ospf 1
R2(config-router)#
distribute-list 1 in fa0/0
注意这时候,首先在R2的路由表里,3.0的路由就被干掉了。注意,这时候实际上,area内OSPF路由器产生的LSA已经是装载到了R2的OSPF database之中,而在R2从OSPF database中计算路由,并准备将路由条目装载进路由表之前,in方向的分发列表发生作用了,将3.0的路由过滤掉了,因此R2的路由表中,是没有3.0的OSPF路由的。但是,虽然R2自己路由表里没3.0路由,这不妨碍R2将相关LSA泛洪给R3,因此,R3仍然是有1.0、2.0、3.0以及12.0的OSPF路由的。
4.配置示例4(单一路由协议环境下-OSPF)
现在我们在R2上做如下配置:
R2(config)# access-list 1 deny 192.168.3.0
R2(config)# access-list 1 permit any
R2(config)# router ospf 1
R2(config-router)#
distribute-list 1 out
R3的路由表会是什么情况?实际上,没有任何影响,R3能学习到全网的路由。至于为什么,我相信前面已经解释的非常清楚了。
5.配置示例5(单一路由协议环境下-OSPF out方向分发列表)
分发列表,部署在OSPF这样的链路状态路由协议中,如果要用out方向,则只能用在这样的场合。
如上图,在R1上部署,R1使用重发布直连的方式引入这三条外部路由,那么out方向的分发列表,只能在R1上部署,且对这三条路由产生作用。
R1(config)# access-list 1 deny 192.168.3.0
R1(config)# access-list 1 permit any
R1(config)# router ospf 1
R1(config-router)# redistribute connected subnets
R1(config-router)# network 192.168.12.1 0.0.0.0 area 0
R1(config-router)#
distribute-list 1 out
上述配置实现后,R1将过滤掉3.0路由。
6.配置示例6 协议间重发布时部署分发列表
RIP重发布进OSPF
R2的配置如下:
access-list 1 permit 1.1.1.0
router ospf 1
redistribute rip metric 10 subnets
distribute-list 1 out rip
这里这条命令的意思是,从RIP路由协议重分发过来的路由中,只允许1.1.1.0出去(到OSPF协议,没有方向,只要是运行了OSPF的接口)
R3的路由表里,只有1.1.1.0的路由
在R2上开设loopback接口2.2.2.0/24,R2既重发布RIP进OSPF,又重发布直连进OSPF
access-list 1 permit 1.1.1.0
router ospf 1
redistribute connected subnets
redistribute rip metric 10 subnets
network 192.168.23.0 0.0.0.255 area 0
distribute-list 1 out
// 在R3上只有1.1.1.0的路由,也就是说distribute-list 1 out 此处这条命令,对所有从外部注入进OSPF的路由都生效,最终只有1.1.1.0路由存活下来。而不断路由的来源是直连路由,还是RIP。
在R2上开设loopback接口2.2.2.0/24,R2既重发布RIP进OSPF,又重发布直连进OSPF
access-list 1 permit 1.1.1.0
router ospf 1
redistribute connected subnets
redistribute rip metric 10 subnets
distribute-list 1 out rip
// R3的路由表中有路由:1.1.1.0 、 2.2.2.0 、 192.168.12.0
// 也就是屏蔽掉了从RIP重发布进来的除了1.1.1.0以外的路由,并重发布本地直连接口
这里我们讨论一下在不进行路由重发布的情景下,OSPF过滤LSA的两种方法:
- area filter-list prefix
- database-filter
这两种方法的使用并不常见,作为一个OSPF的扩展知识跟大家分享一下:
1.在ABR上过滤3类LSA
默认情况下,R3能够学习到1.1.1.1、11.11.11.11、2.2.2.2、192.168.12.0这几条inter-area路由。这些路由都是R3搜集到“由R2向area0注入的3类LSA”并计算得出的。
那么如果我们不想让R3学习到11.11.11.11/32这条路由呢?
ip prefix-list 100 deny 11.11.11.11/32
ip prefix-list 100 permit 0.0.0.0/0 le 32
!
router ospf 1
area 0 filter-list prefix 100 in
上面这条命令的意思是,在从其他区域向area0区域注入3类LSA时执行该前缀列表过滤器。
如果是area 1 filter-list prefix 100 out,这条命令的意思是在从area1向其他所有区域注入3类LSA时执行该前缀过滤器。
注意,当我们在ABR上部署3类LSA的这个过滤方案时,只能够过滤那些产生自该ABR的3类LSA,上图中area0里默认情况下泛洪的1.1.1.1、11.11.11.11、2.2.2.2、192.168.12.0这些路由的3类LSA都是产生自R2的,因此都可以通过前缀列表进行过滤。
另外这个特性还有平台和版本的限制,只有在以下平台的CISCO IOS Release 12.0(15)S才支持。
2.过滤掉所有出站LSA
默认情况下全网的路由都是通的。
如果我们在R2的Eth0/1口上部署:
Interface ethernet 0/1
ip ospf database-filter all out
!! Filter OSPF LSA during synchronization and flooding
这条命令将让R2在eth0/1口上不进行任何LSA的泛洪,其中包括1类LSA。
于是最终R3上将学不到任何路由,在R3的OSPF database只有一条1类LSA,就是它自己产生的。
但是R1、R2这一侧LSA的接收和路由计算还是正常的,也就是说,R3发给R2的LSA,R2还是收的。
所以R1及R2都能学习到3.3.3.3/32