【HCIE-R&S 天梯路】BGP

BGP(TCP封装 端口号:xxx → 179)

网络设备之间

使用范围

邻居建立

路由发布

IGP内部网关协议

相互信任

统一管理

AS内部

自动发现

自动发布

BGP边界网关协议

相互不信任

不统一管理

AS之间

Peer指定

network

import-route

BGP是一种矢量路径协议:

        BGP以AS作为拓扑节点(IGP以路由器作为拓扑节点)

  • BGP可工作在非直连邻居之间

        TCP主动方port:any → 被动方port:179

  • BGP路由不周期性更新,只发送增量更新和触发性更新

eBGP:不同AS之间的BGP       防环:AS_PATH

iBGP:同一AS内部的BGP        防环:iBGP水平分割

Router-ID

32位,IPv4地址格式

手工配置 > LoopBack > 接口IP

  • Router-ID在Open报文中携带
  • Router-ID全网唯一
  • RR反射路由时,  Originator_ID =始发路由器的RID

                                    Cluster-id=RR的RID

路由通告规则

前提:仅通告BGP协议内的最优路由 > *

1.        从EBGP对等体学到的路由,通告给IBGP、EBGP

2.        IBGP水平分割:  从IBGP对等体学到的路由,

                                        不会通告给其他IBGP对等体

                                        也不能引入IGP协议中(IGP协议仅引入eBGP路由)

3.        BGP同步规则(关闭且无法开启):  路由器从自己的IBGP对等体学习到BGP路由时, 只有又从IGP协议学习到相同路由,才会通告给EBGP对等体

4.        增量更新(仅更新变化的路由)

关于第一条:

只有当一个BGP路由器有≥2个EBGP邻居时,才会将EBGP发来的路由再重新通告回去

例如这个图上,只有R1有2个EBGP邻居

        R1会将R3通告来的3.3.3.3/32路由重新通告给R3

        R1会将R2通告来的2.2.2.2/32、4.4.4.4/32、5.5.5.5/32路由重新通告给R2

然后再因为AS_Path问题,R3、R2拒收这些路由

而在其他路由器上,并不会将EBGP通过来的路由再通告回去。

BGP需要关注的问题

由于BGP以AS作为节点,且可以建立非直连邻居。需要关注以下几点:

  1. iBGP水平分割
  2. eBGP最大跳数问题
  3. Next_Hop可达性问题
  4. 更新源接口问题Connect-interface
  5. 路由黑洞问题

iBGP水平分割带来的问题

由于iBGP水平分割规则(从iBGP邻居收到的路由不会再通告给iBGP邻居),造成BGP路由无法通过iBGP邻居接收

R3无法收到4.0.0.0/8路由

解决办法:

  1. 全互联iBGP邻居         (R1-R3建立iBGP邻居)
  2. 路由反射器                  (R2配置成RR反射路由)
  3. 联邦
  • RR和联邦是解决AS内全互联的两种方式(使AS内达到IBGP全互联的效果,且IBGP邻居数不至于过多)
  • 全互联的iBGP需要更多的TCP连接数n(n-1)/2,若AS内有10个BGP路由器则需要45个连接数,极大得消耗CPU资源,一般不会采用。
  • 路由反射器和联邦旨在减少IBGP邻居关系,并解决水平分割问题

BGP路由黑洞问题

R1将1.0.0.0/8发布到了AS 34567,由于AS 34567内部运行OSPF,R7学到这条路由,又发布给R2。此时若R2访问1.0.0.0/8网段,首先访问R7。R7收到数据包后,知道BGP下一跳应该访问R3,于是从OSPF学到下一跳访问R4。R4收到数据包后,由于没有1.0.0.0/8路由,直接丢包。(R5、R6也会有同样问题)

解决BGP路由黑洞问题有以下方法:

1.        开启BGP同步规则(华为默认关闭,且不可开启):

R从IBGP对等体学到的路由,只有同时从IGP协议(静态不算)也学到这条路由,才会通告给EBGP对等体

  • R7不通告1.0.0.0/8给R2,除非从OSPF也学到了这条路由

2.        AS 34567内iBGP全互联

3.        R3将1.0.0.0/8这条BGP路由引入OSPF

4.        MPLS

  • 如果采用方式3,假设R2上有路由2.0.0.0/8。此时在R3上,会有1.0.0.0/8、2.0.0.0/8两条BGP路由,如果此时[R3-ospf] import-route bgp,只会引入1.0.0.0而不会引入2.0.0.0(IBGP水平分割扩展)

        ∴        还需要[R7-ospf] import-route bgp,R1-R2才可互通

ebgp-max-hop问题

EBGP发送的Open报文,默认TTL=1

因此,在使用非直连接口建立EBGP邻居时,需要 [R-bgp]  peer x.x.x.x ebgp-max-hop x

  • ebgp-max-hop是修改TTL

        GTSM是检查TTL在不在合法范围

  • ebgp-max-hop仅是针对Open报文的TTL,影响邻居关系建立

        GTSM是针对所有BGP报文的TTL

