Bgp路由协议:
路由协议分为igp和egp。Igp是内部路由协议,应用于as内部。egp是是as间的路由协议。Bpg就是一个egp协议,是一个距离矢量路由协议。它在as内部用metric来描述链路的质量,而bgp是用链路的属性来描述as间链路的质量,它会描述到目的网络要穿越那些as。在bgp路由协议中,允许定义策略来控制数据包穿越那些as到达目的网络。
当数据包要穿越as时可以考虑采用bgp协议,一般应用与isp之间。当一个用户有多个网络出口连接多个isp但又不希望isp的数据经过自己的as到达另外一个as时,不采用bgp。当需要控制到达和发送的数据时也可以考虑采用bgp协议。
当一个as只有一个网络出口,带宽比较小或路由设备没有足够的内存不建议采用bgjp。在缺乏适当的技术支持,没有足够的技术支持的情况下也不建议使用bgp协议。
在eigrp和ospf协议中,协议数据的交换是通过ip包进行的,协议数据传输的可靠性是通过协议自己保证。在ripv1是通过广播来实现的,用udp520端口来传输。而bgp协议用tcp179端口来实现协议数据传输的可靠性保障,并且它是一个增量更新。它通过周期性的发送keepalive message包来判断tcp的连接是否正常。Bgp还有丰富的metric,它通过单个比较路径的属性来判断路径的质量。
Bgp的数据库由邻居表;转发表;路由表组成。在bgp协议中和rip和igrp协议一样转发的是路由信息。Bgp的邻居可以是直连的也可以是不直连的。
Bgp的数据类型由open ;keepalive;update;notification组成  。在open报文中包含了holdtime和bgp的router id。Update报文来更新路由信息。Notification用来探测error连接,并断开连接。
在bgp协议中只要两个路由器可以建立tcp连接就可以形成bgp邻居。不一定要直接连接。它的边界是链路。

 

 

    当属于不同的as的路由器形成的是ebgp邻居关系。Ebgp的邻居关系普通情况下要求是直连的。在上图中a;b和x;y就不能形成ebgp邻居关系。在特殊场合,不直连的路由器也可形成ebgp邻居关系。在as65500中,路由器abcd之间形成的是ibgp关系,ibgp关系的形成不需要直连,只要它们之间可以形成tcp连接就可以形成ibgp关系。

 

 

 
  区域as65102为as65101和as 65103 传输数据,在路由器a,b, e,f上跑了bgp协议,a,b之间和e,f是ebgp邻居关系,b,e之间是ibgp邻居关系。它们之间都通过tcp179端口来传递路由信息。在路由器c,d上只是传输bgp路由信息,它们看不懂这些信息,因为它们没有跑bgp协议。Bgp的路由协议信息的尺寸是很大的有时会达到几十兆,当ebgp协议的路由信息,向ibgp信息再发布的时候,会导致as65102区域中的低端路由器的崩溃。所以不能把egp的路由信息注入到igp路由协议中。但是当route a向route f宣告一条它学习到的路由10.0.0.0时,这条路由会先发到router b时,route b会向下跳路由器继续发送,当然它的下跳路由器看不懂它发来的数据包,路由信息数据会经过router e达到router f。当数据从router f到到目的网络10.0.0.0时,当数据到达router c和d时,就会被丢弃。这时只有在两个边界路由器上把路由再发布进ospf区域才能解决这个问题。这又牵涉到一个路由信息同步的问题,当一个路由器从它的ibgp邻居学习到一条路由时,只有当它再通过内部的igp路由协议同时学习到这条路由,它才可以使用这条路由。
