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 | 邻居建立完成,开始传递路由 |
# 状态机
# BGP邻居
BGP Speakers:运行BGP的路由器 BGP Peers = BGP Neighbors = BGP对等体/邻居 邻居关系建立在TCP连接基础上,因此邻居不一定需要直连,可以通过IGP或者静态路由的形式提供TCP连接的可达性。(在OSPF中,路由器间要建立OSPF邻居关系则必须是通过物理线缆直连,而BGP的邻居关系可以跨设备建立) 邻居必须手动指定而非自动建立 一台BGP路由器只能运行在一个AS内
邻居类型由两种:
- IBGP —— 内部BGP邻居,位于相同AS
- EBGP —— 外部GBP邻居,位于不同AS
# 配置命令
命令 | 描述 |
---|---|
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邻居建立问题
假设我们有以上拓扑关系图,通过上述设定会发现,实际上并不能建立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
或者反过来。
# 解决方法
上面例子中,我们之所以用回环口而不是物理接口,是因为为了增加稳定性,通常建议使用回环口来建立邻居。
更新源:建立邻居和邻居所学习到的路由的下一跳 多跳:EBGP邻居建立默认需要直连,因为TTL=1,如果非直连,则必须修改TTL
因此在上面案例中,我们需要在配置邻居命令时增加一条peer [邻居IP] con [本机回环口]
此时,抓包的结果中会发现,源地址和目的地址不再是物理接口与回环口,而是回环口对回环口
# 跨AS建立邻居
两台路由不在同一AS中无法使用动态路由协议去实现路由关系,因为动态路由协议是属于IGP的,那么我们只剩下静态路由能使用了。
当我们尝试用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中,假设有如下路由表
假设我要宣告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
修改下一跳为自己的更新源
从上述案例中可知,当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地址。