connect-interface问题

BGP默认使用物理接口(路由可达的出接口)建立邻居关系

  • connect-interface是Update报文的更新源接口IP

IPv4,建议

1.        使用直连接口(默认),起eBGP邻居(不用修改ebgp-max-hop)

           [R1] peer 12.0.0.2 as-number xxx

           [R2] peer 12.0.0.1 as-number xxx

2.        使用环回口地址,起iBGP邻居(稳定,如果接口down只要IP可达,邻居还在)

           [R1] peer 2.2.2.2 as-number xxx

                  peer 2.2.2.2 connect-interface LoopBack0

           [R2] peer 1.1.1.1 as-number xxx

                  peer 1.1.1.1 connect-interface LoopBack0

  • 如果R1-R2间多条物理链路,使用loopback建立ibgp邻居还可以实现负载分担

  • 如果不写更新源,则是12.0.0.1→2.2.2.2和12.0.0.2→1.1.1.1。两个TCP连接都无法启用。
  • 如果同时使用两种方式,则建立的是2个邻居关系

IPv6,建议

EBGP邻居:在直连接口配置全球单播地址

IBGP邻居:使用Loopback地址,并指定connect-interface=Loopback地址

  • 还需要    [R-bgp]  ipv6-family unicast

peer xxxx enable

  1. (不建议)如果物理接口上没有IPv6全球单播地址,可不配置connect-interface(路由器根据peer指定的LoopBack口地址作为更新源)。但是如果物理接口、环回口同时有IPv6全球单播地址,不指定connect-interface将导致BGP邻居无法建立。
  2. (不建议)如果,直连邻居使用Link-local起IBGP邻居,也可以。(IBGP邻居可能不直连,Link-local不跨链路)

[R1] bgp 100

       router-id 1.1.1.1

       peer fe80::2 as-number 100

       peer fe80::2 connect-interface g0/0/0       //同一设备多个接口Link-local地址可能相同

       ipv6-family unicast

       peer fe80::2 enable

BGP防环

AS内:  iBGP水平分割:   从iBGP邻居学到的路由不再传给iBGP邻居

              RR:                     簇内依靠Originator_ID防环

簇间依靠Cluster_List防环

              联邦:                  依靠联邦内的AS_Path防环

AS间:  AS_Path

路由聚合时,聚合路由器上产生一条指向NULL0的聚合路由

SoO

BGP基本配置

[RC] bgp 100

       peer 10.1.35.5 as-number 300                  //建立EBGP邻居

       peer 10.1.35.5 ebgp-max-hop xxx            //这里使用直连地址建立RBGP邻居,无需

       peer 2.2.2.2 as-number 100                      //建立IBGP邻居,前提是AS100中IGP可达

       peer 2.2.2.2 connect-interface LoopBack0

  • BGP没有多进程(v4、v6在MP-BGP中独立拓扑)
  • 常使用LoopBack地址建立IBGP邻居关系,因为LoopBack口不容易Down

[RC] network 3.3.3.3 32

//引入这条直连路由至BGP(注意与OSPF不同,不是激活接口,也没用反掩码)

  • BGP协议本身不产生路由,只引入路由。

[RC] ipv4-family unicast       //ipv4单播地址族视图

       undo synchronization   //(自动生成的)华为默认关闭BGP同步规则,实际上也打不开

       peer 10.1.35.5 enable

       peer 2.2.2.2 enable       //(自动生成的)由于建立邻居时使用的是v4地址

       peer 2.2.2.2 next-hop-local

                                             //解决下一跳问题(在bgp视图下配置,自动进入地址族视图)

BGP状态机

1.        Idle:初始状态。接收到Start事件(操作者配置peer x.x.x.x)转至connect

  • 若BGP对等体IP不可达,则一直Idle

2.      Connect:主动发起一次TCP连接(然后被动等待TCP连接),启动TCP重传计时器(32s)。

3.        Active:主动不断发起TCP连接。

  • Connect、Active状态下,

        TCP连接       成功发送一个Open报文并转至OpenSent

                             失败(TCP NAK)转至Active

                             超时转至Connect

  • IP单播不通,TCP超时,双方始终connect

4.        OpenSent:  表示自己已发Open,等待对方Open并检查参数

                                  收到Open报文后,检查参数(见Open报文)

                                  如果Open报文正确,转至OpenConfirm状态

5.        OpenConfirm:   表示收到了正确的Open报文,发送Keepalive报文。

                                        收到Keepalive报文,转至Established

  • Keepalive是对Open报文携带参数的确认

6.        Established:邻居关系建立。BGP对等体间交换Update、Keepalive、Route-refresh、Notification报文

  • 任何状态下,一旦出错收到Notification报文,状态机返回Idle
  • 还有一种No neg(未协商)状态,例如BGP对等体(单播-组播)起邻居

