目录

BGP

# 简介

先前学习的是OSPF, RIP等动态路由协议,但这类协议是属于IGP范畴的,也就是说只能应用在区域内,通常城市之间或国家间的路由通信都是采用EGP中的BGP协议。BGP中所有报文都是单播!

# AS

AS自治系统,单一技术管理下的一组网络

  • 16位编号(2009/1起采用32位编号)
  • 1 ~ 65535
  • 私有AS:64512 ~ 65535

AS号是由IANA机构负责分配的,IGP在AS内运行,AS间通过BGP通信

# BGP 特点

BGP是一种路径矢量协议:

  • 可靠更新:BGP在TCP(port 179)上运行
  • 增量式、触发式更新
  • 定期提供Keepalive信息以验证TCP连接性
  • 丰富的度量标准
  • 专门为大型网络设计
  • 优于距离矢量协议
# 使用环境
  • 大量路由需要承载,IGP协议通常只能支持千条路由,而BGP可以容纳上万条
  • 支撑MPLS/VPN的应用,传递客户VPN路由
  • 策略能力强,可以很好的实现路由决策和数据控制

# BGP报文类型

类型 描述
Open 类似HELLO,建立邻居关系
Keeplive 类似HELLO,维护邻居关系
Update 路由更新,包含属性
Notification 当检测到错误、发送后关闭BGP链接
Route-refresh 当路由策略发生变化时,触发请求邻居重新通告路由

# BGP链接状态

类型 描述
Idle 初始,路由器查找路由表,是否有到达邻居的路由
Connect 发起TCP链接,等待TCP连接完成
Active TCP连接失败,继续尝试TCP连接
Open Sent TCP连接成功,已发送OPEN包
Open Confirm 已收到对方正确的Open包,如果没收到,就会进入Active
Established 邻居建立完成,开始传递路由
# 状态机

avatar avatar

# BGP邻居

BGP Speakers:运行BGP的路由器 BGP Peers = BGP Neighbors = BGP对等体/邻居 邻居关系建立在TCP连接基础上,因此邻居不一定需要直连,可以通过IGP或者静态路由的形式提供TCP连接的可达性。(在OSPF中,路由器间要建立OSPF邻居关系则必须是通过物理线缆直连,而BGP的邻居关系可以跨设备建立) 邻居必须手动指定而非自动建立 一台BGP路由器只能运行在一个AS内

邻居类型由两种:

  1. IBGP —— 内部BGP邻居,位于相同AS
  2. EBGP —— 外部GBP邻居,位于不同AS

avatar

# 配置命令
命令 描述
bgp 123 声明设备所在的AS号
router-id 1.1.1.1 配置RID,必须唯一
peer 12.0.0.2 as-number 123 配置邻居的IP地址和所在的AS号
display bgp peer 查看BGP邻居状态
# BGP邻居建立条件
  • 邻居地址可达
  • 自身配置中的邻居所在AS号 = 邻居配置中声明的AS号
  • 数据包源IP = 对方配置的邻居IP

# BGP邻居建立问题

avatar

假设我们有以上拓扑关系图,通过上述设定会发现,实际上并不能建立BGP邻居关系,因为违反了建立条件,我们通过抓包会发现,无论是1.0.0.1发往12.0.0.1,还是从1.0.0.2发往11.0.0.1,都无法建立关系,因为我们规定了必须是12.0.0.1发往11.0.0.1或者反过来。

avatar

# 解决方法

上面例子中,我们之所以用回环口而不是物理接口,是因为为了增加稳定性,通常建议使用回环口来建立邻居。

更新源:建立邻居和邻居所学习到的路由的下一跳 多跳:EBGP邻居建立默认需要直连,因为TTL=1,如果非直连,则必须修改TTL

因此在上面案例中,我们需要在配置邻居命令时增加一条peer [邻居IP] con [本机回环口]

avatar

此时,抓包的结果中会发现,源地址和目的地址不再是物理接口与回环口,而是回环口对回环口 avatar

# 跨AS建立邻居

两台路由不在同一AS中无法使用动态路由协议去实现路由关系,因为动态路由协议是属于IGP的,那么我们只剩下静态路由能使用了。 avatar avatar

当我们尝试用IBGP方式建立邻居时会发现一个现象,抓包的结果全都是红的,而且多了一个NOTIFICATION Message的包,如果你点开这些红色的包会发现,所有TCP的TTL都是1,而且EBGP关系下的路由无法建立邻居关系,这是为什么呢?

因为默认情况下,EBGP邻居的建立是需要直连的,而我们的实验是通过回环口建立的,这意味着当数据包到达目标设备时,TTL已经是0了,因此被丢弃了。因此,我们需要修改TTL的长度从而确保当包抵达目的地时,TTL>1

我们在发送路由上使用peer [邻居IP] ebgp-max-hop [TTL number]

# BGP 邻居安全

通过peer [邻居IP] password cipher [密令]就能设置验证,可以通过抓包发现TCP包的Option项多了一个MD5的字段

# BGP路由宣告

默认情况下,BGP不发布任何本地路由

  • 只有明确宣告的网络才会发送给邻居
  • 宣告的网络必须能精确地再路由表中找到
  • 多条路径时,只选最优的给自己使用
  • 只把自己使用的最优路由告诉邻居
  • 从EBGP学到的路由会宣告给所有邻居
  • 从IBGP学到的路由不会宣告给IBGP
  • 从IBGP学到的路由会宣告给EBGP

BGP中需要精确地宣告特定路由,也就是说所宣告的路由必须包含在routing-table中,假设有如下路由表 avatar

假设我要宣告11.0.0.1/32,我必须准确宣告11.0.0.1/32或者11.0.0.0/24(包含在路由表中),如果我宣告11.0.0.0/8,就会报错。、

宣告方式分为两种,一种是本地使用network进行宣告,另一种是通过import-route进行宣告。此外我们还能通过peer [邻居IP] default-route-advertise,向邻居宣告一条缺省路由

# BGP下一跳

  • BGP在给邻居传递路由时的下一跳=更新源
  • 在EBGP间传递时会修改下一跳为自己的更新源
  • 在IBGP间传递时不会修改下一跳为自己的更新源
  • peer [邻居IP] next-hop-local 修改下一跳为自己的更新源

avatar

从上述案例中可知,当RTC传递路由时,下一跳是2.1.1.2,但当RTB向RTA传递时依旧是2.1.1.2这很明显不合理,因为RTA根本就不知道如何前往2.1.1.2 我们需要在RTB上输入peer 1.1.1.1 next-hop-local,这样,传递给RTA时,下一跳的地址就会变更为RTB的地址而不是外部的RTC地址。

最近更新
01
基本知识
07-18
02
卷积神经网络识别图像
07-18
03
损失函数
07-18
更多文章>