Professional Documents
Culture Documents
AS 之间,提供路由信息交换、控制路由传播和选择最优路由;基于路径属性/
矢量来衡量每一条路由的优先级,也被称为高级距离矢量协议和路径矢量协
议。
Marker(标记):16 字节,固定为 1。
Length(长度):两字节无符号整数,指定了消息的全长,包括头部。
Type(类型):1 字节,指示报文类型,如 OPEN、UPDATE 报文等 。
1 – Open
2 – Update
3 – Notification
4 – Keepalive
X – Route-refresh
报文类型:
1、Open:负责和对等体建立邻居关系。
2、KeepAlive:在对等体之间周期性地发送,实时维护邻居关系。
3、Update:被用来在 BGP 对等体之间传递可达的路由信息及其各种路由属性。
4、Notification:当 BGP Speaker 检测到错误的时候,就发送该消息给对等
体。
5、Route-refresh:用来通知对等体自己支持路由刷新能力。
报文封装:Open 报文(只发送一次)
报文封装:KeepAlive 报文
KeepAlive 报文的组成只包括一个 BGP 报头;缺省情况下,发送 KeepAlive 的
时间间隔为 60 秒,Hold Time 是 180 秒。每次从邻居处接收到 KeepAlive 报
文将重置 Hold Time 定时器,如果 Hold Time 定时器超时,就认为对等体 Down
掉。
报文封装:Update 报文
Error code:错误码,表示报头内容有问题,每个不同的错误都使用唯一的代
码表示,而每一个错误码都可以拥有一个或多个错误子码,但如果某些错误码
并不存在错误子码的话,则该错误子码字段以全 0 表示。
Error subcode:错误子代码,详细内容参照 TCP/IP 协议卷一。
报文封装:Route-refresh 报文
1、AFI(Address Family Identifier):地址族标识符(2 字节)。
2、Res(Reserved field):保留区域(1 字节),发送方应将其设置为 0,接
收方应当忽略该区域的信息。
3、SAFI(Subsequent Address Family Identifier):子地址族标识符(8 字
节);在所有 BGP 路由器使能 Route-refresh 能力的情况下,如果 BGP 的入口
路由策略发生了变化,本地 BGP 路由器会向对等体发布 Route-refresh 消息,
收到此消息的对等体会将其路由信息重新发给本地 BGP 路由器。这样,可以在
不中断 BGP 连接的情况下,对 BGP 路由表进行动态刷新,并应用新的路由策
略。
BGP 状态机:
BGP 路由信息处理过程:
1、邻居表:对等体邻居清单列表。
2、Adj-RIB-In:对等体宣告给本地 Speaker 的未处理的路由信息库。
3、BGP 表 (Loc-RIB):BGP 路由信息库,包括本地 BGP Speaker 选择的路由信
息。
4、IP 路由表 (IP-RIB):全局路由信息库,包括所有 IP 路由信息。
5、Adj-RIB-Out:本地 Speaker 宣告给指定对等体的路由信息库。
BGP 的路由传递:发送
1.1、通过 network 或重分发将 IGP 路由转换并通告给 BGP,BGP 通过汇总或聚
合产生新的 BGP 路由并加入自身的 BGP 表,此时该路由可能携带两种下一跳属
性;
1.2、直连路由和静态路由(不包含下一跳)的下一跳属性默认为 0.0.0.0;该
路由可以发送给所有的 EBGP 和 IBGP 邻居。
1.3、当原 IGP 路由已经包含了下一跳时,BGP 会继承原 IGP 的路由下一跳;该
路由可以发送给除了下一跳地址对应的路由器以外的所有 EBGP 和 IBGP 邻居。
注:在始发路由器上发送 BGP 路由时,路由器会强制性将路由下一跳改写成自
身的更新源地址(直连接口/环回口地址),然后发送给所有 EBGP 和 IBGP 邻
居。
BGP 的路由传递:接收
1.1、当路由器接收到一条 EBGP 路由时,先检查路由的 AS-pah 属性,如果没有
包含自身的 AS 号,则可以接收并发送给所有 EBGP 和 IBGP 邻居。
2.1、当路由器接收到一条 IBGP 路由时,先检查路由的下一跳是否可达且是否
满足同步原则,满足则可以接收并发送给其他 EBGP 邻居,不能发送给 IBGP 邻
居。
2.2、下一跳可达:路由器在 AS 之间发送 EBGP 路由时,会先将路由的下一跳改
写成自身的更新源地址(直连接口/环回口地址);路由器在 AS 内将路由发送
给 IBGP 邻居时,默认不会修改路由的下一跳,这样会导致 IBGP 邻居接收到该
路由时,该路由的更新源地址往往是不可达的。
解决方案:手工开启 BGP 的 next-hop-self 特性,这样路由器在 AS 内将路由发
送给 IBGP 邻居时,会强制性将路由的下一跳改写成自身的更新源地址(直连接
口/环回口地址)。
2.3、同步原则:路由器接收到 IBGP 路由时,会检查该路由是否也可以通过 IGP
接收到,可以则接收并转发给 EBGP 邻居;否则就丢包了,用来防止 BGP 数据层
面的路由黑洞;12.3 以后的版本默认关闭该特性;可以优化的解决方案如下:
解决方案 1:AS 内的路由器之间实现全互联(成本太大,不可用)。
解决方案 2:AS 内所有路由器都运行 BGP,建立 BGP 的全互联邻居关系(不可
用)。
解决方案 3:边界路由器将 BGP 路由重分发进 IGP(BGP 路由太多,不好操
控)。
解决方案 4:边界路由器之间建立 GRE tunnel(点到点)或 DMVPN(点到多
点)。
解决方案 5:使用多协议标签交换技术 MPLS(公有协议,配置简单)。
路径属性和路径矢量:
公认属性 well-known:由 IETF 规定所有厂商都必须支持的
--公认强制属性 mandatory:
1、AS 路径/AS-path:描述一条 BGP 路由从产生达到目的地一共经过了多少个
AS,当路由器收到一条 EBGP 路由时,就会检查该路由的 AS-path 是否包含自身
的 AS 号,不包含就可以接收,主要用于防止路由环路;AS-path 默认值为 10,
在路由表中,新添加的 AS-path 在左边,旧添加的 AS-path 在右边。
注:在多个私有 AS 互联的环境中,使用 MPLS-VPN 的技术:AS over ride(PE-
CE)和 allowas-in(CE-PE)可以设置路由表中出现在本地 AS 的次数上限。
2、下一跳属性/next-hop:
2.1、在始发路由器上发送 BGP 路由时,路由器会强制性将路由下一跳改写成自
身的更新源地址(直连接口/环回口地址),然后发送给所有 EBGP 和 IBGP 邻
居。
2.2、从 EBGP 邻居学到的一条路由,传递给自己的 EBGP 邻居时,下一跳一定会
改变为自身连接邻居的更新源地址。
2.3、从 EBGP 邻居学到的一条路由,传递给自己的 IBGP 邻居时,下一跳不变,
仍为上游 EBGP 邻居的更新源地址。
2.4、从 IBGP 邻居学到的一条路由,传递给自己的 EBGP 邻居时,下一跳改变为
自身连接邻居的更新源地址。
2.5、在 MA 网络中,如果去往上游邻居的下一跳地址和去往下游邻居的下一跳
地址在同一个子网段内,在传递路由时,会将下一跳地址改写为去往上游邻居
的下一跳地址(特例,现网环境中不存在)。
2.6、路由反射器在反射路由时,不会修改路由的下一跳属性。
--公认自由属性 discretionary:
1、本地优先权/local preference:专门用来操控路由选路的,影响一条路由
去往外网应该从哪个出口出去;默认值 100,EBGP 路由默认不携带该属
性,IBGP 路由会携带该属性;
2、原子聚合属性/atomic aggregate:描述一条 BGP 路由是否是聚合路由;
可选属性 optional:厂家私有添加的属性
-可选传递属性 transitive:对本地不能识别的属性仍会继续转发给邻居
---完整属性 complete:发送路由时不对路由做任何修改
---不完整属性 incomplete/partial:发送路由时告诉下游路由器自身不能识
别
1、聚合者/aggregator:使用聚合路由的路由器 Router ID 告诉下游接收者该
路由是由哪一台路由器聚合的
2、团体属性/community:默认各个厂商不开启该属性,需手工添加
2.1、标准团体属性/Standard,功能类似于“TAG”,表示 xxyy 或 xx:yy
no-advertise:邻居接收该属性路由,只会加入本地路由表不会转发给邻居
No-export:邻居接收该属性路由,可以发送给 IBGP 邻居和联邦内的 EBGP 邻居
Local-AS:邻居接收该属性路由,只会发送给 IBGP 邻居
注:路由发送时,默认不携带该属性,需每台路由器手工指定 send-community
2.2、扩展团体属性/extended,用于 MPLS-VPN 环境中的“RT”
-可选非传递属地 non-transitive:对本地不能识别的属性直接丢弃
1、权重属性/weight:功能类似于 IGP 中的管理距离,在路由发送时会将该属
性值置为 0,只有在本地接收时才会携带该属性加入路由表;取值范围 0-
65535,本地产生的路由 weight 默认值 32768;非本地产生的路由 weight 默认
值0
3、多出口鉴别器/MED:专门用来操控路由选路的,影响一条外网路由应该从哪
个入口进入;当前所有厂商都能识别;默认值 0(最优先),发送 EBGP 路由会
将 MED 置为 0,发送 IBGP 路由时不会修改该 MED 值;
BGP 的十三条选路原则和路由操控:
1、比较权重属性 weight 的大小,以大为优
注:路由操控时入方向将权重属性值改大,一般不建议修改
2、比较本地优先权 local preference 的大小,以大为优(*)
注:路由操控时入/出方向改大,不建议边界路由器之间建立 IBGP 邻居
3、本地始发路由优于外部传递的 IBGP 路由和 EBGP 路由
4、比较 AS-path 属性的长短,以短为优
注:进行路由操控时入/出方向修改,建议添加多条 AS-path 而不修改 AS-path
属性;优选添加自身的 AS 号,其次添加私有 AS 号;不建议修改
5、比较路由起源属性代码,“i”>“e”>“?”
注:不建议修改
6、比较路由的 MED 属性的大小,以小为优(*)
注:进行路由操控时在出方向改大,只有通过相同邻居 AS 路由器收到相同的
BGP 路由时才会比较 MED 值,开启 BGP always compare med 可以无视该条件;
当邻居路由器发送的路由没有携带 MED 值,开启 BGP bestpath med missing as
worst,路由器就会给该条路由设置一个最大度量值(42 亿)。
7、EBGP 路由优于 IBGP 路由,无视管理距离
8、比较更新源地址到达本地的 IGP 度量值大小,以小为优
9、如果存在多条等价路径,就可以加入路由表进行负载均衡
注:前提是开启了负载均衡的功能,参加负载均衡的路由要么都是汇总路由要
么都不是汇总路由(汇总路由优于非汇总路由)且路由的 AS-path 属性完全一
致。
10、当部署了路由反射器 RR,比较集群列表 cluster-list 的长度,以短为优
11、当部署了路由反射器 RR,比较 originator-id 的大小,以小为优
12、比较邻居路由器的 BGP 路由器 ID 的大小,以小为优
13、比较邻居路由器的更新源地址的大小,以小为优
前提条件:只有有资格打“>”的路由,如 EBGP 路由和部分 IBGP 路由(满足
下一跳可达和同步原则)才可以进行路由选路;利用十三条选路原则一定会选
出一条最优路径,BGP 默认不支持负载均衡,需手工开启,
R1(router-config)#maximum-paths(1-32)ibgp(1-32)
BGP 的特性:
BGP 本身不会产生任何路由,只有当把 IGP 路由、静态或直连路由通过 network
通告转换或者重分发进 BGP,然后由 BGP 汇总或聚合才能产生新的 BGP 路由;
1.1、Network:支持精确 network 和主类 network,一般使用前者,通告进 BGP
的路由会继承原 IGP 路由的下一跳地址,用 MED 属性继承原有路由的 metric
值。
1.2、重分发:重分发进来的 IGP 路由,BGP 会继承原有路由的下一跳地址,也
会用 MED 属性继承原有路由的 metric 值。
注:将 BGP 重分发进 IGP 时,默认只有 EBGP 路由和自身产生 BGP 路由能够重分
发进入,IBGP 路由则不可以被重分发进入。
BGP 的重置:修改路由策略时、路由发生变化时
2.1、软重置/软清:请求对方将我需要的路由进行重新发送或者针对邻居请求
的路由重新发送,建议使用。
Router# clear ip bgp * soft (in/out)
Router# clear bgp ipv4 unnicast * soft (in/out)
2.2、硬重置/硬清:重新建立 TCP 的三次握手和邻居,重新发送所有路由;慎
重操作!!!
Router# clear ip bgp *(1.1.1.1)/clear bgp ipv4 unnicast
*(1.1.1.1)
Router#show bgp ipv4 unnicast neighbor 1.1.1.1 advertised-routes(发
送)
Router#show bgp ipv4 unnicast neighbor 1.1.1.1 received-routes(接
收)
注:思科默认不缓存从邻居接收到的路由,需要使用命令设置 neighbor
1.1.1.1 soft-reconfiguration inbound
自动汇总/聚合:auto-summary
3.1、Network 主类路由时,当开启了自动汇总,如果本地路由表中是有对应的
明细路由,会将明细路由抑制,产生汇总路由,路由的下一跳和 MED 属性为全 0
3.2、路由重分发时,当开启了自动汇总,一律会将该路由汇总成主类路由,路
由的下一跳和 MED 属性全为 0
注:当通告超网路由时,需要本地路由表中存在该路由;自动汇总不会对精确
network 产生影响;由于自动汇总容易产生路由黑洞,12.X 以后的版本默认关
闭。
手工汇总/聚合:summary
3.3、Router(config)#ip route 192.168.0.0 255.255.254.0 null 0
Router(config)#network 192.168.0.0 mask 255.255.254.0
注:该汇总路由由于缺少原子聚合属性,后续不好再使用路由策略。
3.4、Router(config)#network 192.168.0.0 mask 255.255.255.0
Router(config)#network 192.168.1.0 mask 255.255.255.0
Router(router-config)#aggregate-address 192.168.0.0 255.255.254.0
注:一个 network 只能通告一条路由;建议在始发路由器的 BGP 进程中汇总:
默认既会发送明细路由,也会发送汇总路由且汇总路由携带原子聚合属性,后
面接:
Summary-only:抑制明细路由,发送汇总路由。
Route-map:设置汇总路由携带的属性。
Attribute-map:功能等同于 route-map,设置汇总路由携带的属性。
Advertise-map:结合 route-map,当明细路由携带相关的属性时才可以被汇
总。
Suppress-map:结合 route-map,发送汇总路由时,抑制部分不需要发送的明
细路由,发送部分需要的明细路由。
AS-set:当在非始发路由器上进行路由汇总时,默认汇总路由不会继承原路由
的下一跳、MED 和 AS-path 属性,后面加 AS-set 参数,非始发路由器产生的汇
总路由就可以携带原路由的 AS-path 属性,用来防止超长距离的路由黑洞。
条件路由注入:从接收到的汇总路由中在本地注入其中的部分明细路由;
Bgp inject-map route-map(name)exist-map route-map(name)后面加
[copy-attributes]表示明细路由会携带汇总路由的属性。
6.1、BGP 路由重分发
将 BGP 路 由 重 分 发 进 其 他 路 由 协 议 , 默 认 只 能 将 EBGP 路 由 重 分 发 其 他 协
议,IBGP 路由不能重分发进其他协议,需要在 BGP 进程工修改参数来将 IBGP 路
由重分发进其他协议:bgp redistribute-internal
7.1、BGP 的 backdoor 特性
8.1、BGP 的 AS 号伪装