BGP是一种高级的距离矢量型路由协议,主要靠属性做选路,tcp端口号为179。更新方式为增量更新,如果路由不发生变动就永远不会传递。BGP的AS号范围是1-65535,其中公有1-64511,私有54512-65534。IGP的路由协议侧重点主要是路由的自动发现和计算,而BGP是在于路由的控制和选择上。
所有的路由协议都有状态机,BGP的状态机如下:
Idle state
Connect state
Active state
Open send state
Open confire state
Establish state
BGP的邻居关系分为两种,EBGP和IBGP
IBGP邻居之间不能中转路由,不能改变路由的下一跳,当一个路由器接收到EBGP路由时,传递给IBGP邻居不改变下一跳,传递给EBGP邻居时改变下一跳。
BGP的邻居关系图如下:
A路由最远只能传递到R3路由器上,因为对于R2来说,A是一条EBGP路由,可以传递,但是R3路由器会认为A是IBGP路由,不会中转。
B路由最远能传递到R3、R1上
C路由可以传递到R1、R2、R4、R5上
IBGP之所以会有这样的问题是因为BGP主要是研究域间路由(EBGP)的传递。
根本原因是:1、BGP没有为IBGP邻居之间设置算法(所以可能会出环)2、防环的最佳方案就是不中转路由,不改变下一跳,但是会有两个后果,第一是域外路由的下一跳不可达,需要手工更改下一跳,第二是全互联建邻的问题,可以使用反射(本质是中转路由,并且不改变下一跳,主要就是解决这个问题)或联邦来解决。
BGP的属性(就像LSA对于OSPF)共11种,绝大多数都可以携带在数据包中,11种属性可以分为4类:
1、 公认必尊:
所有BGP路由器必须识别遵守的有origin,as_path,next_hop
2、 公认可尊:
所有路由器都能识别但是不一定要遵守local_pref,atomic_aggregate
3、 可选传递:
不是所有的BGP路由器都能识别,但是所有的BGP都能传递(例如mpls种rt值,只有配置了mpls_才能识别rt)aggregator,community
4、 可选非传递:
不是所有的路由器都能被识别,不能识别的BGP路由器就丢弃它,MED(metirc),originator_id,cluster_id,weight
其中weight为cisco私有属性,不能传递给任何邻居,只能在自己路由器上使用,用于选路的一条属性,当到达某一个网段有多条路可以使用是,选择weight值最高的,越大越优,本路由器产生的是32768,别人的为0,因为不能传递
Origin起源:0表示宣告(i),1表示EBGP(E),3表示其它手段得到(重发布,符号是?),多重功能,本质是识别路由时怎么来的,但也可以做选路,越小越优(i优于E优于?)
AS path:路径的记录(本质上为水平分割,有时需要关闭),有三个用途记录经历的AS、防环(不接收有自己AS号的路由)、选路
当出现如下图环境时需要关闭AS path
A路由从AS2-AS4-AS1,到达AS3时需要再次经过AS4,此时AS4将不允许A路由传到AS3,所以需要关闭,方法有两种,如下
1、Neighbor XXXX allowas-in允许和具有自己相同的AS的路由进入本AS
2、Neighbor XXXX as-override把具有和其它AS相同AS号的路由放入这个AS
Local-pref专门用来做选路,最佳适用于出口在多个路由器上,默认值为100,越大越优,local的范围是一个AS的内部,只能在一个IBGP之间传递,如图
C路由要到达baidu可以从A或B走,此时用local-pref做选路最合适
MED:默认为0,可以传给EBGP(只能传一个),越小越优(影响别人,在入方向做MED可以影响自己)和local连用适合去回一直的场景,只有同一个AS传递过来的MED才有可比性,不同的AS会直接跳过比其它的属性,如图AS1区域和AS2区域的MED不能比较
但Bgp always-compare-med开启后可以比较不同AS的MED值
aggregator(cisco)用来通告是谁做的汇总,是route-id通告出来的
community团体属性(进行路由标记),可读性好(路由数量太大有标记号区分)
分为4个子属性,帮助BGP做过滤:
1、 internet默认属性,可以给任何BGP发送
2、 no_export只能在一个AS内传递,也可以在一个联邦内传递(例:百度同时把联通和电信的路由收进来,当联通和电信之间的线断掉,百度就会成为中转站,所以在联通和电信都做no_export就可以避免称为中转站)
3、 no_advertise不在IBGP邻居间传递
4、 local_as不向任何EBGP邻居发送包括联邦的EBGP邻居
标准和扩展community
标准是普通路由可以设置的团体公有和私有
扩展时mpls种vrf路由传递定义的
Show ip bgp community可以查看做community标记的路由
originator_id是路由发起者产生的一个32比特的值,该值是本地路由发起者的RID,如果路由发起者从属性上看到自己的RID,说明有环路就忽略
cluster_list是路由进过反射器簇ID的一个序号。如果反射器在属性里看到自己的簇ID就说明有环路,忽略
一旦中转就会出环,用这两种属性防环,一共只有两种环路,一个属性防一种,如图
R1和R2为反射器,R3为客户端
R3路由器将A路由发送到R1反射给R2,R2也是反射器继续反射给R3,此时出现环路,使用originator_id防环
增加一个R4也是反射器
R3将A路由传给R1,R1传给R4,R4传给R2,R2传给R1,此时出现环路,使用cluster_lis防环
Atomic_aggregate:
用来警告下游路由器路由聚合后产生的路由路径丢失。
BGP支持向BGP邻居传递重叠路由可以选择多种方式
BGP汇总后明细路由和汇总路由都在
1.明细和粗略的都公布 aggregate-address 10.0.0.0 255.0.0.0
2.只公布明细 aggregate-address 10.0.0.0 255.0.0.0 suppress-map
3.只公布没有重叠的as-path aggregate-address 10.0.0.0 255.0.0.0 summary-only as-set 继承AS path属性
4.聚合后公布聚合后的路由 aggregate-address 10.0.0.0 255.0.0.0 summary-only
5.明细和粗略都不公布
第八条以后,支持的最大负载均衡条目数必须是1,如果改为大于1,那么从第9条开始负载均衡
local-as配置 AS欺骗,修改自己路由器的对外通告AS号
router bgp 3
neighbor 1.1.1.1 local-as 10强行改成10
AS1当有某些特殊原因AS改为10时,其它邻居没变,这时可以使用local-as 1,依旧和其它邻居维持邻居关系
BGP默认路由
1、 精确下发默认路由给特定的邻居
Neighbor 3.3.3.3 default-originate
2、 粗放式下发,没有具体的邻居,发给所有的邻居
Default-information originate
条件:全局必须有一条默认、路由表必须有一条默认,然后network0.0.0.0或重发布
过滤:
1、 neighbor X.X.X.X route-map XX in/out
可以根据前缀、属性、更新地址进行路由过滤或者更改路由属性
2、 distribute-list X in/out
全局路由表,根据前缀、更新地址过滤路由
3、 neighbor X.X.X.X prefix-list XX in/out
只能根据前缀过滤(更多做的是根据某个邻居过滤某条路由,比第2个精确)
可以使用route-map过滤下一跳是谁的路由,针对下一跳进行过滤
Match ip next-hop