在rip和igrp协议中的水平分割来实现的端口来实现的,也就是路由器从它的邻居的一个端口学来的路由信息不会再向这个端口发送回去。在bgp协议中是通过对路由器的水平分割来实现的。也就是路由器从它的邻居学来的bgp路由信息不会再向这个路由器发送回去。这就要求网络中的路由器是全互连的(不是物理网络的全互连),就是指定它们的邻居关系全互连。
Router :
Config#router bgp autonomous-system 启用bgp协议,这个自治系统号是经过申请得到的,不可以任意指定。在一个路由器上只能有一个路由器的实例,也就是一个路由器只能属于一个as。在eigrp的区域中一个路由器可以属于多个自治系统。
Config-router#neighbor {ip-address | peer-proup-name} remote-as autonomous-system指定bgp协议的邻居。Ip-address是和邻居路由器ip,remote-as是邻居所在的自制系统。指定ibgp邻居和ebgp邻居都是这条命令,它们的区别只是as号不同。指定ebgp邻居关系时,这个ip是和邻居路由器的直连端口地址;指定ibgp邻居时,可以是邻居路由器的任意端口的地址,只要能建立tcp会话就行,但是更推荐使用对方的环回口的地址,以确保邻居关系的建立。
Config-router#neighbor {ip-address |peer-group-name} shutdown 暂时关闭bgp邻居关系
Config-router#no neighbor {ip-address | peer-group-name} shutdown 恢复bgp邻居关系。

 

 

 
router b:
       Router bgp 65101
       Neighbor 10.1.1.2 remote-as 65101
       Router :
       Router bgp 65101
       Neighbor 192.168.1.1 remote-as 65102
       Neighbot 10.2.2.2 remote-as 65101
       Router c:
       Router bgp 65102
       Neighbor 192.168.1.2 remote 65101
当我们用邻居路由器的环回口的地址做为邻居的宣告地址,而邻居传输数据时采用的
是它的以太网端口的地址,这时邻居关系的建立就会出问题。在上例中router b向router a宣告邻居地址时是采用的10.1.1.2,它向router b传输数据时只能10.1.1.2的地址做为源地址,而不能采用192.168.1.2的地址做为源地址。

 

 

  
在上图中,当router a和roure d之间建立邻居关系时,它有可能10.1.1.1地址和d建立邻居关系,也有可能10.3.3.1的地址和d建立邻居关系。当网络正常连通时a的邻居的地址可以指定10.2.2.4,也可指定为10.4.4.4。假设指定的是10.2.2.4,当router b宕掉后,router再10.4.4.4的地址和router a通信时,就产生了问题,因为router a的邻居表中没有10.4.4.4的地址。这中情况下我们可以采右器的loopback地址做为它们通信的源地址。采用loopback地址作为源地址只要路由器之间还可以通信,它们就可建立邻居关系。
Config-router#neighbor {ip-address | peer-group-name } update-source interface-type interface-number 这条命令指定源地址,多用于ibgp邻居关系中。Ebgp邻居关系必须是直连的,而采用loopback后的邻居关系就不再是直连了。

 

 

                                    
Router b:
Router bgp 65101
Neighbor 172.16.1.1 remote-as 65100
Neighbor 3.3.3 remote-as 65101
Neighbor 3.3.3.3 update-source loopback 0
Router rigrp 1
Network 10.0.0.0
Network 2.0.0.0
Router c:
Router bgp 65101
Neighbor 192.168.1.1 remote-as 65102
Neighbor 2.2.2.2 remote-as 65101
Neighbor 2.2.2.2 update-source loolpback 0
Router eigrp 1
Network 10.0.0.0
Network 3.0.0.0
做了上述配置后就可实现ibgp区域的链路冗余。

 

 

 
上图是ebgp的loopback口的配置:
Router a:
Router bgp 65102
Neigfbor 1.1.1.1 remote-a 65101
Neighbor 1.1.1.1 update-source loopback 0
Neighbor 1.1.1.1 ebgp-multihop 2 缺省情况下ebgp邻居是直连的,因为采用了loopback口后,两个直连的路由器就变成不再直连所以要指定2跳到达邻居,如果中间还有一个路由器就要指定3跳。
Ip route 1.1.1.1 255.255.255.255 192.168.1.18
Ip route 1.1.1.1 255.255.255.255 192.168.1.34
Router b:
Router bgp 65101
Neigfbor 2.2.2.2 remote-a 65101
Neighbor 2.2.2.2 update-source loopback 0
Neighbor 2.2.2.2 ebgp-multihop 2
Ip route 2.2.2.2 255.255.255.255 192.168.1.17
Ip route 2.2.2.2 255.255.255.255 192.168.1.33
 

 

 