BGP报文

  • BGP是承载在TCP协议之上的协议(源端口:随机→目的端口:179)

BGP五种报文均为单播:  

        Open

        Update

        Notification

        Keepalive

        Route-refresh

  • Open、Update、Notification、Route-refresh报文采用Header + Message + Data格式
  • Keepalive报文只有Header
  • BGP报文没有Hello,是因为IGP协议多使用Hello报文(目的组播地址)寻找邻居,而BGP邻居手动指定。

BGP报文头Header

 

标记128:全1

长度16:BGP报文总长

类型8:        1=Open

                     2=Update

                     3=Notification

                     4=Keepalive

                     5=Route-refresh

Open报文(建立邻居,协商参数)

TCP建立起来后,邻居双发都要发送一次(无错误情况下)Open报文协商参数。

协商通过,回复一个Keepalive报文。

  • TCP保活依赖Keepalive/Update

版本:4

My AS:我的AS号。相同AS号对等体建立IBGP邻居;不同AS号建立EBGP邻居

Hold Time:    邻居关系保活时间。收到Keepalive或Update重置。超时邻居Idle。

                        Hold Time=180s=3 * Keepalive(60s

                        Hold Time可以=0, BGP邻居状态永远Up,且不会发送Keepalive报文

  • 双方Hold Time不一致时,可以建立邻居,采用Hold Time

Router-ID:邻居RID冲突无法建立;RR中Originator和Cluster-List使用RID。

可选参数(变长):TLV,支持Route-Refresh、四字节AS号等能力

AFI:Address Family ID地址族ID

SAFI:Sub-AFI

影响BGP邻居关系建立的因素

收到了Open报文:

  1. 版本
  2. My AS
  3. RID

收到不到Open报文:

  1. TCP层面:双方179端口都被禁止、BGP认证(TCP认证)失败
  2. IP层面:IP不可达、更新源错误、ebgp-max-hop问题(TTL)

邻居正常、没有路由

  1. 路由没引入BGP
  2. RT(私网路由交叉失败)
  3. 下一跳不可达
  4. active-route-advertise(BGP邻居间,仅通告全局路由表中活跃的BGP路由)
  5. 策略

不指定/单向指定connect-interface

(基于环回口)当双方都不指定更新源时,邻居关系无法建立:

R1:192.168.0.1 → 2.2.2.2               //R2 peer的不是192.168.0.1

R2:192.168.0.2 → 1.1.1.1

邻居关系无法建立

一方不指定更新源,一方指定更新源时,可以建立邻居关系:

指定更新源的一方一定为TCP主动方。

R1:1.1.1.1 → 2.2.2.2尝试建立TCP

R2:因为是TCP建链,所以使用2.2.2.2 → 1.1.1.1,而不直连接口地址

  • R2主动发起的TCP连接无法建立

Update报文(撤销、通告路由及其属性)

  • 一个Update报文通告一条或多条相同路径属性的路由

        不同路径属性的路由需要用多个Update报文通告

撤销路由长度16:表示【撤销的路由】字段的长度

撤销的路由(变长):撤销n条路由。需要撤销的路由采用<Length,prefix>格式来表达。                                      Eg. <24,192.168.1.0>表示192.168.1.0/24路由需被撤销

路径属性长度16:表示【路径属性】字段的长度

路径属性(变长):表示此Update报文中通告给对等体的路由的路径属性

0

0

0

0

属性类型代码(8bit)

第0位:       0=公认          1=可选

第1位:       0=非传递       1=传递

第2位:表示可选传递属性中的信息是完全的(=0)还是部分的(=1)

第3位:表示[路径属性]字段长度是1Byte(=0)还是2Byte(=1)

              属性类型代码:

网络层可达信息NLRI(变长):需要被通告的 网络号/掩码 <Length,prefix>

BGP 路由的撤销

使用Update报文,不携带路径属性

Withdraw Routes Length:撤销路由长度(可以撤销多条路由)

Withdraw Routes:撤销的(IPv4)路由

  • IPv6、VPNv4等,在【路径属性】中的MP-UNREACH-NLRI撤销

Notification报文(错误通知)

  • 当检测到错误时,就会发送Notification报文
  • Notification由 错误代码 + 错误子代码 + 数据(变长) 组成

数据字段用于诊断差错原因

Keepalive报文(保活TCP连接)

  • BGP没有周期Hello(Open)报文,为了使TCP连接不超时,周期发送Keepalive
  • Keepalive报文只携带BGP头部

  • Keepalive(默认60s)= 1/3 * Hold Time(默认180s
  • 如果Open报文中协商Hold Time=0,则BGP对等体邻居关系永远Established,不发送Keepalive(但是TCP会超时断链,仅保留邻居关系)
  • 如果在Hold Time间隔内,对等体发送过Update消息,则此间隔内不发送Keepalive

Route-refresh报文(route-policy改变,让邻居重新给我通告路由)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值