通过对比发现以下几个问题
问题1:在R1上,对于23.0.0.0/24网段应该是RIP内部的路由,这里却以OSPF的外部路由形式学习到了。在R3上也有问题1存在,2.2.2.0/24和12.0.0.0/24本也应该是通过RIP学习到的
问题2:在R4上,去往2.2.2.0/24网段的应该是有2个吓一跳出口的,通过R1和R3进行负载均衡的这里只学习到下一跳是124.0.0.1,通过R1走的一条路由
在这里,分析下这2个问题出现的原因
我们知道RIP的管理距离是120,OSPF的管理距离是110,所以相对来说,RIP的管理距离要比OSPF的要高,路由器会优先选择管理距离比较低的那一个。
而这里出现路由条目混乱的原因正式由于这个管理距离产生的。
我们分析下路由通告的走向:
首先,在配置路由重发布之前
R1通过RIP学习到了2.2.2.0/24,12.0.0.0/24,23.0.0.0/24这三条路由,在R3上同样通过RIP学到了这3条路由
然后配置了路由重分布,事情就变得有点不一样了。。。。
先分析下R3上的问题
我先是在R1上双向重发布了RIP和OSPF的路由。这样一来,R1就将上述3条路由通过OSPF type2,也就是在路由表上看到的OE2从F0/0通告了出去,然后R3和R4接收到了这条路由信息(OSPF中应该说是同步了数据库。。。这里为了形象点就这么说吧。。。),然后R3就开始犯傻了,因为上述3条路由它既从RIP中学习到,又从OSPF中学习到,然后一对比管理距离,发现OSPF比RIP的要小,于是就选择了通过OSPF学到的那一条,抛弃了RIP。。。。
R1上也是同样的道理
再分析下R4上的负载均衡的问题,罪魁祸首其实还是和R1,R2同样的
先看下2.2.2.0/24这条路由,在OSPF中,由于我是先在R1上做的双向重发布。于是这条路由是在R1上通过OSPF中通告了出去,R4自然也学习到了这条路由。而在R3上也学习到这条路由后,通过对比管理距离,将RIP中学习到的2.2.2.0/24给抛弃了,于是R3上把这条路由通告出去是已R1上学习到的通告出去的,这条路由的下一跳是R1,所以R4只收到了下一跳是R1的路由。
可能说的有点乱,也可以这么理解,R3自己认为去往2.2.2.0/24的路由下一跳是R1,那么,OSPF数据库同步机制,R4上对于这条路由的下一跳也应该是R1
这样的路由重分布导致了路由的混乱和环路,我们要通过路由的修剪来对网络进行优化和改善
解决方案:
1:使用发布列表,列表中要写每条需要过滤的路由,比较麻烦
针对上述的环境,我这里通过发布列表的方法来实现路由的修剪
首先先定义访问控制列表,将中RIP的3条路由抓取出来
R1(config)#ip access-list standard DenyFromO2R #在做访问控制列表的时候尽量使用基于命名的访问控制列表,在ACL多的时候,用名字比较好区分,这里这个名字意识是阻止从OSPF到RIP的条目
R1(config-std-nacl)#deny 12.0.0.0 0.0.0.255
R1(config-std-nacl)#deny 23.0.0.0 0.0.0.255
R1(config-std-nacl)#deny 2.2.2.0 0.0.0.255
R1(config-std-nacl)#permit any
然后进入到OSPF中
R1(config)#router rip
R1(config-router)#distribute-list DenyFromO2R in fastEthernet 0/0 #上述中的原因在这里,这条命令定义了在OSPF下重发布修剪的规则,将ACL定义的3条路由阻止从OSPF重发布出去。这里要注意的是:在OSPF中使用发布列表的话,是不允许使用OUT,只能使用in。
在R3中同样做好这样的配置
R3(config)#ip access-list standard DenyFromO2R
R3(config-std-nacl)#deny 12.0.0.0 0.0.0.255
R3(config-std-nacl)#deny 23.0.0.0 0.0.0.255
R3(config-std-nacl)#deny 2.2.2.0 0.0.0.255
R3(config-std-nacl)#permit any
R3(config)#router rip
R3(config-router)#distribute-list DenyFromR2O in fastEthernet 0/0
OK
再来看看路由表的情况
R1的路由表
R2的路由表
R3的路由表
R4的路由表
可以看到,现在的路由是正常了,而且R1去往124.0.0.0/24的路由和R4去往2.2.2.0/24的路由也实现了负载均衡