前言
边界网关协议(BGP)是运行于 TCP上的一种自治系统的路由协议. BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系统交换网络可达信息。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了 AS 互联的拓扑图并由此清除了路由环路,同时在 AS 级别上可实施策略决策。
AS Autonomous System 自治系统
- 在Internet中,AS是指在一个实体管辖下的拥有相同选路策略的IP网络
AS号范围
| AS号类别 | 2字节AS号 | 4字节AS号 |
|---|---|---|
| 公有AS号 | 1-64511 | 1-64511,65536-4294967295 |
| 私有AS号 | 64512-65535 | 64512-65535 |
- 中国电信163(4134) 中国CN2(4809) 中国网通(9929)
- AS同时在BGP中关键性的作用:最佳路由的选举,避免环路,路由过滤
BGP版本
- IPV4网络使用的版本是BGP-4(RFC4271) 其他网络(IPV6,组播等)使用版本是MP-BGP(RFC4760)
- MP-BGP是对BGP-4进行了扩展,来达到不同网络中应用的目的,原有消息机制和路由机制没有改变
- MP-BGP在IPV6单播网络上的应用称为BGP4+,在IPV4组播网络上的应用称为MBPG(Multicast BGP)
BGP特点
- 1️⃣ 采用认证和GTSM的方式,保证了网络的安全性
- 2️⃣ 提供了丰富的路由属性,能够进行灵活的路由选路
- 3️⃣ 提供了路由聚合和路由衰减功能用于防止路由震荡,有效提高了网络的稳定性
- 4️⃣ 使用TCP(端口号=179),并支持与BFD联动,BGP Tracking和BGP GR和NSR,提高了网络的可靠性
- 5️⃣ 在邻居数目多,路由量大且大部分邻居具有相同出口策略的场景下,使用按组打包技术极大的提高了打包发包性能.
- 6️⃣ 仅增量式,触发式更新
使用BGP的三大理由
- 1️⃣ 大量路由需要承载,IGP只能容纳千条,而BGP可以容纳上万
- 2️⃣ 支撑MPLS/VPN的应用,传递客户VPN路由
- 3️⃣ 策略能力强,可以很好的实现路由决策与数据控制
BGP角色
| 角色 | 备注 |
|---|---|
| Speaker | 发送BGP报文的设备称为BGP的发言者(Speaker) |
| Peer | 相互交换BGP报文的Speaker之间互称对等体(Peer) |
- 邻居关系建立在TCP连接基础上,因此邻居不一定需要直连,可以通过IGP或者静态路由来提供TCP连接的可达性 [IGP建立连接的ttl为1 必须直连]
- 邻居必须手动指定,而非自动建立
- 一台BGP路由器只能运行在一个AS内
邻居类型*
| 类型 | 备注 |
|---|---|
| IBGP | Internal/Interior BGP , 内部BGP邻居,位于相同AS |
| EBGP | External/Exterior BGP , 外部BGP邻居,位于不同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邻居状态
router id // 如果在进程外routerid 那么是全局的 会被所有路由协议所继承 如果在进程内打 那么进程内优先
bgp 123
peer 12.0.0.2 as-number 123
peer 3.3.3.3 as-number 321
peer 3.3.3.3 connect-interface LoopBack 0 // 使用环回口建立邻居
address-family ipv4
peer 3.3.3.3 enable // 收到启用邻居
peer 12.0.0.2 enable
邻居建立抓包以及分析
如果只存在arp报文 无tcp则可以检查一下 对端ip是否配置
监听12.1.1.2所有端口号的TCP连接 本地发送了179的端口号 监听对端接口号是48960
报文分析 TCP三次握手
如果使用环回口建立邻居 但是没有指定本端源地址接口类型为环回口 那么路由器将采用物理地址源地址,但是12.1.1.2不在对端路由器邻居列表中(监听TCP),导致TCP一致重置 导致TCP建立失败*
使用环回口地址后邻居建立成功
对于EBGP环回口建立邻居失败的问题: EBGP默认TTL值为1,如果采用环回口建立邻居,数据包到路由器后查询环回地址路由时,TTL会减1,导致路由不可达.导致TCP邻居建立失败
peer 3.3.3.3 ebgp-max-hop // 默认1 可以指定 EBGP环回口建立邻居解决办法:修改TTL最大跳数
邻居建立信息
网络拓扑如下
邻居建立成功与初始状态
邻居简要信息
邻居默认老化时间以及Hello时间*
BGP建立邻居条件*
- 邻居地址可达(有路由)
- 本地配置中的邻居所在AS号=邻居配置中的声明所在AS号
- 报文源IP=对方配置的邻居IP(这个源IP也叫更新源,也将作为路由的下一跳)
BGP邻居建立优化*
为了增加稳定性,通常建立使用环回口建立邻居
- 更新源:建立邻居和邻居所学习到的路由的下一跳
- 多跳:EBGP邻居建立默认需要直连,因为TTL=1,如果非直连,必须修改TTL
peer 2.2.2.2 connect-interface lo1 // 更新源地址
peer 2.2.2.2 ebgp-max-hop [2] // 配置TTL,默认=1
BGP身份认证*
peer 2.2.2.2 password simple 123 // 配置身份验证,MD5形式
TCP的Option字段的MD5加密
BGP报文结构和类型[所有报文都是单播]
邻居间会比对RID与AS号
| 类型 | 备注 |
|---|---|
| Open | 类似Hello,建立邻居关系 |
| keeplive | 类似Hello,维护邻居关系,默认周期=60s |
| Update | 路由更新,包含丰富的路由属性 |
| Notification | 当检测到错误,发送后关闭BGP连接 |
| Route-refresh | 当路由策略发生变化时,触发请求邻居重新通告路由 |
open报文
keeplive报文
Route-refresh报文
refresh bgp 1.1.1.1 export // 请求指定bgp邻居发出通告路由 [出策略时] network引入bgp后发出 为出策略 入策略为import
BGP状态
| 类型 | 备注 |
|---|---|
| Idle | 初始,路由器查询路由表,是否有到达邻居的路由 |
| Connect | 发起TCP连接,等待TCP连接完成 |
| Active | TCP连接失败,继续尝试TCP连接 |
| Open Sent | TCP连接成功 发送Open包 |
| Open Confirm | 已收到对方正确的Open包,如果没收到 进入Active |
| Established | 邻居建立完成 开始传递路由 |
重连计时器3分钟超时
BGP数据库
BGP路由信息处理过程
BGP路由宣告原则: BGP协议本身不发现路由*
- 只有明确宣告的路由才会发布给邻居
- 宣告的路由必须能精确的在路由表中找到
- 多条路径时,只选最优的给自己使用和发布给邻居
- 从IBGP学习到的路由会发布给EBGP
- 从IBGP学习到的路由不会发给IBGP
- 从EBGP学习到的路由会发布给所有的EBGP和IBGP
IBGP学习到的路由不会发给IBGP 解决办法:1.BGP全互联,RR反射器
路由宣告*
network优先级大于import network引入优先级与import引入优先级相同
network方式 [i]
import方法 [?]
BGP下一跳*
- BGP在给邻居传递路由时的下一跳=更新源 [建立邻居使用物理口那么更新源为物理口 环回口就是环回口]
- 在EBGP间传递时会修改下一跳为自己的更新源
- 在IBGP间传递时不会修改下一跳为自己的更新源
peer 2.2.2.2 next-hop-local //修改下一跳更新源为自己 对IBGP生效
修改BGP下一跳配置实验
使用环回口建立的EBGP R2传递R3的路由给R1时,不会修改路由下一跳
# R2配置
bgp 100
address-family ipv4
peer 1.1.1.1 next-hop-local
配置验证
BGP防环机制*
| 场景 | 防环机制 |
|---|---|
| AS内-IBGP | 水平分割 |
| AS间-EBGP | AS_Path |
- 水平分割:从IBGP收到的路由不会发布给IBGP邻居,即IBGP路由只传一跳
解决RTD接收不到路由的问题
- IBGP邻居全互联: 配置,维护开销会很大
- RR反射器(Route-Reflector)
- 联盟/联邦(Confederation)
AS_Path
BGP路由内的重要属性,代表该路由所经过的AS号,如果接收路由器发现所包含的AS号与本地AS号一致,则丢弃
BGP路由聚合*
BGP静态聚合
通过配置静态路由汇总明细路由,再用network进行宣告
BGP自动聚合[缺陷]
- 对引入的IGP路由进行主类掩码聚合 /8 /16 /24
- 而原引入的路由被抑制,不会被优选和发布给BGP邻居
summary automatic // 开启自动聚合,缺省关闭
BGP手动聚合
- 对引入和本地路由进行聚合
- 手动聚合>自动聚合
aggregate 172.16.0.0 255.255.252.0 // 缺省聚合和明细同时发布
// detail-suppressed 抑制发布明细路由
// as-set 保留原有明细路由的AS-PATH属性
BGP手动聚合配置实验
# 路由通告者
ip route-static 172.16.0.0 24 NULL0
ip route-static 172.16.1.0 24 NULL0
ip route-static 172.16.2.0 24 NULL0
ip prefix-list ip index 10 permit 172.16.1.0 24
ip prefix-list ip index 20 permit 172.16.2.0 24
route-policy 1 permit node 10
if-match ip address prefix-list ip
bgp 100
address-family ipv4 unicast
network 172.16.0.0 24
network 172.16.1.0 24
network 172.16.2.0 24
aggregate 172.16.0.0 255.255.0.0 suppress-policy 1
s代表被抑制的路由条目
邻居路由表
BGP路由属性*
| 属性分类 | 备注 |
|---|---|
| 公认必遵 | 所有BGP设备都可以识别且必须存在于Update报文中 |
| 公认认意 | 所有BGP设备都可以识别但不要求必须存在于Update报文中 |
| 可选过渡 | BGP设备可以不识别如果不识别仍然可以传递给邻居 |
| 可选非过渡 | BGP设备可以不识别如果无法识别丢弃该属性 |
PrefVal 优选值 [路由接收者修改本地路由优先级]
- 私有属性,代表本地路由的优先级
- 仅本地有效,不会传播给任何BGP邻居
- 越大越优先 默认0 范围0-65535
- 影响自己
route-policy bgp_policy permit node 10
apply preferred-value 100 // 修改匹配路由条目的本地优先级 Specify a preferred value for BGP routes
Origin起源 BGP路由生成方式
| 代码 | 备注 |
|---|---|
| i=IGP | 通过network宣告的路由 |
| e=EGP | 通过EGP学习到的路由 |
| ?=incomplete | 通过import引入的路由 |
| 优先级 i>e>? |
AS_PATH AS路径,BGP路由在传输的路径中所经历的AS列表
- EBGP传递更新(加入本地AS号码)
- 丢弃AS_PATH属性中包含本AS Number的路由(防止AS间环路)
- AS数量越少越优先
Next Hop下一跳=更新源
Local-Prefernce 本地优先级[传递路由者修改优先级]
- 只传播给IBGP邻居(AS内)
- 越大越优先 默认100
- 影响AS内部IBGP邻居的路由决策(出站路由-怎么离开AS)
MED Multi-Exit-DISC 相当于IGP的度量值
- 区别到达同一邻居AS的多条入口链路
- 越小越优先
- 仅在相邻两个AS之间传递,不会跨AS传递
- 影响AS外部EBGP邻居的路由决策(入站路由-进入AS)
route-policy bgp_policy permit node 10
apply cost 100 // 设置IGP度量值
- ⚠️ 缺省情况下,不允许比较来自不同AS邻居的路由信息的MED值,除非能够确认不同的AS采用了同样的IGP和路由选择方式,则可以使用以下命令
compare-different-as-med // 比较不同AS邻居的MED值
属性总结
BGP选路原则*
BGP不像IGP,本身并没有路由算法,而是结合丰富的属性进行选路
-
BGP路由选择有三种情况
- ✅ 该路由是到达目的地的唯一路由,直接优选
- ✅ 对到达同一目的地的多条路由,优选优先级最高的
- ✅ 对到达同一目的地且具有相同优先级的多条路由,使用更细的原则比较
-
BGP路由优选规则
- 1️⃣ 丢弃下一跳不可达到达路由
- 2️⃣ 优选Preference_Value最高的路由(私有属性,仅本地有效)*
- 3️⃣ 优选Local_Preference最高的路由*
- 4️⃣ 优选手动聚合>自动聚合>network>import>从对等体学习到的
- 5️⃣ 优选AS_PATH最短的路由*
- 6️⃣ 起源类型IGP>EGP>Incomplete
- 7️⃣ 对于来自同一AS的路由 优选MED最小的*
- 8️⃣ 优选从EBGP学来的路由 (EBGP>IBGP) 【能走外边优先走外边】
- 9️⃣ 优选AS内部IGP的Metir最小的路由 【选择内部开销最小的路由】
- 🔟 优选Cluster_List最短的路由 【路由反射器】
- 🔟1️⃣ 优选Orginator_ID最小的路由 【路由反射器】
- 🔟2️⃣ 优选Router_ID最小的路由器发布的路由
- 🔟3️⃣ 优选IP地址最小的邻居学来的路由
⚠️ 如果比较到第九条全部相同,则为等价路由,可以负载分担(默认关闭,且AS_PATH必须一致)
-
P L L A O M N I
- P PrefVal本地优先级
- L Local_Pre本地优先级
- L Local Route本端路由
- A AS_path AS_path最短路径
- O Origin 起源类型 IGP>EGP>incomplete
- M MED
- N Neighbor Type
- I IGP
负载分担相关命令
maximum load-balancing <1-8> // 配置最多支持的负载数量
address-family ipv4
balance <1-32> // 配置最多支持负载数量
路由属性修改默认值
| 命令 | 备注 |
|---|---|
| peer 2.2.2.2 preferred-value 100 | 配置从邻居接口路由的优选值,默认0 |
| default local-preference 200 | 配置本地优先级,默认100 |
| default med 100 | 配置MED,默认0,仅对import和聚合生效 |
BGP负载分担配置实验
R1-R2取消ospf cost50配置 然后开启BGP负载分担功能 然后R1-R4链路 R2/R3负载分担
# R1-BGP配置
bgp 123
peer 2.2.2.2 as-number 123
peer 2.2.2.2 connect-interface LoopBack0
peer 3.3.3.3 as-number 123
peer 3.3.3.3 connect-interface LoopBack0
peer 15.0.0.5 as-number 5
#
address-family ipv4 unicast
balance 2
peer 2.2.2.2 enable
peer 2.2.2.2 next-hop-local
peer 3.3.3.3 enable
peer 3.3.3.3 next-hop-local
peer 15.0.0.5 enable
#
配置验证
BGP路由过滤
相关命令
# 对宣告或接收的路由过滤
filter-policy 2000 export/import
peer 2.2.2.2 filter-policy 2000 export/import
peer 2.2.2.2 as-path-filter 2001 export/import
peer 2.2.2.2 ip-prefix ip_address export/import
peer 2.2.2.2 route-policy 3000 export/import
# 如果同时配置,根据表格顺序进行过滤
AS-path-filter AS过滤器
- 利用BGP路由携带的AS_path路径进行过滤
- 使用正则表达式来定义匹配规则
相关命令
- ip as-path-filter 1 permit 123$
- ip as-path-filter 2 permit .*
BGP团体属性 Community*
- BGP私有属性,在BGP对等体之间传播,且不受AS的限制
- 利用团体属性可以使多个AS中的一组BGP设备共享相同的策略
- 简化路由策略的应用和降低维护管理的难度
公认团体属性*
| 属性名称 | 备注 |
|---|---|
| Internet | 向任何BGP邻居宣告 |
| No_Advertise | 不向任何BGP邻居宣告 |
| No_Export | 不向EBGP邻居宣告,但可以向联盟内EBGP邻居宣告 |
| No_Export_Subconfed | 不会向任何EBGP邻居宣告 |
私有团体属性
- 自定义规则和应用方法 例如AS:Number
- 一条路由可以携带多个团体属性值
相关配置
peer 2.2.2.2 advertise-community // 配置将团体属性发布给邻居 默认不发布
ip community-filter 1 deny internet // 配置属性过滤器
ip community-filter 100 permit 100:1
router-policy rp permit node 10 // 配置路由策略
if-match community-filter 1 // 匹配团体属性过滤器
apply community no-advertise // 修改团体属性
display bgp routing-table community // 查看带有团体属性的路由
BGP复位操作
reset bgp all // 复位bgp所有连接
reset bgp as-number // 复位与指定as间的bgp连接
reset bgp x.x.x.x // 复位与指定邻居的连接
reset bgp internal // 复位所有IBGP连接
reset bgp external // 复位所有EBGP连接
refresh bgp all // 刷新bgp所有