如果你准备又增加一台BGP路由器,并把它与另一个对等互联伙伴相连,那么你的网络并不会得到多少改善,除非你自动系统的内部网关协议(IGP)知道面对这种情况该做些什么。这时有几种做法,而其中之一是严重错误的。你不能简单的把所有的Internet路由信息都发送给给自治系统内运行内部网关协议的路由器并指望得到最好的结果。实际上这样做是很可笑的,因为通常OSPF的运算过程会让你的路由器死机。同样,你必须让一台边界路由器收到的路由信息也让另一台边界路由器收到,但是除非两台边界路由器都采用BGP协议,否则信息就会丢失。

  解决办法是在你的AS内所有的边界路由器之间建立一个内部BGP对等互联。传统上明智的做法是,你的网络要包含一个运行iBGP的核心网络(或者叫骨干网),并且在内网采用的IGP协议(OSPF或其它)路由中指定一条缺省路由。只要内部网关协议将数据包传送给主干网络,那里的路由器就能选择最佳的出口策略。

  主干网络可能十分复杂,并且BGP中提供的AS-Path属性也不足以保证不会导致路由环回。这表示iBGP不会广播任何它从对等互联伙伴那里获得的路由信息,这似乎令iBGP无用武之地?并不尽然:这一限制意味着每台iBGP路由器都必须与其它所有iBGP路由器建立对等互联关系。这也被称为一个全网状(full mesh)结构,但实现起来同样困难重重。

  当网络变得足够庞大时,每增添一台BGP/iBGP会话路由器都意味着你必须为之与其它每一台路由器都建立一个连接。为解决这些问题,我们的装备库为你提供了几样很便利的工具:路由反射器(route reflector)和联盟(confederation)。

  谢天谢地,这些术语都可以望文生义。一个路由联盟其实就是一个单独的内部AS,其概念是将内部AS分解成几个小系统,并且利用外部BGP把它们连接在一起。每个内部小系统仍然是全网状(full mesh)结构,不过它的规模是你可以控制的程序。要实现路由联盟,配置起来相当麻烦,所以大多数人都选择另一种方案:路由反射器,这是一台iBGP路由器,它可以向其它iBGP路由器广播路由信息。具体做法是先创建几个iBGP路由器簇(cluster),然后把它们与一台路由反射器相连。


  同步是BGP协议中一个重要的概念,特别是当你处于一个在对等互联伙伴之间传送数据流的主干AS时。假如我们有两台路由器连接两个AS对等互联伙伴,同时建立了一个多跳(multi-hop)iBGP网络,那么我们就拥有两台路由器(A和B),它们与其它AS采用EBGP相连,而在它们之间采用iBGP,不过是间接的。如果一条关于如何到达路由器A相连的对等网络的路由信息被发送到iBGP网状结构中,并且随后路由器B又把它发送给B的伙伴网络,那么就会产生路由黑洞,为什么呢?这是因为路由器B另一侧的对等互联伙伴会立刻开始向A另一侧的伙伴发送数据,但是我们的iBGP可能还没有收敛,一些内部iBGP路由器也许还不知道通往A另一侧AS的路径。

  当你在一台路由器上启用了同步,就意味着在用到那些路由信息之前,IGP(这种情况下是iBGP)和EGP必须拥有同样的信息。通道AS的基本设计原则是,你只有在能够向某条路由发送数据时,才能广播这条信息。

  现在有几种不同的方法可以实现iBGP和同步。我们可以打开路由器上的同步选项,等候IGP获取通往目的地的路由信息,然后再向对等互联伙伴广播。另一种方法是只要采用全网状结构,这样iBGP收敛就不成问题。显然,当网络主干必须升级时是不会发生这种事的:它会提供诸如路由反射器等工具来打破iBGP的全网状结构。

  如果实现不了同步,那么真正的解决方案是利用路由递归(recursion)。递归路由查找程序利用BGP的next-hop属性,真正找到一条不同的路由。IGP可以通过目的网络而不是AS-Path来决定向何处发送信息。即使iBGP还未收敛,路由器仍然知道如何到达目的网络,因为路由信息存在于发送它的路由器中,而这台路由器知道下一跳(next-hop)在哪里。

  我们知道路由并不仅仅取决于协议,因为我们是操作者,我们有理由改变运作方式。由于AS-Path长度是用于选择路由的唯一外部因素,所以BGP受到了一定限制。然而这也表示BGP还有几种属性可以让你改变数据包所挑选的路径而无需插手BGP路由选择算法,你还应该知道BGP的另外几种属性。

  MED,即多出口标识(MultiExit Discriminator),用于指示首选路径。MED本质上是一个weight值,值最低的路径获胜。如果你有两种路径选择,那么这是一种很简单的方法可以确定你更喜欢的入口点。MED属性告诉对等互联伙伴应该采用哪条路径,并且只发送给与你直接对等互联的伙伴。

  LOCAL_PREF属性则告知你的iBGP伙伴通往另一个AS的最佳路径,它可以挑选出两条在BGP看来差不多的路径中更好的一条。

  总而言之,iBGP其实就是以另一种方法应用的BGP。我们希望关于iBGP的讨论已经帮你完全理解了BGP以及AS之间的路由原理。

  小结

  iBGP是内部使用的BGP,用以在多个BGP边界路由器之间交换BGP信息。

  iBGP路由器必须以全网状结构相连,以防止路由环回。

  如果使用了路由反射器或路由联盟,那么iBGP网状结构可能遭遇收敛问题,而导致路由黑洞。

转载于:https://blog.51cto.com/xtjjj/200668