BGP综述
 
BGP是一种管理性质的路由协议,用IGP我们已经可以实现网络的互通,而BGP是在此基础上制定的一种规则,关注的是策略和可扩展性。
 
从宏观上,BGP关心的是AS,而不是AS内的某一台Router。因此我们称BGP是一种路径矢量协议,其中路径就是指的AS_PATH,既路由所经过的AS,而类似于距离矢量IGP的机制,BGP的路由也是通过邻居来进行通告的。而所谓的策略,也往往就是在<路由通告>这个环节上做文章。
 
考虑到复杂的策略和庞大的路由表,BGP希望网络尽量的保持稳定,而其本身对拓扑变化的反应也很迟钝。IGP虽然对网络拓扑变化敏感,但频繁的变动,加之周期刷新的特性使其不具有BGP这般的扩展能力,所以较IGP而言,BGP更能胜任域间路由(inter-domain)。
 
在IGP中我们往往不建议汇总,因为IGP路由条目不多而且路由器的性能可以保证转发质量。但BGP的路由表是 Internet 级别的,汇总可以有效的缓解路由器硬件的压力,另外一个好处就是增强了稳定性,因为当汇总网段中的一条明细路由,对应的链路发生故障时,路由表不用因此而发生变动。
 
简单来讲BGP的工作流程:
 
1. 先建立邻接关系
2. 由某个源将路由注入到BGP
3. BGP邻居间相互通告路由,注入路由表
 
使用BGP的情形:
 
1. 在多个AS间传输数据
2. 两AS间存在多条路径 
3. 需要做路由策略和选择
 
不使用BGP的情形:
 
1. 两AS间只有一条线相连(用缺省路由就好)
2. 路由性能差,不能承载如此多的BGP信息
3. 两AS间的链路带宽太小 & 不会用BGP(这是最无奈的)

 
BGP邻居
 
BGP Peer = BGP Neighbor,分为eBGP邻居和iBGP邻居。
 
iBGP邻居在一个AS内,不必直连,但默认要求形成Full-mesh的逻辑拓扑,原因是BGP特有的水平分割:1台iBGP路由器从1个iBGP邻居接收到的路由信息不会通告给其他的iBGP邻居。但是Full-Mesh会造成没有必要的带宽占用,所以比较常见的做法是建立路由反射器。
 
eBGP邻居分属不同的AS,原则上要求直连,因为默认发给eBGP邻居的Update数据包TTL为1,所以当我们用Loopback用Update-Source的时候,往往会出现邻居不可达的现象,要修改TTL才行。
 
在BGP中router-id无足轻重,其选举过程和OSPF一样,不过建议手动指定。最关键是Neighbor的那个IP地址,这个IP地址必须是一个可达的接口地址,当我在一台路由器上(比如R1)敲入:neighbor 2.2.2.2 remote-as 10 ,那么这时R1就是在期待着和2.2.2.2这个接口建立TCP连接,而如果是别的接口发过来的连接请求,就不会理会。TCP连接无法建立,Open数据包交换不了,也就无法形成邻居。
 
重点:Neighbor命令定义了和哪些接口建立TCP连接,一般为了实现高可用性,我们用Loopback口建立邻居。这样即使物理接口失效,如果还有路由可以连通的话,TCP依然可以保持,不过代价是前期工作(也就是敲的命令)比较多。
 
如果邻居状态一直卡在Active,说明TCP连接还没有建立起来,在Lab中有时会比较寸的弄一条扩展ACL来阻断TCP连接,对此要十分小心。
 
Example:      (Lo:1.1.1.1) R1  12.1.1.1------------------12.1.1.2  R2 (Lo:2.2.2.2)
 
R1: neighbor 2.2.2.2 remote-as 10                  R2: neighbor  1.1.1.1 remote-as 10
 
这样肯定无法形成邻居,因为R1在等待和2.2.2.2这个接口建立TCP连接,而R2在没有指定源的前提下默认是以12.1.1.2作为源发送连接回应的。解决方法就是设定Update-Source
 
R1: neighbor  2.2.2.2  remote-as  10               R2: neighbor  1.1.1.1 remote-as 10
           neighbor  2.2.2.2  update-source lo0                   neighbor  1.1.1.1  update-source lo0
 
以上为建立iBGP邻居,如果是eBGP邻居话还要考虑TTL的问题,解决方案是修改TTL
 
R1: neighbor  2.2.2.2  remote-as  20               R2: neighbor  1.1.1.1 remote-as 10
           neighbor  2.2.2.2  update-source lo0                   neighbor  1.1.1.1  update-source lo0
           neighbor  2.2.2.2  ebgp-multihop 255                 neighbor  1.1.1.1  ebgp-multihop 255
 
BGP使用四类基本消息:

1)Open:用来建立邻接关系和交换基本参数。
2)Keepalive:用来维持邻接关系。
3)Update:用来交换路由信息。
4)Notification:当BGP发生错误时使用,会导致邻接关系重置
 
 
BGP汇总
 
BGP手动汇总命令组合:network summary-address mask
                                             ip  route  ip-address  mask  null 0
 
因为network一个汇总地址,路由表中并没有,要使其出现用静态路由就可以很好的完成任务。network命令可以加关键字summary-only,这样在BGP表中就只有汇总路由,否则是明细和汇总路由并存。
 
Null 0是路由器的伪接口,不能配IP也不能封装,且总是UP的,该接口收到的任何数据都会丢弃,从不接收和转发。ip  route  ip-address  mask  null 0 的意思是匹配这条路由的数据包就粉碎掉。

PS:在开了auto-summary的前提下,且路由表中有子网的信息,通告(network)主类网络是不带子网掩码的,而在关闭auto-summary的前提下,通告的路由信息会与路由表进行完全匹配。
 
 
BGP同步
 
iBGP同步的概念:作为一台iBGP Router,得到一条iBGP邻居通告的路由,在该条目没有同样通过IGP学习到以前,不会放进路由表,也不会通告给eBGP邻居。
 
iBGP同步是一个陈旧的特性,cisco已经在IOS中默认关闭同步,而juniper压根就没同步这个概念。同步的设计思想是将传递、收敛、防环路等任务交给IGP去做,好处是快、稳、无环、无黑洞。但现实中已经不做这种实现,因为同步带来的缺点巨大,无法弥补:传递开销巨大,网络抖动过于频繁。也就是说,宁可环路也不可能启用同步机制。
 
在以前,关闭同步的同时又要保证无环路,采取的措施一来是将BGP重发布进IGP,这样会使IGP路由器不堪重负;二来是将AS中的iBGP路由器形成Full-Mesh,这样当一个AS中有很多iBGP路由器时,管理工作会是个挑战。
 
目前我们比较合理的解决方案是利用路由反射器和联盟实现iBGP全互联的要求。所以现在当发现一条路由在BGP表中而不可用,IGP同步的问题就不用再去考虑了,重点放在下一跳是否可达上。