作者:BSXY_19计科_陈永跃 BSXY_信息学院 注:未经允许禁止转发任何内容
1、OSPF基础
在EGP协议中,引入了AS(Autonomous System,自治系统)的概念。AS是指由同一个技术管理机构管理,使用统一选路策略的一些路由器的集合。
AS的内部使用IGP来计算和发现路由,同一个AS内部的路由器之间是相互信任的因此IGP的路由计算和信息泛洪完全处于开放状态,人工干预很少。
不同AS之间的连接需求推动了外部网关协议的发展,BGP作为一种外部网关协议用于在AS之间进行路由控制和优选。
首先大类上的路由协议分为蓝色字体IGP(内部网关协议)和EGP(外部网关协议)。
- 在外部网关协议里面才真正有AS(Autonomous System)的概念,也就是说只有EGP的路由协议才和AS真正打交道。IGP不牵扯到AS的概念,因为他们都是在一个AS内,所以不用关系到底在那个AS内
- AS是属于一个管理机构(运营商,互联网公司)下的,使用统一的选路策略的一些路由器的集合
- AS的内部使用IGP来计算和发现路由,同一个AS内部的路由器之间是互相信任的,因为你要想,一个AS 内,我们运行OSPF或IS-IS都是一个企业内部或者园区网。因此IGP的路由计算和信息泛洪完全处于放状 态,人工干预很少(通是主要目的,大部分企业的内部网络路由选路也不会很复杂)
- BGP是一个AS下可以进行跨地域的,并且不同AS之间如何传递路由,例如三大运营商,他们的路由必须是 互通的,不然电信的网只能访问电信的服务,这不是扯吗,因此呢,牵扯到一个大规模的非常巨型的网络。这是需要非常复杂的选路策略和路由特性才能满足这些需求
BGP的基本作用
- AS内部使用IGP来计算和发现路由,如OSPF,ISIS,RIP
- AS之间使用BGP来传递和控制路由(一个AS内是有大量的路由,因此,必须在AS之间运行一个能够支 撑大量路由,并且控制选路的技术)
- 不同的AS内有企业,运营商。只不过在一个AS内,有很多企业。可能也很复杂,但一个AS是要把AS内所有公网路由汇总传递出去给其他AS
AS自治系统
- 在internet中,AS是指在一个实体管辖下的拥有相同选路策略的IP网络
- AS号范围:
AS号的类别 | 2字节AS号 | 4字节AS号 |
---|---|---|
公用AS号 | 1-64511 | 1-64511,65536-4294967295 |
私有AS号 | 64512-65534 | 4200000000–4294967294 |
- 为什么有私有AS,这是为了联盟技术。专门给联盟使用
- 国内较有名的AS号:中国电信163(4134),中国电信CN2(4809),中国网通(9929)
- AS号同时在BGP中还有关键性的作用:最佳路由选举,避免环路,路由过滤
BGP版本
- 早期发布的三个版本分别为BGP-1(RFC1105),BGP-2(RFC1163)和BGP-3(RFC1267)。在1994 年开始使用BGP-4(RFC1771),2006年后单播IPv4网络使用的版本是BGP-4(RFC4271),其他网络,如IPv6,组播等使用的版本是MP-BGP(RFC4760)
- MP-BGP是对BGP-4进行了扩展,来达到在不同网络中应用的目的,BGP-4原有的消息机制和路由机制并 没有改变
- MP-BGP在IPv6单播网络上应用称之为BGP4+,在IPv4组播网络上应用称为MBGP(Multicast BGP)
BGP特点
- 采用认证和GTSM的方式,保证了网络的安全性
- 提供了丰富的路由属性,能够进行灵活的路由选路
- 提供了路由聚合(自动&手动)和路由衰减功能用于防止路由震荡(惩罚机制),有效提高网络的稳定性
- 使用TCP端口号=179(TCP原生就是可靠的),并支持与BFD联动,BGPTraking,BGP GR和NSR,提高网络的可靠性
- 在邻居数目多,路由量大且大部分邻居具有相同出口策略的场景下,使用按组打包技术极大的提高了打包发包性能(批量功能)
- 仅增量式(增加或减少),触发式(有变化发)更新。BGP承载的路由太多了,所以没有周期性更新
- BGP的下一跳永远只有一个。(多个下一跳中比较,永远默认只选一个,13条选路规则死活会比出一个。 可以手动改)
使用与不使用BGP的原因
使用BGP的理由:
- 大量的路由需要承载,IGP只能容纳千条,而BGP可以容纳上万甚至几十万
- 支持MPLS/VPN的应用(ISP主流VPN技术)。传递客户VPN路由
- 策略能力强,可以很好的实现路由决策与数据控制。(BGP有很多路由属性,所以可以用很多策略来 进行调整)
什么情况下尽量不要使用BGP:
- 设备不够强
- 中小型企业没有必要
- 管理员本身能力不足时,特别是对路由策略理解不透彻
命令 | 备注 |
---|---|
Peer ip connect-interface int | 配置指定更新源 |
Peer ip ebgp-max-hop n | 配置eBGP的TTL,缺省=1 |
- PS:建立eBGP邻居关系时,推荐使用直连接口IP地址
- PS:建立iBGP邻居关系时,推荐使用环回口IP地址
BGP身份验证
- 启用验证后,会在所有数据报文内启用
- 加密后,具体是在TCP的Options字段实现加密
命令 | 备注 |
---|---|
peer ip psaaword cipher n | 配置身份验证,采用加密方式 |
2、BGP报文
BGP报文结构和类型
- BGP所有报文都封装在TCP后面,以单播形式发送的。(单播才可靠)(保证身份正确)
- BGP有5种数据包类型,和OSPF差不多,BGP数据包也分头部(header)和数据包类型(packet)
BGP头部 | 备注 |
---|---|
Marker | 固定的值,32个大B的F |
Length | BGP数据包长度 |
Type | BGP数据包类型 |
BGP数据包类型 | 备注 |
Open | 类似Hello包,包含关键参数(RID,AS,版本,超时时间,支持的功能)用于建立 邻居关系。三次握手后发送,只发一次 |
Update | 路由更新,包含丰富的路由属性 |
Notification | 当检测到错误,发送后关闭BGP连接(说白了就是配置出错,BGP发起关闭三次握手) |
Keepalive | 类似Hello包,用于维护邻居关系会话,默认发送周期60s。保持时间180s,最少三倍 的时间间隔 |
Route-refresh | 当路由策略发送变化时,触发请求邻居重新通告路由(主动行为)。 可以通过手动请求操作,让邻居把路由更新重新发送,分为im/export方向。 import:向邻居请求路由刷新。 export:给邻居发送路由更新。 |
BGP状态
类型 | 备注 |
---|---|
Idle | 初始,路由器查找路由表,是否有到达邻居的路由。《重置,问题错误时,也会回到idle状态。》 |
Connect | 发起TCP连接,等待TCP连接完成。《成功则发送Open数据包》 |
Active | TCP连接失败,继续尝试TCP连接 |
Open Sent | TCP连接成功,以发送Open数据包 |
Open Confirm | 以收到邻居正确的Open数据包。《这个时候就叫Open confirm》如果没有收到,会进入active。收到错误进入idle |
Established | 收到Keeplive后,邻居建立完成,开始传递路由 |
BGP正常会话建立流程图:
- 初始状态都是idle,当我们查找到路由后,b第一次TCP握手发送出去后,会进入connect,a收到TCP报文后回复确认时,同样进入connect,这个状态是转瞬即逝,正常情况下三次握手成功后进入open sent状态。如果失败就进入active
- b向a出第一个open包,这证明了两件事,第一个就是三次握手成功。第二个就是B进入了open sent状态。同样a三次握手完成后,同样给b发送了open包,然后进入open sent状态。同时a收到b的open包, 进入open confirm状态,b收到a的open包,也同样进入open confirm状态。(前提是open包参数是没有问题的)
- a和b同时进入open confirm状态后,互相发送keeplive包,互相收到后,进入established。成功建立BGP会话,邻居正式建立,可以开始传递路由
- 正常BGP邻居建立完成后,周期性发送keeplive用于保证BGP会话正常。剩下的有update,route-refresh 就正常发送。如果有错误会发送notification,然后终止BGP会话连接
BGP状态交互图:
正常情况:
- Idle-connect(三次握手)-open sent(发送open包)-open confirm(发送keeplive包)-established(邻居建立)
错误情况:
- connect三次握手连接成功,那么进入opensent,失败则进入active。active有重连计时器,connect也有。connect发送握手开始后,重连计时器会开始倒计时,在超时时间前还是没有成功连接,那么会进入active,active 如果也失败了,那么他会不断进行重试(所有的TCP连接失败都会进入active)。但active自己也他重连计时器,在 连续的几次重试连接都失败后,重连计时器时间到了以后,就会回到connect状态
- connect和active会不断尝试,只要成功就会进入open sent
- 这边可以理解为三种情况,一种是成功,一种是失败,一种是超时(计时器时间到了)
- Open confirm也有计时器,计时器用于收到对方keeplive包,如果在超时前没有收到邻居的keeplive包,一样不会进入establis
- established的计时器用于持续发送keeplive包,如果对端在计时器超时后没有回复,则断开BGP连接
- Open sent,open confirm,established状态中,发生任何的错误都会回到idle状态
状态图解:
BGP中active故障可能存在的情况:
BGP数据库:
类型 | 备注 |
---|---|
BGP邻居表 | BGP邻居数据库 |
BGP路由表 | |
(转发数据库) | 列出从BGP邻居那里获取到的路由及属性 |
IP路由表 | 列出最佳路由 |
Adj-RIB-in (邻居路由信息表-入) | BGP邻居宣告给本地的未处理的路由信息库 |
Adj-RIB-out (邻居路由信息表-出) | 本地宣告给指定邻居的路由信息库 |
BGP路由信息处理过程
- 一台路由器收到BGP路由发来的更新后,先放在adj-rip-in信息表中(相当于缓存的存储模块)
- 为什么要放在这里,因为往往BGP会有入方向的路由策略。那么这个时候,我们要把adj-rib-in中的路由经过路由策略的处理后,再经过路径选择,放到本地数据库(BGP路由表),BGP路由表经过选路才会把最优路由放置到IP路由表
- 当要把更新发布给邻居时,会从BGP路由表提取出最优路由。当然会有出方向的策略。经过出方向策略处理,处理完的路由放置到adj-rip-out信息表,最后在发布给邻居
3、BGP案例
BGP路由宣告原则
- BGP协议本身不发现路由(BGP没有发现路由的机制,也没有计算路由的算法。他只是把其他路由协议 引入到自己的路由表)
- 只有明确宣告的路由才会发布给邻居。(单独的命令去宣告路由,BGP邻居建立和宣告是互相独立的)
- 宣告的路由必须能精确地在路由表中找到。(在IP路由中能找到精确的路由,掩码要一模一样的路由才能宣告)
- 多条路径时,只选取最优的给自己使用和发布给邻居。(只有在BGP路由表中的路由,才会发布给邻居和 自己使用,前提此路由是最优的)
- 从iBGP学到的路由会发布给eBGP。(内部会发送给外部)
- 从eBGP学到的路由会发布给所eBGP和iBGP。(外部会发送到内部)
- 从iBGP学到的路由不会发布给iBGP。(内部不会发送给内部)(防环机制)
路由宣布/引入
宣告方式:
方式 | 备注 |
---|---|
Network | 逐条将IP路由表中已存在的路由引入到BGP路由表中 |
Import | 将直连,静态,OSPF,IS-IS,RIP等协议通过import引入到BGP路由中 |
PS | 在相同路由宣告情况下,路由表项会存在。但Network优先级大于import。i>? |
PS | BGP本身没有发现路由机制,都是靠以上两种方法引入 |
引入配置命令:
命令 | 备注 |
---|---|
network IP mask | 宣告路由,需精确匹配并在路由表中存在 |
import route-protocol Route-Policy | 引入其他路由,通常结合路由策略使用 |
default-route imported | 允许引入缺省路由,默认不允许 |
Peer IP default-route-advertise | 向邻居宣告一条缺省路由,不论本地是否存在 |
dis BGP routing-table | 查看BGP路由表 |
引入案例
Network方式:
Import方式:
BGP路由表
- 除了Network,剩下的都可以称为属性
- 在BGP路由表中,标志各种属性说明
- *:有效的。//没有代表无效的路由
- “>”:最佳路由。//没有代表不是最佳路由
- 左i:表示iBGP,没写表示eBGP
- Network:目标地址
- Nexthop:下一跳,全0表示自己
- MED:外部路由保留开销
- Local-Preference:本地优先级
- PrefVal:优先值
- Path/Ogn:路径=经过的AS / 标志:i=network宣告,e=EGP ,?=引入。i>e>?/dz
BGP下一跳
- BGP在给邻居传递路由时的下一跳=更新源
- 在eBGP之间传递路由时,会修改下一跳为自己的更新源。(外部路由传递)
- 在iBGP之间传递路由时,不会修改下一跳为自己的更新源。保留原更新源。(iBGP传递路由时,下一跳本 来是多少就是多少,不会改变,除了是全0,0就是自己,所以写自己为更新源。)
- iBGP下一跳命令:
命令 | 备注 |
---|---|
Peer IP next-hop-local | 修改下一跳更新源为自己。 |
PS | 在iBGP间最好启用,加了不会有问题,不加可能会有问题。百利而无一 |
BGP下一跳案例
-
eBGP:R5把5/32传递给R6时,5/32的下一跳为R5。R6把5/32再传递到R7,这时候因为是eBGP,所以会把5/32的下一跳修改为R6。R7就能正常访问5/32。
-
iBGP:R7把7/32传递给R6时,7/32的下一跳为R7,R6再把7/32传递给R5,但是由于是iBGP,R6传递给R5时,并不会把下一跳修改成R6自己,而是继续保留R7为下一跳。所以7/32这条路由在R5是不可达,不生效的。
-
为什么要这样子区分?主要目的还是为了防环。但这样的设计往往会导致我们学习到的路由不可用。
特殊现象: -
如下图所示,当BGP互联时属于MA网络环境时。b,c,d同处于同个网段。c和d之间是iBGP。b和c是eBGP。
-
如果c宣告3/32,R2学到的地址为b发布的。但是如果是d发布的4/32呢?这里的情况有点类似OSPF中fa地址。
解决方案:
- 当c收到d宣告的4/32时,会将该更新发往b,但是c会检测到,目的地址和自己处于同个网段内,所以他会自己把地址修改成d的,然后发送给b。这样子b自己找d就行,所以R2学到的4/32是d的地址。
- 路由的本质是转发,就是要从一个口收到的数据通过查找路由表,在从另外一个端口转发出去。下图所示情况,就是让d把数据交给c,c交给b。但b可以直接找到d,没必要多转发一下。所以这里BGP协议很聪明,他会自动纠正
4、BGP属性
BGP防环机制
场景 | 备注 |
---|---|
AS内-iBGP | 水平分割 |
AS间-eBGP | AS_Path |
- AS内-水平分割:从iBGP学到的路由不会在传递给iBGP邻居,即iBGP路由只传一跳(次)
如下图所示,AS12的路由传递到RTA,RTA传递给RTB和RTC,B和C都不会传递给RTD。这就是水平分割,因为如果传给D,那么两端都传递,是否会造成路由环路,要知道在ISP内,网络环境及其复杂
所以如果要解决RTD收不到AS12路由的问题,主要有以下几种解决方法:
- iBGP邻居全互联:配置,维护开销会很大
- 路由反射器(Route-Feflector)
- 联邦/联盟(Confederation)
AS间-AS_Path
BGP路由内的重要属性,代表该路由所经过的AS号,如果接收路由器发现所包含的AS号和本地AS号一致,则丢弃。此更新只在eBGP发送时才记录,iBGP内不记录
- AS_Path每经过一个AS,都会将AS号记录下来,当路由器再收到这条路由时,发现和本地AS号重复,则认为该路由重复,进行丢弃。(该原则可以打破,需手动配置)
BGP路由聚合
- BGP承载了大量的路由,则更需要汇总。汇总的必要性就是减少了路由器的路由表,这样子路由查找,资源的占用会减少,查找的速度也会更快。我们应该时时刻刻想到汇总技术。
- 路由聚合解决了两类问题,一是减轻了设备传输和计算路由所需资源的负担。二是隐藏了具体的的路由信息,减少了路由震荡的影响
BGP静态聚合
通过配置静态路由汇总明细路由,再用Network进行宣告
BGP自动聚合
- 对引入和本地路由进行聚合
- 手动聚合>自动聚合
命令 | 备注 |
---|---|
Aggregate IP Mask Detail-supperssed AS-set | 配置手动聚合,缺省情况聚合和明细一起发布。 抑制发布明细路由。 保留原有明细路由的AS_Path属性。 |
BGP聚合问题
- 路由聚合后,明细路由的AS_Path属性会丢失,存在产生环路的风险。(AS_Path丢失会导致路由环路)
- 这里需要在聚合时使用AS-set参数,保留AS_Path属性,当BGP路由回传时,BGP路由器看到设备相同的AS_Path属性则会进行丢弃,有效防止路由环路
- PS:如果路由聚合后携带所有明细路由经过的AS信息,当明细路由发生频繁震荡时,聚合路由也可能受到影响频繁刷新。因此,聚合路由是否携带丢失的AS_Path信息,需要设计者综合考虑网络环境
BGP路由属性