BGP存在5种类型的报文,不同类型的报文拥有相同的头部: BGP的5种类型报文: BGP对等体关系建立后,可以查看到open和keepalive报文。
BGP的报文
open报文:主要用于对等体关系建立。
keepalive报文:主要用于对等体关系维护。
route-refresh报文:刷新BGP路由(一般情况下由管理员手工进行刷新,实际很少使用)。
update报文:主要用BGP路由的更新和撤销,同时携带BGP的路由属性(更新)。
notification报文:主要用于错误报告,中断对等体关系。
BGP报文中的open报文和keepalive报文相当于OSPF的hello报文。 keepalive报文不需要携带内容,只有报文头部。报文的周期时间60s,默认对等体超时时间是180s。
<AR4>refresh bgp all ?
export Trigger outbound soft reconfiguration 向邻居发送uptada报文通告自身的路由
import Trigger inbound soft reconfiguration 向邻居发送route-refresh报文请求路由
执行上述刷新命令后,在AR3的G0/0/1接口可以抓到ROUTE-REFRESH报文:
更新一条路由后,可以抓到update报文: (上述路由属性中的MULTI EXIT DISC即开销。)
BGP的状态机
上图在AR3和AR4之间做BGP的连接。 ::: tip BGP邻居之间建立,会相互发送TCP链接,但是两者之间只需要一个TCP链接即可,使用邻居之间最后发起TCP链接。 ::: 如上,收到了两次TCP的三次握手,两次连接需要断开一个,在收到第一个open报文时断开连接,然后进行四次挥手断开TCP。
::: warning 起始时两端设备同时发起TCP连接,就是报文交互时出现两次TCP三次握手,由于BGP需要RID大的那台设备先发起open报文连接,所以这两次TCP三次握手只保留RID大的设备先发起的那次TCP握手。 :::
idle:初始状态,等待BGP的使能事件。使能事件即BGP视图下的peer xx.xx.xx.xx的对等体.
connect:有了使能事件或对等体建立后,进入connect连接状态,发起TCP连接:
- TCP链接正常,发送open报文进入opensent状态。
- TCP链接无回复,则保持connect状态继续发送tcp链接。
- TCP链接失败,则进入active状态,并启动tcp超时计时器。
active:继续发起TCP链接:
- TCP链接正常,发送open报文进入opensent状态。
- TCP链接失败,等待TCP超时计时器超时,退回connect状态。
opensent:等待接收对方发送的open报文,协商open报文内的参数。
AS号(IBGP两端一致、EBGP两端不一致)、RID(两端不一致)、BGP的能力(要求两端协商一致)。
参数合法时,则发送keepalive报文进入openconfirm状态。
openconfirm:等待接收对方发送的keepalive报文。
如果收到了对方的keepalive报文,则进入establish状态。
establish:可以进行updata报文的交互。
::: warning 在任何状态下,如果发送或收到notification报文,则断开TCP链接退回至idle状态。 如opensent、openconfirm没有完整状态的对应操作,会发送notification报文,退回至idle状态。 :::
BGP的路由生成
查看BGP路由条目: BGP路由不会无中生有。
- 将自身的路由(可以是IP路由表中的路由)通过network方式,加载进BGP路由表。
[AR4-bgp]network 4.4.4.4 32
- 不能将网段的广播地址进行通告。
- 不能将特殊网段的地址进行通告。
- 不存在网段,可以配置宣告命令但是不会通告路由(后期出现该路由可以直接通告)。
- 通过import方式将其他协议的路由引入到BGP路由表。
[AR4-bgp]import-route static xxx.xxx.xxx.xxx [AR4-bgp]import-route static
- 在多点引入时,需要注意次优和回馈。
- 通过汇总的方式,在BGP路由表中加载路由。
- 自动汇总:可以将BGP路由汇总为自然类(A、B、C类地址):
[AR4-BGP]summary automatic
- 手工汇总:
[AR4-bgp]aggregate
- 通过邻居交互,从邻居接收到路由加载到BGP路由表。
- 从EBGP邻居收到的路由可以传递给IBGP邻居和EBGP邻居。
- 从IBGP邻居收到的路由可以传递给EBGP邻居。
BGP通告原则
BGP路由的传递规则:
- BGP只传递最优且有效的路由。 BGP路由表中的 * 表示有效,> 表示最优。路由表项前有 *> 的路由会加入到IP路由表中。
- 从EBGP邻居收到的路由,会传递所有邻居。
- IBGP水平分割:从IBGP邻居收到的路由不会传递给IBGP邻居。(防环) 但是,AR3将AR4的路由传给AR1后,由于IBGP水平分割,无法传递给AR2,造成实际的物理链路无法通信,需要在AS内建立全互联的对等体关系,即AR2和AR3也建立对等体关系。
- BGP的路由同步: 从IBGP邻居收到的路由,传递给EBGP邻居时,需要检查BGP与IGP的同步。 ASBR设备需要在IGP协议中学习到对应BGP传递的路由。
- 如果IGP协议中存在对应BGP传递的路由,则可以将路由传递到EBGP邻居。
- 如果IGP协议中不存在对应BGP传递的路由,则不转发给EBGP邻居。 ::: tip 为满足BGP与IGP路由同步规则,需要IGP中存在BGP的所有路由。 (AS内依靠IGP传递路由,AS内部署BGP没有太大的作用。) ::: ::: warning
- Huawei设备默认关闭了BGP与IGP同步的能力,且不能开启。* :::
- 关闭BGP与IGP同步功能会出现BGP的路由黑洞,解决方法:*
- 在AS内建立全互联的BGP对等体关系。
- 做静态路由解决路由黑洞。
- 隧道技术。
实验验证:
[AR1-ospf-1-area-0.0.0.0]dis th
area 0.0.0.0
network 1.1.1.1 0.0.0.0
network 10.1.12.1 0.0.0.0
[AR2-ospf-1-area-0.0.0.0]dis th
area 0.0.0.0
network 2.2.2.2 0.0.0.0
network 10.1.12.2 0.0.0.0
network 10.1.23.2 0.0.0.0
[AR3-ospf-1-area-0.0.0.0]dis th
area 0.0.0.0
network 3.3.3.3 0.0.0.0
network 10.1.23.3 0.0.0.0
network 10.1.34.3 0.0.0.0 (暂不配置)
AR1和AR3做环回口的互通建立IBGP的对等体关系:
[AR1-bgp]peer 3.3.3.3 as-number 100
[AR1-bgp]peer 3.3.3.3 connect-interface LoopBack0 指定更新源地址为环回口
[AR3-bgp]peer 1.1.1.1 as-number 100
[AR3-bgp]peer 1.1.1.1 connect-interface LoopBack0
::: tip 上图红框内是TCP会话,会话建立完成后,需要建立的对等体关系(单播、组播、IP v4等),需要在单独的地址组下使能,如上图中,建立的所有对等体都是单播的。 一个会话可以建立多个对等体关系,默认是IP v4单播的。 :::
[AR4-LoopBack0]ip ad 100.4.4.4 32
[AR4-bgp]network 100.4.4.4 32 环回口宣告到BGP中
AR4的BGP路由表中显示该环回口是最优的,即可以传递到AR3: AR3的BGP路由表中显示该环回口是最优的,即可以传递给所有邻居(从EBGP邻居AR4收到的路由可以传递给IBGP邻居和EBGP邻居),即AR1和AR5的BGP路由表中也会查看到AR4的环回口路由: 如上,AR1的BGP路由表中的路由不可用且不是最优,AR1的IP路由表中也没有AR4的环回口路由,排查发现是AR1的路由表中没有BGP路由表中标明的AR4环回口路由的下一跳10.1.34.4,导致路由不可达。
::: tip 从EBGP邻居收到路由传递给IBGP邻居后,IBGP邻居的路由是非最优且不可达,原因是BGP路由的下一跳不可达。即ASBR设备从EBGP邻居收到路由传递给IBGP邻居时,路由下一跳不做更改。 解决办法:在ASBR将路由传递IBGP邻居时,将下一跳修改为自身的更新源地址。
[AR3-bgp]peer 1.1.1.1 next-hop-local
::: 上述修改后,AR1的路由表中会出现AR4的环回口:
AR1和AR2做IBGP的互通:
[AR1-bgp]peer 2.2.2.2 as 100
[AR1-bgp]peer 2.2.2.2 connect-interface LoopBack 0
[AR2-bgp]peer 1.1.1.1 as 100
[AR2-bgp]peer 1.1.1.1 co lo 0
AR2无法从AR1收到AR4的环回口路由:
如上可以证明IBGP水平分割,即从IBGP邻居收到的路由不会传递给IBGP邻居。
::: tip IBGP水平分割的主要作用就是在域内进行路由传递的防环。 如果没有IBGP水平分割,AR2也可能通过和AR3的IBGP将100.4.4.4传给AR3,造成环路。 ::: ::: warning 查看BGP邻居时,本身的AS号和邻居的AS号相同时为IBGP邻居,不同时为EBGP邻居。 :::
<AR3>dis bgp routing-table peer 1.1.1.1 ?
accepted-routes 查看向指定对等体策略过滤的路由
advertised-routes 查看向指定对等体通告的路由
received-routes 查看从指定对等体接收的路由
假设AR1存在一条100.1.1.1的路由,要想通过AR3将该路由传递给AR4、AR5,需要AS内部的IGP(OSPF)数据库中也存在该路由。
[AR1-bgp]network 100.1.1.1 32
AR1自身产生的路由100.1.1.1通告到BGP中,传递给IBGP对等体AR3:
需要让IGP的路由协议也学习到该路由,才能将BGP路由传给AR4、5:
::: tip
BGP通信需要IGP也学到对应路由的原因:
假设AR1和AR2没有IBGP的对等体关系,AR5通过EBGP学习到AR1的lo 1,AR5通过BGP访问AR1时,需要递归实际物理链路,即需要通过AR2,如果AR2没有通过IGP学习到该条路由,就无法完成通信。
:::
Huawei设备默认关闭IGP和BGP的同步功能,使用AS内建立全互联解决,AR2和AR3建立对等体关系: 上图中AR2的BGP路由表内100.4.4.4不是最优的,原因是下一跳没有改变:
[AR3-bgp]peer 2.2.2.2 next-hop-local ASBR路由传进IBGP时,下一跳修改为自身的更新源地址
::: warning 路由相互访问时需要加上源地址: 原因是AR4只能通过BGP学习到100.1.1.1的路由。 :::
BGP的数据转发:
BGP是迭代的数据转发,即BGP需要迭代到IGP进行数据转发。 这也是要求BGP的下一跳需要通过IGP通信的原因(要求更新源地址通信)。 如下AR1访问AR4: 即BGP迭代到IGP再继续执行数据访问。
即使是AR3和AR4直连,也需要最终迭代到物理链路IGP上:
::: tip BGP可以跨链路建立,是一种单播通信(基于IGP单播)。 :::