Bgp是一个as-by-as的路由协议。在bgp路由协议中,它的下跳的含义不是下跳路由,而是下跳的as地址,在上图中router a向router b宣告自己的地址10.10.10.3,而路由器再向router c宣告时同样宣告下跳地址是10.10.10.3,而不是router b的地址172.20.10.1.router b不仅要宣告下跳地址10.10.10.3,还要宣告给router c怎么到达10.10.10.3的网络,否则会产生下跳不可达的现象。可以让b向c宣告10.10.10.3的网络时强制把c的下跳改成b,也就是当一个路由器把自己学习到的路由宣告给自己的邻居时,强制把这条信息的下跳地址改成自己。
 

 

 

在ibgp网络中传输路由信息时,它的下跳是不变的,当一个路由信息穿越多个as时,它的下跳地址才会发生改变。在上图中,当172.16.0.0的路由信息从as64520区域向as64500中的router b传递时,它的下跳地址是10.10.10.3,当router b向router c宣告这条信息时下跳地址依然是10.10.10.3,当这条信息由router c向as64600中的router d宣告时下跳地址就变成了10.10.10.2。
Config-router #neighbor {ip-address | peer-group-name} next-hop-self 在向邻居宣告信息时,强制把所有的更新的下跳地址改成自己的地址。Ip-address是邻居的ip

 

 


router b:
router bgp 65101
neighbor 172.16.1.1 remote-as 65100
neighbor 3.3.3.3 remote-ad 65101 update-source loopback 0
neighbor 3.3.3.3 next-hop-self
router eigrp 1
network 10.0.0.0
network 2.0.0.0                  
―――――――――――――――――――――――――――――――――――――
当一个路由器的多个邻居有相同的参数时,可以定义一个组,来针对组做参数的调整。
Config-router#neighbor [peer-group-name] peer-group 创建对等组
Config-router#neighbor [ip-address] peer-group [peer-group-name]定义一个参数模板,对等体中的邻居拥有相同的outbound策略,可以有不同的inbound策略,

 

 

