一、BGP邻居建立
- BGP特征
- BGP对等体关系(EBGP、IBGP)
- TCP连接(TCP三次握手)
- BGP报文类型(5种:open、keepalive、update、route-refresh、notification)
- BGP状态机(6种:idle、connect、active、opensent、openconfirm、established)
- BGP路由表(dis bgp routing-table ipv4-address mask/mask-length)
二、BGP路由生成
不同于IGP协议,BGP自身并不会发现并计算产生路由,BGP将IGP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。
BGP注入路由的方式有两种:
1. network
2. import-route
network
- BGP协议的network命令不再具备将接口加入BGP进程的逻辑。
- 该命令是逐条将IP路由表中已经存在的路由引入到BGP路由表中,并通告给邻居。
- network可以精确控制发布哪些BGP路由。
import-route
- Network方式注入路由虽然是精确注入,但是只能一条条配置逐条注入IP路由表中的路由,如果注入的路由条目很多,那么配置命令将会非常复杂,为此可以使用import-route方式。
- 将路由表的路由引入到BGP中,高效快捷。
- 直连路由、静态路由、OSPF路由、ISIS路由
BGP协议(路由的搬运工,AS管理员让我干啥我干啥)的特点:
• BGP不对路由进行计算
• BGP只是路由的搬运工
IGP与EGP协议区别
IGP协议:一配好,全网就通。
BGP协议:只通管理员让通的,BGP的控制欲很强。
BGP通告原则与路由处理
BGP的update报文
• BGP通过Network和Import两种方式生成BGP路由,BGP路由封装在Update报文中通告给邻居。BGP在邻居关系建立后才开始通告路由信息。
• Update消息主要用来公布**可用路由**和**撤销路由**,Update中包含以下信息:
○ 网络层可达信息(NLRI):用来公布IP前缀和前缀长度。
○ 路径属性:为BGP提供环路检测,控制路由优选。
○ 撤销路由:用来描述无法到达且从业务中撤销的路由前缀和前缀长度。
• 在通告BGP路由时,由于各种因素的影响,为了避免路由通告过程中出现问题,BGP路由通告需要遵守一定的规则,下面进行详细介绍。
BGP通告原则
通告原则之一:仅将自己最优的路由发布给邻居
备注,在BGP路由表中同时存在一下以下两个标志的路由为最优且有效路由:
“ > ” 大于号 best 代表最优路由
“ * ” 星号 valid 代表有效的BGP路由,即下一跳可达的路由
通告原则之二:通过EBGP获得的最优路由发布给所有BGP邻居
通告原则之三:通过IBGP获得的最优路由不会发布给其他的IBGP邻居,称水平分割,用来防止IBGP邻居互相通告导致产生环路。
通告原则之四:BGP同步原则,从IBGP邻居得到的路由同步检测通过后传递给EBGP邻居,适用于AS内部有设备没有运行BGP协议。
知识点:
关于BGP同步原则:
当一台路由器从自己的IBGP对等体学习到一条BGP路由时(这类路由被称为IBGP路由),它将不能使用这条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(例如OSPF等,此处也包含静态路由)学习到这条路由,该条规则也被称为BGP同步原则。
为什么要同步检测?
- BGP路由传递给EBGP邻居时,下一跳自动修改为向该EBGP邻居发送BGP报文的源地址。
- 从EBGP邻居传来的路由在传给IBGP邻居时,下一跳默认保持不变(依旧是EBGP邻居传来的源地址),这是导致下一跳不可达的根本原因,也是在EBGP上做同步检测的原因。
如何解决下一跳不可达?
- 将从EBGP邻居得到的路由传递给指定的IBGP邻居时,下一跳修改为自身向该IBGP邻居发送BGP报文的源地址即可。
peer IBGP邻居地址 next-hop-local
# 这条命令只对IBGP邻居生效。
如上图,此时,由于RTC没有运行BGP协议,也没有去往100.0.0网段的路由,那么RTE想要去往100.0.0网段,在经过RTD到达RTC时,会出现BGP路由黑洞。
如何解决BGP路由黑洞:
- 将BGP路由引入到IGP协议中(即IGP与BGP同步,基本淘汰),比较消耗设备资源,因为BGP路由数量过于庞大,引入到IGP协议增加了IGP协议计算路由的负担。而且BGP路由震荡,IGP路由也会产生震荡。
- AS内部所有的路由器均运行BGP协议,并形成IBGP全互连。主流架构,此时不再需要同步检测,BGP与IGP同步不同步已经没有意义了,完美。
- 使用MPLS标签隧道转发。
总结:
- 仅传递最优路由
- 从EBGP邻居得到的路由传递给所有邻居
- 从IBGP邻居得到的路由不传递给IBGP邻居
- 从IBGP邻居得到的路由同步检测通过后传递给EBGP邻居
- 如果同步功能关闭,从IBGP邻居得到的路由只要下一跳可达并最优即可传递给EBGP邻居
实验:
R1配置
<Huawei>system-view
[Huawei]sysname r1
[r1]int g0/0/0
[r1-GigabitEthernet0/0/0]ip add 10.1.12.1 24
[r1] bgp 1
[r1-bgp]peer 10.1.12.2 as 234
[r1]int lo 0
[r1-LoopBack0]ip add 1.1.1.1 24
#BGP发布路由的逻辑,你想别人能够访问你,那么你就得把这条路由发布出去
[r1]bgp 1
[r1-bgp]network 1.1.1.0 24
R2配置
<Huawei>system-view
[Huawei]sysname R2
[R2]int g0/0/0
[R2-GigabitEthernet0/0/0]ip add 10.1.12.2 24
[R2]int g0/0/1
[R2-GigabitEthernet0/0/1]ip add 10.1.23.2 24
[R2]int lo 0
[R2-LoopBack0]ip add 2.2.2.2 32
# ISIS协议
[R2]isis
[R2-isis-1]is-level level-2
[R2-isis-1]network-entity 49.0002.0000.0000.0002.00
[R2-isis-1]int lo 0
[R2-LoopBack0]isis enable
[R2-LoopBack0]int g0/0/1
[R2-GigabitEthernet0/0/1]isis enable
#AS之间互联的链路是不会加入到IGP协议中的
[R2]bgp 234
[R2-bgp]peer 10.1.12.1 as 1
[R2-bgp]peer 4.4.4.4 as 234
[R2-bgp]peer 4.4.4.4 connect-interface LoopBack 0
[R2]isis
[R2-isis1]import-route bgp
R3配置
<Huawei>system-view
[Huawei]sysname R3
[R3]int g0/0/0
[R3-GigabitEthernet0/0/0]ip add 10.1.23.3 24
[R3]int g0/0/1
[R3-GigabitEthernet0/0/1]ip add 10.1.34.3 24
[R3]int lo 0
[R3-LoopBack0]ip add 3.3.3.3 32
# ISIS协议
[R3]isis
[R3-isis-1]is-level level-2
[R3-isis-1]network-entity 49.0003.0000.0000.0003.00
[R3-isis-1]int lo 0
[R3-LoopBack0]isis enable
[R3-LoopBack0]int g0/0/0
[R3-GigabitEthernet0/0/0]isis enable
[R3-GigabitEthernet0/0/0]int g0/0/1
[R3-GigabitEthernet0/0/1]isis enable
R4配置
<Huawei>system-view
[Huawei]sysname R4
[R4]int g0/0/0
[R4-GigabitEthernet0/0/0]ip add 10.1.34.4 24
[R4]int g0/0/1
[R4-GigabitEthernet0/0/1]ip add 10.1.45.4 24
[R4]int lo 0
[R4-LoopBack0]ip add 4.4.4.4 32
# ISIS协议
[R4]isis
[R4-isis-1]is-level level-2
[R4-isis-1]network-entity 49.0004.0000.0000.0004.00
[R4-isis-1]int lo 0
[R4-LoopBack0]isis enable
[R4-LoopBack0]int g0/0/0
[R4-GigabitEthernet0/0/0]isis enable
[R4]bgp 234
[R4-bgp]peer 10.1.45.5 as 5
[R4-bgp]peer 2.2.2.2 as 234
[R4-bgp]peer 2.2.2.2 connect-interface LoopBack 0
[R4]isis
[R4-isis1]import-route bgp
R5配置
<Huawei>system-view
[Huawei]sysname R5
[R5]int g0/0/0
[R5-GigabitEthernet0/0/0]ip add 10.1.45.5 24
[R5] bgp 5
[R5-bgp]peer 10.1.45.4 as 234
遇到问题:
- 从EBGP邻居传来的路由传给IBGP邻居时,下一跳默认保持不变(依旧是R1的出接口地址,实际应该是R2到R4的地址),这是导致(R4到R2不通)下一跳不可达的根本原因。
- 此时,在路由器R4上,dis bgp routing-table 查询1.1.1.0网段路由不可达。
解决方法:
- 在R4上添加静态路由也可以解决,但是,当面对大量路由时,这不是一个好办法(不采取)。
- 将从EBGP邻居得到的路由传递给指定的IBGP邻居时,下一跳修改为自身向该IBGP邻居发送BGP报文的源地址。
# peer IBGP邻居地址 next-hop-local
# 这条命令只对IBGP邻居生效。
[R2]bgp 234
[R2-bgp]peer 4.4.4.4 next-hop-local
三板斧
bgp 234
peer 4.4.4.4 as-number 234
peer 4.4.4.4 connect-interface loopback 0
peer 4.4.4.4 next-hop-local
关闭同步功能:
undo synchronization
华为是默认关闭的,也无法开启。
R5补充配置
[R5]int lo 0
[R5-LoopBack0]ip ddd 5.5.5.5 24
[R5-LoopBack0]q
[R5]bgp 5
[R5-bgp]network 5.5.5.0 24
# 此时,在R2上查看,也是显示路由不可达,怎么办:
[R4]bgp 234
[R4-bgp]peer 2.2.2.2 next-hop-local
三板斧
# 记得向所有BGP邻居手动触发路由更新
refresh bgp all export
回顾实验结果
R1上面,dis bgp routing-table 查询结果里面nexthop是0.0.0.0,表示路由器自己产生的路由。
当然,也可以查看路由的详细信息,dis bgp routing-table 1.1.1.0
产生下面问题的原因:从EBGP邻居传来的路由传给IBGP邻居时,下一跳默认保持不变。使得在路由器R4上,去往1.1.1.0网段的路由下一跳不可达。
此时,在R4上添加静态路由,去往1.1.1.0网段的路由信息变成*有效路由,>最优路由,i。
完成同步,路由可达,R5有去往1.1.1.0网段路由。
总结,查看一条路由是否可达,首先查看BGP路由中的下一跳dis bgp routing-table,然后在dis ip routing-table nexthop 查看下一跳是否可达,如果不可达,添加静态路由即可,但是此方法太过于笨重,面对很多条不可达路由时,就无能为力了,最好是使用next-hop-local。
配置完成,R3上面dis ip routing-table 显示有去往1.1.1.0和5.5.5.0网段的路由
并且,在R5上面带源pingR1,可以通。
再次回到,BGP路由黑洞
关于同步功能,只是用来检测有没有黑洞,它解决不了黑洞,那么,只要通过其他方法解决了黑洞问题,同步可开可不开。
解决:
采用IBGP全部互联,可解决BGP路由黑洞问题,此时同步功能开不开都是一样的,所以华为默认不开。
# R2的isis配置
[R2]isis
[R2-isis-1]dis this
[V200R003C00]
#
isis 1
is-level level-2
network-entity 49.0002.0000.0000.0002.00
import-route bgp
#
return
#关闭路由引入
[R2-isis-1]undo import-route bgp
# R4的isis配置
[R4]isis
[R4-isis-1]dis this
[V200R003C00]
#
isis 1
is-level level-2
network-entity 49.0004.0000.0000.0004.00
import-route bgp
#
return
#关闭路由引入
[R4-isis-1]undo import-route bgp
开始建立IBGP全互连
[R2]bgp 234
[R2-bgp]peer 3.3.3.3 as 234
[R2-bgp]peer 3.3.3.3 connect-interface loopBack 0
[R2-bgp]peer 3.3.3.3 next-hop-local
[R4]bgp 234
[R4-bgp]peer 3.3.3.3 as 234
[R4-bgp]peer 3.3.3.3 connect-interface LoopBack 0
[R4-bgp]peer 3.3.3.3 next-hop-local
<r3>systen-view
[r3]bgp 234
[r3-bgp]peer 2.2.2.2 as 234
[r3-bgp]peer 2.2.2.2 connect-interface LoopBack 0
[r3-bgp]peer 2.2.2.2 next-hop-local
[r3-bgp]peer 4.4.4.4 as 234
[r3-bgp]peer 4.4.4.4 connect-interface LoopBack 0
[r3-bgp]peer 4.4.4.4 next-hop-local
建立IBGP全互联后,从5.5.5.5可以ping通 1.1.1.1
BGP路由处理
- 当从BGP邻居接收到Update报文时,路由器将会执行路径选择算法,来为每一条前缀确定最佳路径。
- 得出的最佳路径被存储到本地BGP路由表(Local_RIB)中,然后被提交给本地IP路由表(IP_RIB),以用作安装考虑。
- 被选出的有效的最佳路径路由将会被封装在Update报文中,发送给对端的BGP邻居。
IP路由表(IP_RIB):全局路由信息库,包括所有的IP路由信息。
BGP路由表(Local_RIB):BGP路由信息库,包括本地BGP路由器选择的路由信息,邻居表,邻居清单列表。
收到BGP邻居发来的Update报文,路由器会执行算法进行路径选择,确定每一条前缀的最佳路径,并将计算出的最佳路径存储到本地BGP路由表(Local_RIB)中。
如果启用了多路径特性,最佳路径和所有等值路径都被提交给IP_RIB,考虑是否安装。除了从BGP邻居接收的最佳路径外,Local_RIB也包含当前路由器注入的路由(被称为本地发起的路由)。
在Local_RIB中,只有被选为最优的前缀才会被封装到Update报文中通告给自己的BGP邻居。
扩展
黑洞路由解决方案:
方案一:将BGP引入到IGP(已淘汰)
将BGP路由引入到IGP协议中(即IGP与BGP同步,基本淘汰),比较消耗设备资源,因为BGP路由数量过于庞大,引入到IGP协议增加了IGP协议计算路由的负担。而且BGP路由震荡,IGP路由也会产生震荡。
方案二:IBGP全互联
AS 234内的R2、R3和R4相互之间建立IBGP邻居关系,R2会将R1的路由直接通告给R3和R4,同理R4也会将R5的路由传递给R2和R3。
方案三:使用路由反射器RR
- 路由反射器两种角色:RR(Route Reflector,路由反射器)、Client(客户端)
- RR会将学习到的路由反射出去,从而使得IBGP路由在AS内传播无需建立IBGP全互联。
- 将一台BGP路由器指定为RR,同时,还需要指定其Client,但是Client本身无需做任何配置,因为它并不知道该网络中存在RR。
- 路由反射器和联邦是两种专门针对IBGP水平分割设计的解决方案。
在AS 234的每台路由器上配置BGP进程,然后配置R3为RR,R2、R4为RR客户端,客户端设备都和RR建立IGBP邻居。RR会将客户端传递过来的路由发射给该客户外的所有客户,以及所有非客户,这样所有的BGP路由都存在到达R1和R5的路由。数据转发时直接查找BGP路由表,就可以实现数据的转发。
方案四:MPLS隧道
在R2、R3、R4上开启MPLS协议,R2和R4之间建立MPLS LSP隧道,使用route recursive-lookup tunnel实现将R1和R5的路由迭代到LSP隧道。
route recursive-lookup tunnel 应用在MPLS网络的边界设备上。
方案五:GRE隧道
在R2和R4设备上建立GRE隧道,然后通过GRE隧道的IP地址建立IBGP邻居关系传递业务路由。