关于BGP同步和路由反射

每次写文章最痛苦的事莫过于文章标题,我比较喜欢把遇到的问题从头到尾描述清楚(在我能力之内的),其中必会涉及大量知识,没有哪点知识是独立的,知识之必然存在联系,这样一环扣一环要阐述的就会很多,而显得没有中心,文章的好坏应在于价值,价值的体现会淹没所有的弊端。不怕您笑话,我语文成绩相当有水平,一般都在100的黄金分割处徘徊,话说到此其实我的文章不是没有主线,而是主线藏的太深了,一般人的思维不足以体会到,因为“一般人”的语文都是从初高中的老师嘴里学到的,思想被束缚了,而我成长在大地上阳光下,“一般人”的思维也是可以理解的,应试教育的成果。
本文写给菜鸟,也博高手一笑!
(请看过此文和看出问题的高手拍砖,请即使指出错误所在,以免给更多的人误导,谢谢)

好了又费话了半天,下面进入主题吧,BGP居于所有动态路由协议之上,学好BGP看回头看IGP协议,就有种居高临下的感觉。而笔者体会这种快感时,被BGP和OSPF虐了N次。
下面进入正题:
首先给出一些涉及的知识:
1.路由反射规则
 1)如果更新分组来自EBGP邻居,则将它公布给所有邻居(IBGP,EBGP,RRC)//注RRC:路由反射客户端
 2)如果更新分组来自IBGP邻居,则将它公布给EBGP邻居,和RRC。(仅不通告给IBGP邻居)
 3)如果更新分组来自RRC,则将它公布给其他RRC、IBGP和EBGP(所有邻居)
2.同步规则
同步是指IGP协议的路由表和BGP表同步。
打开同步会有三种“限制”(此词用的不准确):
 1)从IBGP学来的路由更新不会加入到IP路由表中(当且仅当关闭同步)。
 2)从IBGP学来的路由存在BGP表中,如某条从IBGP学来的路由,不存在IP路由表中,则BGP认为这条路由没有同步。
(注意,即使同步了BGP也不会把此条路由加入路由表代替那条IGP路由条目,当且仅当关闭同步时BGP才会这么做,且如果在有IGP的情况下,关了同步,也不会在IP路由表中看到此BGP路由条目,因为内部BGP的管理距离太大)
 3)如果某条从IBGP学来的路由没有同步,则不会将此路由通告给其EBGP邻居
(由于水平分割原则,不管同步与否肯定不会通告给IBGP邻居,除非作反射)。

(其实同步就是用来避免非全部运行BGP的AS中,路由黑洞的问题,详细说就是,由BGP通告生成的条目,在没有运行BGP的路由器上是没有的,且到达目的地又要经过这台没有运行BGP的路由,所以路由在此就断了,运行BGP的路由器在不同步的情况下,向外通告此路由也是没有意义的)

以上同步规则是总结于目前比较常见的路由交换教材中。
但笔者有一个发现,打开同步时还有一种限制,实验拓朴如下:
10.1.1.0/24          10.2.2.0/24            10.3.3.0/24         10.4.4.0/24
       |                          |                             |                           |
     R1–s0/0—-s0/0– R2–s0/1—–s0/1– R3–s0/0—-s0/0–R4

|–bgp 100—|            |————-bgp 200————————-|
                                  |——————eigrp 100———————|

在上图中路由器名上方的网段为BGP通告的网段
Peer 关系为 R1-R2-R3-R4
可以看出R1-R2是EBGP邻居,R2-R3-R4是IBGP邻居,所有路由器均打开同步

跟据BGP水平分割原则从IBGP学到的路由不会传给他的另外一个IBGP邻居(当然了,环路就是传来传去传出来的吗),那么R4自然就学不到R2通告给R3的10.2.2.0/24了。那么为了解决水平分割带来的路由通告问题,必须要保正AS中所有IBGP之间全互连,这将占用大量系统开消,一个比较折中的方案就是做“路由反射”。此例中应在R3打入以下命令:neighbor R4 route-reflector-client 从而将R4指定为Client端,R3就会以路由反射规则运行。

但笔者实验过程中发现并不是这样,如将R4配为Client端以后,R2将一条路由更新发给R3,R3应按路由反射规则2通告给R4,但要实验此目的必须有这样一个前题:在R3上要反射的路由必须同IGP同步才对其进行反射。开始我有点不解,后来想想的确应该这样做,因为如果不同步,即使反射给R4,R4也得等到与IGP同步才对此条路由进行相应操作(主要是通告给其EBGP邻居),与其这样倒不如,在R3上进行必要的设计,从而使此条路由在未同步前,不所射给RRC和EBGP。总结一下为:

 4)如果作为反射器的路由器学到某条从IBGP学来的路由没有同步,反射器不会把他通告给他的RRC。

到此笔者要阐述的内容差不多就完了,下面作一此不必要的解释

()内的内容比较细节,不建议BGP新手看,否则可能没理解BGP反而更乱了。
细心的朋友可能看到了,本文实验拓朴比较特殊,AS200中的路由器全部运行了BGP,要实现互通,在所有AS200中的路由器关闭同步就行,且不用运行IGP,因本文是为了说明同步问题,所以关闭了同步,为了使BGP通告的路由下一跳可达又运行了IGP。
至于IGP为什么用EIGRP,又有的说了,以至于可以再写一篇文章了,但为了节约时候只作大概说明:
其实刚开始笔者是用OSPF作为IGP的,可是发生了一件其怪的事,就是BGP通告的路由,已经由OSFP加入了路由表,比如是10.2.2.0/24,可是用show ip bgp 10.2.2.0确显示not synchronized(等了N长时候也不变),笔者认为这是OSFP细节程度过高,生成的路由表不被BGP认同,为了证明这一点,笔者在R3 加了一条静态路由 ip route 10.2.2.0 255.255.255.0 next-hop 到路由表中。OSPF对应的路由表立即没了,过了一会BGP将这条路由标记为synchronized。为了更有权威性,笔者再说一个例子,这个实验中10.X.X.X/24是配在F1/0口的,此前笔者是将这个网段用loopback口做的,在OSPF中通告 了 24位掩码,其他路由器的OSPF计算的路由确是类似这样的
10.0.0.0/32 is subnetted, 1 subnets
10.2.2.0 [110/10] via 192.168.1.1, 00:08:50
我明明是通告的10.2.2.0/24,到其他路由器确是这样了,BGP认为不同步。而用EIGRP则是
10.0.0.0/24
10.2.2.0 [110/10] via 192.168.1.1, 00:08:50
BGP认为同步了。
思索了许久想起华为一个OSPF教程中提到了一点东西
1类LSA在描述自已的连接情况的时候还有四种类型
1)  STUBNET
2)  Transit NET
3)  Point to Point
4)  Point to multi-Point
SPF算法在计算时以STUBNET为结束,做为一条完整路由加入路由表。由于路由表是自已计算的,可能为不同于EIGRP真接通告路由表。
在我现在的知识程度来说也只能这么解释了。

(请高手拍砖吧)

发表评论

电子邮件地址不会被公开。 必填项已用*标注


Verify Code   If you cannot see the CheckCode image,please refresh the page again!