Distribute-list(分发列表)用来过滤路由信息
Distribute-list使用方法:
Out方向distribute分发列表
Route(config-router)#distribute-list {access-list-number|name} out [interface-name|routing-process[routing-process parameter]]
in方向distribute分发列表
Route(config-router)#distribute-list {access-list-number|name} in [interface-name|routing-process[routing-process parameter]]
Distribute-list对距离矢量路由协议(RIPv1&RIPv2&EIGRP)在in和out方向都可以很好的工作,但是对于链路状态路由协议(OSPFv2&OSPFv3&IS-IS)在使用的时候要多加注意
环境一:
需求:R3路由器关于R1路由器三个Loopback接口路由信息,只能学习Loopback0的
上边全网运行RIPv2协议,R2可以在e0/1使用out方向来过滤路由信息
R2上配置:
R2(config)#access-list 10 deny 172.16.2.0
R2(config)#access-list 10 deny 172.16.3.0
R2(config)#access-list 10 permit any
R2(config)#router rip
R2(config-router)#distribute-list 10 out e0/1
R3上查看路由表只有R1路由器Loopback0路由信息
R4上查看路由表发现关于R1路由器三个Loopback接口路由都是存在的
这是因为R2在做distribute-list的时候out方向关联了e0/1接口只针对了R3路由器,没有针对R4路由器。
如果希望对R4路由器也生效,R2路由器可以在RIP进程中补一条命令
R2(config-router)#distribute-list 10 out e0/2
R2在做distribute-list时候out后边也可以不关联任何接口信息,如果不关联任何接口信息代表针对所有接口都生效
Distribute-list对链状态路由协议:
Distibute-list对于链路状态路由协议的out方向如果路由不是本地始发的,将不能起到任何效果
只有一种场合下out方向的distribute-list才能去部署,要去过滤到本地始发的外部路由。就是说比如R1上的Loopback是采用redistribute的方式注入OSPF,那么这个时候就叫本地始发的路由。这种情况如果在R1上去部署out方向distribute那么就可以起到过滤作用,因为对于redistribute来讲,redistribute这个外部路由进OSPF其实是以路由方式进来的,所以这个时候在本地做out方向Distribute-list就可以起到过滤作用。
环境二:
R1通过redistribute方式将三个Loopback接口宣告进OSPF进程,同时在R1上做out方向的distribute,过滤掉Loopback1和Loopback2两个接口路由信息
R1上配置:
R1(config)#access-list 10 deny 172.16.2.0
R1(config)#access-list 10 deny 172.16.3.0
R1(config)#access-list 10 permit any
R1(config)# router ospf 100
R1(config-router)#redistribute connected subnets
R1(config-router)#distribute-list 10 out
OSPF在做distracted out方向时候不可以关联任何接口
R2上查看路由表及OSPF database
cisco路由器查看OSPF LSDB 5类LSA命令:Router#show ip ospf database external
R3上查看路由表及OSPF database
R4 上查看路由表及OSPF database
通过观察R2、R3、R4三台路由器路由表及OSPF database可以看出R1路由器成功将自身Loopback1和Loopback2两条路由过滤掉并且连LSA信息都没有传递给邻居路由器
环境三:
R1上将环境二拓扑图中的redistribute给删掉,将三个Loopback接口通过network方式引入到OSPF进程,再次使用distribute out方向看下还会不会生效
R1上配置:
R1(config)#access-list 10 deny 172.16.2.0
R1(config)#access-list 10 deny 172.16.3.0
R1(config)#access-list 10 permit any
R1(config)#router ospf 100
R1(config-router)#no redistribute connected subnets
R1(config-router)#network 172.16.1.1 0.0.0.0 area 0
R1(config-router)#network 172.16.2.1 0.0.0.0 area 0
R1(config-router)#network 172.16.3.1 0.0.0.0 area 0
R1(config-router)#distribute-list 10 out
R2上查看路由表
R3上查看路由表
R4上查看路由表
通过观察R2、R3、R4三台路由器的路由表发现R1通过network命令将自身Loopback接口引入OSPF进程时,再次使用distribute out方向时并没有起到任何效果
环境四:
需求:R2上使用in方向distribute 观察R2、R3、R4三台路由器路由表
在R2上过滤掉R1路由器Loopback1和Loopback2路由信息,使用in方向
R1上配置:删掉network方式引入路由方式,通过redistribute方式引入R1自身Loopback信息
R1(config)#router ospf 100
R1(config-router)#no network 172.16.1.1 0.0.0.0 area 0
R1(config-router)#no network 172.16.2.1 0.0.0.0 area 0
R1(config-router)#no network 172.16.3.1 0.0.0.0 area 0
R1(config-router)#no distribute-list 10 out
R1(config-router)#redistribute connected subnets
R2上配置:
R2(config)#access-list 10 deny 172.16.2.0
R2(config)#access-list 10 deny 172.16.3.0
R2(config)#access-list 10 permit any
R2(config)#router ospf 100
R2(config-router)#distribute-list 10 in ethernet 0/0
OSPF在使用distribute in方向时可以关联接口,关联接口和不关联接口区别
如果关联某一个接口代表只是对关联的接口收到的路由信息做过滤,如果不关联某一个接口代表对自身所有接口生效
R2上路由表及OSPF database
R3上路由表及OSPF database
R4上路由表及OSPF database
通过查看R2、R3、R4三台路由器的路由表及OSPF LSDB 5类LSA信息可以发现
R2在in方向使用distribute只对自己的路由表生效,但是R2的OSPF LSDB中还是存在R1路由器三个Loopback接口5类LSA信息
R3、R4路由器的路由表及OSPF LSDB并没有受到任何影响,从这里也就可以总结出OSPF在使用distribute in方向时影响的是自身路由表,对邻居R2、R3并没有什么影响。
总结:OSPF在使用distribute时,in方向影响的是自己的路由表,out方向只有在过滤本地始发的路由才生效(例如本地通过redistribute方式引入路由时,因为重发布的时候这个动作引入的刚好是路由信息而不是LSA)。OSPF在in方向的时候实际上是在OSPF计算LSA生成路由表的时候过滤掉路由,所以distribute在in方向虽然路由表消失了路由条目,但是LSA依然存在OSPF database中的
环境五:
Distribute还可以在out方向后边关联特定的协议,distribute在in方向是不可以关联协议的
R2上配置:
R2(config)#access-list 10 deny 4.4.4.0
R2(config)#router eigrp 100
R2(config-router)#redistribute rip metric 10000 1000 1 1 1
R2(config-router)#redistribute ospf 100 metric 10000 1000 1 1 1
R2 show rip database 是有从R1学习到1.1.1.0/24路由信息
R2 show ospf database 可以看到也有从R4学习到1.1.1.0/24路由信息
R2上查看路由表发现关于1.1.1.0/24是“O”标记,此时是正常的,RIP AD值120 OSPF AD值110
R3上查看路由表同样学习到了1.1.1.0/24路由信息
如果不做distribute过滤,R1和R4任意一台路由器down掉,R2和R3都可以访问1.1.1.0/24目的地
下边在R2上做distribute,只针对从RIP路由协议过来的1.1.1.0/24做过滤,其他方式学习到的一律放行
R2上配置:
R2(config)#access-list 10 deny 4.4.4.0
R2(config)#router eigrp 100
R2(config-router)#redistribute rip metric 10000 1000 1 1 1
R2(config-router)#redistribute ospf 100 metric 10000 1000 1 1 1
R2(config-router)#distribute-list 10 out rip
R3上查看路由表,还是有关于1.1.1.0/24路由信息,说明R2上配置是生效的
可以进一步验证R2的配置,将R2连接R4的ethernet 0/2 shutdown掉
R2(config)#interface ethernet 0/0
R2(config-if)#shutdown
R3上查看路由表,发现没有1.1.1.0/24路由条目
环境六:
使用distribute还可以解决双点双向redistribute次优路径及环路问题
看下图,R4将自身Loopback0接口宣告进RIP进程,R2和R3都互相学习到该路由信息
此时R2先做RIP到OSPF的redistribute动作,R4 Loopback0路由到了R1,R1传递给R3路由器。此时R3路由器因为先前从RIP进程R4邻居学习到了该路由条目,此时从两个邻居不同路由协议学习到去往相同目的地的路由信息,R3先比较AD值,结果发现OSPF的110 AD值要小于RIP的120 AD值,R3自然而然的选择从R1到4.4.4.0/24目的地。
此时是很奇怪的,R3产生了次优路径问题,明明可以从R4直接到目的地,为什么要从R1绕了一圈到目的地。
最关键的是,R3在想做RIP到OSPF的redistribute动作是失败的,因为R3关于4.4.4.0/24路由是“OE2”的而不是“R”的
在下边我们使用distribute来解决这个次优路径问题。
IP编制规则:10.xy.xy.x/24
,其中x是较小的路由器,y为较大的路由器。例如:R2和R4的编制:R2e0/1:10.24.24.2/24
,R4e/1:10.24.24.4/24
R2上配置:
R2(config)#router ospf 100
R2(config-router)#redistribute rip subnets
查看R3上路由表关于4.4.4.0/24路由是“OE2的”
R3上配置:
R3(config)#access-list 10 deny 4.4.4.0
R3(config)#access-list 10 permit any
R3(config-router)#distribute-list 10 in
查看R3上路由表关于4.4.4.0/24的路由变成了“R”的,此时R3在做RIP到OSPF的redistribute是完全没有问题的
R2上也要做和R3相同的动作,具体原因自己好好琢磨,哈哈
R2(config)#access-list 10 deny 4.4.4.0
R2(config)#access-list 10 permit any
R2(config-router)#distribute-list 10 in
总结:其实使用distribute来解决双点双向redistribute次有路径问题并不太适合,distribute是直接把路由过滤掉了,假设R3和R4相连接的链路故障了,那么R3就没有备用路径可以走了,下边可以试验下,我们把R3的ethernet0/0口shutdown掉
R3(config)#interface ethernet 0/0
R3(config-if)#shutdown