Router c without a peer group:
Router bgp 65100
Neighbor 192.168.24.1 remote-as 65100
Neighbor 192.168.24.1 update-source loopback 0
Neighbor 192.168.24.1 next-hop-self
Neighbor 192.168.24.1 distribute-list 20 out
Neighbor 192.168.25.1 remote-as 65100
Neighbor 192.168.25.1 update-source loopback 0
Neighbor 192.168.25.1 next-hop-self
Neighbor 192.168.25.1 distribute-list 20 out
Neighbor 192.168.26.1 remote-as 65100
Neighbor 192.168.26.1 update-source loopback 0
Neighbor 192.168.26.1 next-hop-self
Neighbor 192.168.26.1 distribute-list 20 out
―――――――――――――――――――――――――――――――――
Router c using a peer group:
Route bgp 65100
Neighbor internal peer-group
Neighbor internal remote-0as 65100
Neighbor internal update-source loopback 0
Neighbor internal next-hop-self
Neighbor internal diatribrut-list 20 out
Neighbor 192.168.24.1 peer-group internal
Neighbor 192.168.25.1 peer-group internal
Neighbor 192.168.26.1 peer-group internal
――――――――――――――――――――――――――――――――――――
Config-router #nerwork network-number [mask network-mask]
这条命令告诉bgp协议宣告那些网络,而表示如何宣告网络。Bgp协议的自动汇总是缺省打开的。如果不携带掩码,向网络中宣告的是基于类的标准网段。只有在路由器的路由表中存在一条路由表时,这条命令才有效。用这条命令向外发布一条路由表中不存在的路由信息是无效的。这条路由信息是通过其他协议学习到的,或是直连的。
当bgp网络中的路由器没有构成全互连的网络时,通过ebgp学习到的路由,必须再通过ibgp邻居学习到后,这条路由才会被使用。Bgp协议的同步缺省是开启的。当一个bgp协议中的路由器构成全互连后,可以把自动同步关闭。
Config-ruoter # no synchronization 关闭自动同步。

 

 

 

 
Routedr b:
Config#router bgp 65000
Config-router# neighbor 10.1.1.2 remote-as 64520
Config-router#neighbor 192.168.2.2 remote-as 65000
Config-router#neighbor 192.168.2.2 update-source loopbadk 0
Config-router#neighbor 192.168.2.2 next-hope-self
Config-router#network 172.16.10.0 mask 255.255.255.0
Config-router#network 192.168.1.0
Config-router#network 192.168.3.0
Config-router#no synchronization
Bgp协议中路由器的状态:
Idle:router查找路由表,看是否有存在到达邻居的可行路由,若没有则为idle状态。
Connect:router发现可行路由,并完成三次握手。
Open sent:发送open message。
Open confirm:收到一致参数,建立会话。
Established:建立连接,开始交换路由信息。
Debug ip bgp events 启用bgp调试
Show ip bgp summary查看bgp的连接状态。
当路由器发出一个open报文后,它会等待回应。它可能在idle和active之间循环。邻居可能不知道如何发送回它的回应信息。可能是下列原因之一:
邻居的地址是错误的。
邻居没有和这个路由器建立邻居关系。
邻居没有到源地址的可用路由。
――――――――――――――――――――――――――――――――――――
当策略的acl,timers,attributes发生改变时,bgp会话必须reset。策略的改变会立即生效,下次的路由宣告或接收的报文将应用新的策略,但不影响修改之前传输的信息。这个策略应用到整个网络中可能需要很长时间。要让网络中的路由器直接丢弃掉原来的路由信息,必须reset它们的邻居关系。
Clear ip bgp *
Reset所有的bgp连接,丢弃全部的bgp转发表,会话从established转变为idle状态,所有的信息必须重新学习。
Clear ip bgp [ip-address]
Reset指定的邻居关系。
Clear ip bgp {*|address} [soft out]
不reset邻居关系,原来的路由信息也不丢弃。只是要求邻居按照当前的策略把路由信息重新传输。推荐对outbound策略修改后使用,对inbound策略不 产生作用。
Config-router#neighbor [ip-address] soft-reconfiguration inbound
Clear ip bgp {* | address} [soft in]必须先保存待reset邻居的宣告的信息。再应用这条信息。
Show ip bgp neighbor 查看bgp邻居状态
Clear ip bgp *  reset邻居关系
Debug ip bgp updates 查看update报文
―――――――――――――――――――――――――――――――――――――
路由汇总:
以bgpv4为版本来介绍。可以在任意的路由器上做汇总,bgpv4是无类的路由协议,支持变长子网掩码。用掩码最长的路由信息来匹配路由。Bgp ;ripv1 ;ripv2;igrp;eigrp执行自动的路由汇总。其中bgp;ripv2;eigtp的路由汇总可以关闭。
Config-router#network network-number [mask network-mask] 把路由信息宣告到bgp路由协议中,用此命令做汇总的话,具体路由和汇总路由都会在路由表中显示出来,并且待宣告的路由必须在路由表中存在。
Config#ip route prefix mask null0  汇总路由的出口是一个空端口。因为汇总的路的端口是经过汇总的,它只是告诉要到目的网络的数据包可以通过我到达,具体到哪个端口需要经过查找路由表得到下跳端口。这条路由必须存在于路由表中。如果路由经过eigrp或ospf汇总,那么这条汇总路由可以向bgp宣告它的网络号和掩码。
Example:
 

 

 

