-
同OSPF和RIP相同使用network命令宣告路由,但BGP和OSPF和RIP不同的是BGP可以宣告自己路由表上任意一条路由,需要注意的是:BGP宣告的条目必须同本地路由表中的记录完全一致。
-
本地BGP表里存放着本设备所宣告的和所有从其他对等体出收到的路由信息,路由信息主要包括目标网段和掩码,还有各种属性,下面只展示了一部分属性
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 1.1.1.0/24 0.0.0.0 0 0 i
Network:目标网段和掩码 nexthop:下一跳IP地址,在EBGP关系间发送路由信息时,谁发给我,nexthop就是谁,由于1.1.1.0/24的路由信息是本地宣告,所以为0.0.0.0 MED:本地宣告到BGP中的路由会携带原协议的开销值,通过MED属性携带。 LocPrf、PreVal:这里先不用了解 Path:即AS-PATH属性,用于EBGP水平分割,记录该路由信息所经过的AS编号。AS号的添加,在EBGP邻居间发送路由时进行的,这里由于本地宣告,并没有显示AS号。 Ogn:起源属性:以什么方式进入BGP的,1.BGP宣告本地路由表中路由:i,2.本地路由表中IGP路由重发布到BGP协议:?,3.将本地路由表中EGP路由重发布到BGP协议:e,这里1.1.1.0/24是本地宣告,所以标:i *>:该路由的状态码: *:代表可用, BGP设备每收到一条路由信息,都会通过路由表查询检查其下一跳属性的可达性,如果下一跳的地址是可达的,则代表该路由可用,不可达则不可用,不可用的路由无法加表。 ’>’: 代表优选,当收到多条到达相同网段的路由信息时,BGP将会在其中根据路由属性选择最好的最为优选路由,只有优选的路由才会被加载到路由表中,并且传递给其他BGP对等体。不优选的则不传递,不加表。
R2收到路由信息也会发给它其他所有的对等体,由于BGP的AS-BY-AS特性,路由信息在IBGP间传递时,属性并不会发生改变,查看R3的BGP表发现1.1.10/24路由的状态码只有一个:i,说明它不可用,这是为什么?因为该路由信息的下一跳对于R3来说不可达,12.1.1.1属于R2的直连网段,R2并没有将它宣告在IGP中,所以该路由的状态为不可用,下一跳不可达则不可用。 状态码为 i ,代表该路由信息是从IBGP对等体处学来的路由。
虽然路径属性默认在AS内部传递时,不会自动修改,但可以手工修改
[r2]bgp 2 [r2-bgp]peer 3.3.3.3 next-hop-local --- 配置该命令后,本地会将发往 3.3.3.3对等体的路由的下一跳修改为本地
-
查看R4的BGP表时发现R4没有收到1.1.1.0/24这条路由,这是因为IBGP水平分割,从IBGP对等体处学到的路由不能传递给其他IBGP对等体,所以R3不能将从R2学到的路由信息发送给R1,这里我们让R2和R4间也建立IBGP关系,使R2直接将路由信息发送给R4。
[r2]bgp 2 [r2-bgp]peer 4.4.4.4 as-number 2 [r2-bgp]peer 4.4.4.4 connect-interface l [r2-bgp]peer 4.4.4.4 connect-interface LoopBack 0 [r2-bgp]peer 4.4.4.4 next-hop-local
[r4]bgp 2 [r4-bgp]peer 2.2.2.2 as-number 2 [r4-bgp]peer 2.2.2.2 connect-interface LoopBack 0 [r4-bgp]peer 2.2.2.2 next-hop-local --- 由于R4也存在EBGP对等体,所以R4需要将从EBGP对等体处学到的路由信息的下一跳修改为本地后再发送给R2。
BGP的路由悖论
-
将R5的环回宣告到BGP中,查看R4的BGP表
-
发现R4有R5的环回的路由信息,但该路由不可用,这是为什么?下一跳可达就应该是可用的,这是因为这里产生产生了一个逻辑悖论,R4是通过5.5.5.0/24的静态路由和R5建立对等体关系的,而此时R5又发送了一条5.5.5.0/24网段的路由信息给R4,这就是我和你建邻是为了学到可以和你建邻的路由。
-
由于逻辑悖论,该路由不可用也就不能传递,但虽然R4上有去往5.5.5.0/24网段的静态,但R4的其他邻居没有呀,所以需要将该路由变为可用且优,产生逻辑悖论的原因是本地用来建邻的静态路由和R5传来的路由网段是相同的,所以我们可用修改本地静态路由,将之修改为去往5.5.5.5/32的静态主机路由。
-
路由悖论产生的原因是因为建邻时采用环回接口建邻,写了一条静态路由指向对方,静态路由的优先级高于BGP学到的路由所以,BGP学到的路由不是最优解产生悖论
[r4]undo ip route-static 5.5.5.0 24 45.1.1.2
[r4]ip route-static 5.5.5.5 32 45.1.1.2
重发布 – 批量宣告
-
当通告的路由数量较大时,使用network逐条发布效率较低,则可以通过重发布的方法来批量发布路由
[r2]bgp 2 [r2-bgp]import-route ospf 1
BGP的MED
-
在BGP协议中进行宣告时,是宣告本地路由表中任意路由,不关注这些条目的产生方式;默认将携带本地到这些路由的cost值到BGP的路由条目中去;若本地将本地宣告的BGP路由传递给本地的EBGP邻居,将携带这些cost,便于本地的EBGP邻居所在AS内部设备选路,当然这些路由在进入其他AS时不会修改度量;
-
若本地通过IBGP邻居学习到了BGP路由,优且存在cost值,在本地将这些路由传递给本地的EBGP邻居时,将cost值归0,因为这些度量不是本地产生的。
BGP的路由聚合
自动聚合
自动聚合只能对重发布在BGP中的路由生效
-
华为设备中默认关闭了自动汇总,需要我们手动开启
[r1-bgp]summary automatic
-
查看R1的BGP表,发现本地BGP表依然存放着明细路由,但状态码前有一个s,s代表抑制,一旦路由前面的状态码中添加S标记,则代表该路由被抑制,将不再加标和传递。自动聚合完成后会自动生成一条指向汇总的空接口路由进行防环。
手动聚合
-
由于自动聚合的问题: 1,只能聚合到主类,不可控导致产生路由黑洞;2,只能对重发布的路由生效。所以我们更多的是采用手动聚合。在R1上关闭自动汇总,使用手动聚合。
[r1-bgp]aggregate 172.16.0.0 23
-
查看R2的BGP表,发现R2不仅收到了聚合后的路由信息,同时也受到了明细路由信息。这是由于手工聚合没有抑制明细路由,导致传递的路由条目没有减少,反而增加
[r4-bgp]aggregate 172.16.0.0 22 detail-suppressed # 在聚合路由的同时抑制所有明细路由
抑制策略
手工聚合不能自动抑制明细路由,需要我们手工配置,但是,因为BGP协议的特殊性,导致在一些环境下,往往不能将所有明细路由全部抑制,所以,我们在做BGP的聚合时,往往仅抑制一部分路由信息,而实现这个效果,需要用到suppress - Policy。
1,先抓取需要抑制的流量
[r4]ip ip-prefix bb permit 172.16.0.0 24
2,使用路由策略匹配流量
[r4]route-policy bb permit node 10
Info: New Sequence of this List.
[r4-route-policy]if-match ip-prefix bb
3.使用抑制策略进行调用
[r4-bgp]aggregate 172.16.0.0 22 suppress-policy bb
防止聚合后属性丢失
-
聚合后的路由器会将其他EBGP中学到的路由的path属性消除改为自己的path,因为聚合后的路由存在属性丢失的情况,所以,这样的汇总路由需要格外关注。
我们可以用通过激活AS_SET关键字,使汇总路由携带明细路由的AS_PATH属性。激活后可用看到汇总路由的path为{1 4},这代表着明细路由是来自AS:1和AS:2的,这样明细路由的所有原AS就不会接收这条聚合路由信息
Atomic-Aggregate及Aggrator
ATOMIC_AGGREGATE ---- 纯粹的预警属性,聚合路由将会携带(只有将所有明细路由全部抑制的汇总路由才会携带),意图是提醒该路由为聚合路由,可能存在属性丢失问题。 AGGRGATOR ---- 将会记录执行汇总路由器所在的AS号及RID。
BGP的反射器与联邦
-
由于IBGP水平分割,导致本地需要和所有本AS内部的BGP设备建立IBGP邻居关系;IBGP邻居关系的数量成指数上升,所以下面介绍另外两种打破水平分割的方式:反射器和联邦。
反射器
-
我们可以将一台IBGP设备配置成为路由反射器(RR),被配置为路由反射器的设备在一定条件下将从IBGP邻居处学到的BGP路由传给其他BGP邻居。
-
在我们指定一台设备成为路由反射器RR的同时,必须指定一个或者多个邻居成为他的客户,RR和客户之间构成的系统我们称为反射簇,每一个簇设定一个簇ID,簇ID为反射簇中RR的RID,其他没定义为客户的邻居被称为非客户。
[r3]bgp 2345
[r3]peer 2.2.2.2 reflect-client # 指定R3为RR,且R2为R3的客户,其他未指定的IBGP邻居为非客户
reflect反射
反射规则
-
如果路由反射器从自己客户处学来一条IBGP路由,则他将反射给自己所有的客户和非客户。
-
如果路由反射器从自己非客户处学来一条IBGP路由,则他将反射给自己所有的客户,但是不反射给非客户。非非不传。
-
当路由器在进行路由反射时,只反射自己BGP路由中最优的路由。
反射器中的防环属性
由于IBGP水平分割是用来防止AS内部路由环路,而路由反射器打破了IBGP水平分割,则将有可能出现路由环路,所以为了避免环路的出现,路由反射器在设计的时候,专门引入了两个属性,来避免环路从产生: Originator_ID(起源者ID)、Cluster_list(簇列表)
Originator_ID – 起源者ID
如果RR从IBGP邻居处学到的路由没有携带该属性,则将再该路由信息上添加该属性,谁发送给RR的路由信息,Originator_ID就是谁的RID,如果RR从IBGP邻居处学到的路由携带该属性,则不修改该属性。当一台设备收到的IBGP路由信息后,发现里面的Originator_ID是自己的RID,则不接受这条路由信息。
-
但只是使用起源者ID不能完全解决环路的问题,如下图中,虽然起源者不会接收回传的路由,但其他已拥有该路由的设备呢?所以还需要另一个属性帮助防环—Cluster_list(簇列表)。
Cluster_list – 簇列表
一个AS内部存在多次反射的话,那么,一定存在多个反射簇,则每个RR在放射路由信息的时候,会在路由信息中的簇列表属性中加入本地的RID。
-
如果收到的IBGP路由信息的Cluster_list中包括自己的RID则不接收该路由
注意: 这两个属性,只是用来在IBGP内部进行防环的,所以,当这些路由被传递到EBGP对等体时,将不携带这两属性。RR在进行路由反射时,除了会在路由信息中添加以上两个属性外,其他属性不变。
联邦
将一个AS划分为多个小AS,小AS间就可以使用EBGP路由传递规则,所以联邦就相当于大AS里的小AS,不过联邦EBGP关系之间仅继承EBGP之间路由传递的规则,但是不能像EBGP对等体一样修改路由属性,还需要遵守AS-BY-AS规则,是一种特殊的存在
[r3]bgp 64512 # 联邦内运行BGP的设备在运行BGP时需先指定联邦(小AS)号,以免后面忘记有联邦的存在 [r3-bgp]router-id 3.3.3.3 # 指定RID [r3-bgp]confederation id 2 # 声明自己的大AS号(真实所在的AS号) [r3-bgp]peer 1.1.1.1 as-number 64512 # 联邦成员建立IBGP邻居关系时使用小号 [r3-bgp]confederation peer-as 64513 # 需要建立联邦的EBGP对等体关系时,需要先声明对方的小号 [r3-bgp]peer 4.4.4.4 as-number 64513 [r3-bgp]peer 4.4.4.4 connect-interface LoopBack 0 [r3-bgp]peer 4.4.4.4 ebgp-max-hop 2 # 联邦间使用EBGP路由传递规则,所以,默认的TTL值1,使用环回建立时需修改
confederation联盟
联邦的防环
同反射器一样,打破了IBGP水平分割,有可能会造成环路,所以联邦也需要解决环路问题。联邦EBGP之间防环可以直接采用EBGP水平分割的机制来进行防环,直接在AS_PATH属性中增加联邦AS号来进行防环,只不过,联邦的AS号会使用括号括起来,来进行区分。
<r3>display bgp routing-table
BGP Local router ID is 172.16.1.1 Status codes: * - valid, > - best, d - damped, h - history, i - internal, s - suppressed, S - Stale Origin : i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 6 Network NextHop MED LocPrf PrefVal Path/Ogn
*>i 10.0.0.0/24 172.16.0.1 0 100 0 1i *>i 11.0.0.0/24 172.16.130.1 0 100 0 (64513) 3i *>i 12.1.1.0/24 172.16.0.1 0 100 0 i *>i 78.1.1.0/24 172.16.130.1 0 100 0 (64513)i *>i 172.16.0.0 172.16.0.1 100 0 ?
i 172.16.130.1 100 0 (64513)?