Router c:
Router bgp 64100
Network 192.168.24.0 mask 255.255.252.0
Neighbor 172.16.2.1 remote-as 64200
Ip route 192.168.24.0 255.255.252.0 null 0
―――――――――――――――――――――――――――――――――――――
Config-router#aggregate-address ip-address mask [summary-only] [as-set]创建一条路由并向邻居宣告,它只宣告汇总后的路由。As-set在汇总路由后面加上汇总路由经过的as汇总和具体路由。此命令会自动产生一个汇总路由,并指向空端口。
Example:

 

 

Router bgp 64100
Network 192.168.24.0
Network 192.168.25.0
Network 192.168.26.0
Network 192.168.27.0
Neighbor 172.16.2.1 remote-as 64200
Aggregate-address 192.168.24.0 255.255.255.252.0 summary-only 只宣告汇总后的路由。
―――――――――――――――――――――――――――――――――――――
Bgp的属性:
AS-path,可以避免路由环路的产生。它描述了路由在网络中传输时经过的as,如果在一个路由中出现了两个一样的自治系统号,这条路由可能产生了环路。
Next-hop属性:
用于保证bgp的下跳可达。

 

 

在上图中router a向router b 宣告172.16.0.0自己可达,并把自己的10.10.10.10.3的地址作为router b的下跳。Router b继续向router c宣告这条信息,宣告过程中下跳地址保持不变,而router c的数据能否到达这个网络,取决于它能否到达10.10.10.0的网络。
origin属性:
在bgp协议中任何一条路由要到bgp的路由表中都必须通过一定的方式被注入到bgp协议中。在igp的协议中通常用network命令把它的路由信息注入到bgp的路由表中。Egp的路由通过再发布到达bgp路由表中,它被标记为e。其他的igp和静态路由被注入进去时被标记为?(表示incomplete)。
Local preference属性:
控制在as内部,数据通过哪个路由器离开自己的as。

 

 

 

 

 
在上图中,数据要离开as64520时有两条路径,可以通过设置不同的local preference来控制数据的流向。Router a的本地优先属性为200,router b的本地优先属性是150,他们会把这个值向as中的ibgp邻居宣告。Ibgp邻居会选择把数据发送到等级高的路由器,这个值只在as内部宣告。
Multiexit discriminator(MED)属性:

 

 

MED属性只在ebgp邻居之间传递。在上图中到达router a有两条路径,可以是router b也可以是router c,as65500的管理员可以为router b和router c的定义不同的med值来控制数据的流向。它是一个可选的属性,是不可传递的。当一个属性不可传递时,在传输的过程中,如果一个路由器不能识别这个属性,它将被丢弃。
Weight属性:

 

 

 

 

是cisco产品的私有属性。在上图中数据要离开router a,它有两条路径,可以通过在router a上指定router b和c的weight来影响数据的流向。数据会选择weight比较大的链路离开。这个属性不会传给任何路由器。
Bgp 在选择路由时,首先看路由同步完成没有,还必须有有效的下跳。再比较weight值(权重可在不同的接口上配置不同的权重),其次是local preference;再次是nexthop;再比较as path(少者优先);再就是origin code(igp<egp<incomeplete);优先选择igp;再比较med(它是从其他的路由器传过来的,它可以影响本地数据的流向,小者优先),再比较ebgp path和ibgp path,优先选择ebgp学习到的;再找个最近的ibgp的邻居;最后再比较学习到的时间;如果还比较不出则比较router id,小的优先。
―――――――――――――――――――――――――――――――――――――
通过修改本地优先来影响路径的选择;
Config-router#bgp default local-preference value
改变缺省的本地优先值,向as中的所有ibgp路由器宣告。位于ibgp之间的对话。用于指定最好的路径离开as到达另外的as。缺省值是100。数值高的优先。

 

 

 

 

在上图中将优先选择router b离开本地as。

 

 

在as65001中,30%的流量流向172.24.0.0 ,20%的流量流向172.30.0.0,10%的流量172.16.0.0,所有上述流量中50%的流量流向172.20.50.1,剩余的10%的流量192.168.28.1,利用应用一条策略来影响数据的流向。本地优先是不能直接配置的,那样会导致流量都从一个方向出去。可以在路由器a上配置所有到172.30.0.0的网络中的本地优先设400,这样可以把到172.24.0.0的20%的流量的出口指定为router a。实现流量的平衡。配置如下:
Router a:
Router bgp 65001
Neighbor 2.2.2.2 remote-as 65001
Neighbor 3.3.3.3 remote-as 65001
Neighbor 2.2.2.2 remote-as 65001 update-source loopback 0
Neighbor 2.2.2.2 remote-as 65001 update-source loopbakd 0
Neighbor 192,168.28.1 remote-as 65002
Neighbor 192.,168.28.1 router-map local_pref in
Router-map local_pref permit 10
Match ip address 65
Set local-preference 400
Router-map local_pref permit 20 想当于acl中的permit any,如果没有这条语句,会导致只向ibgp邻居宣告本地优先为400的信息。
Access-list 65 permit 172.30.0.0 0.0.255.255
―――――――――――――――――――――――――――――――――――――
Med值是传输给ebgp邻居的。

 

 

Router a:
Router bgp 65001
Neighbor 2.2.2.2 remote-as 65001
Neighbor 3.3.3.3 remote-as 65001
Neighbor 2.2.2.2 update-source loopback 0
Neighbor 2.2.2.2 update-source loopback 0
Neighbor 192.168.28.1 remote-as 65004
Neighbor 192.168.28.1 route-map med_65004 out
Router-map med_65004 permit 10
Match ip address 66
Set metric 100
Route-map med_65004 permit 100
Set metric 200
Access-list 66 permit 192.168.25.0 0.0.0.255
Access-list 66 permit 192.168.26.0 0.0.0.255
Router b:
Router bgp 65001
Neighbor 1.1.1.1 remote-as 65001
Neighbor 3.3.3.3 remote-as 65001
neighbor 1.1.1.1 update-source loopback 0
neighbor 3.3.3.3 update-source loopback 0
neighbor 172.20.50.1 route-map med_65004 out
route-map med_65004 permit 10
match ip address 66
set metric 100
route-map med_65004 permit 100
set metric 200
access-list 66 permit 192.168.24.0 0.0.0.255
―――――――――――――――――――――――――――――――――――――
作为一个有多个网络出口的用户,在网络出口上可以配置缺省路由。缺省路由对路由器的内存和cpu占用很少,但它的缺点是选择的路由可能不是最优化的路由,igp邻居是根据自己距离网络出口的metric来选择路由的。解决这种问题的办法可以网用户的as里注入部分bgp路由,实现网络流量的优化(一定要做路由的过滤)。当然当数据从isp返回时选择的入口有isp来决定。可以通过配置med来影响数据的流入方向。也可以做全发布,但是要求as中的路由器有足够大的内存,足够强劲的cpu,和足够的网络带宽。

 

 

Router a:
Router bgp 64500
Network 10.0.0.0
Neighbor 192.168.1.1 remote-as 65000
Neighbor 192.168.1.1 distribute-list 7 out(text omitted)
Access-list 7 permit 10.0.0.0 0.255.255.255
Router b:
Router bgp 64500
Network 10.0.0.0
Neighbor 172.16.1.1 remote-as 64900
Neighbor 172.16.1.1 distribute-list 7 out
Access-list 7 permit 10.0.0.0 0.255.255.255
在上述的配置中,route a和router b只向其他的as宣告10.0.0.0 的网络。它知道其他as的网络但不向它们宣告。这就防止了router x的数据穿越as64500到达64900。