BGP的特征:
- BGP是外部路由协议,用来在AS之间传递路由信息。
- 是一种路径矢量(Path-Vector)矢量路由协议(AS_PATH)。
- 可靠的路由更新机制(TCP)(目的端口为179,源端口随机生成)
- 丰富的Metric度量方法(12条选路原则)。
- 从设计上避免了环路的发生
- 为路由附带属性信息。
- 支持CIDR(无类别域间选路)。
- 丰富的路由过滤和路由策略(router-policy)。
- 无需周期性的更新,只存在触发更新,并且值更新部分路由。
- 周期性(60s)的发送KeepAlive报文检测TCP的连通性。
路由算法分类:https://en.wikipedia.org/wiki/Routing_protocol
路径矢量路由协议(path-vector routing protocol )是一种网络路由协议,它维护动态更新的路径信息。通过网络循环并返回到同一节点的更新很容易被检测和丢弃。该算法有时用于 Bellman–Ford algorithm路由算法,以避免“数到无穷”问题。它不同于距离矢量路由和链路状态路由。路由表中的每个条目都包含目的地网络、下一个路由器和到达目的地的路径。
距离矢量路由协(distance-vector routing protocol):数据网络中的距离矢量路由协议根据距离确定数据包的最佳路由。距离向量路由协议通过分组必须通过的路由器数量来衡量距离,一个路由器算作一跳。一些距离矢量协议还考虑了网络延迟和影响给定路由上流量的其他因素。为了确定跨网络的最佳路由,在其上实现了距离矢量协议的路由器相互交换信息,通常是路由表加上目的地网络的跳跃计数,以及可能的其他交通信息。距离向量路由协议还要求路由器定期通知其邻居网络拓扑变化。距离矢量路由协议使用Bellman-Ford算法和Ford-Fulkerson算法来计算最佳路由。
https://en.wikipedia.org/wiki/Distance-vector_routing_protocol
链路状态路由协(Link-state routing protocols):是分组交换网络中用于计算机通信的两类主要路由协议之一,另一类是距离矢量路由协议。链路状态路由协议的例子包括开放最短路径优先(OSPF)和中间系统到中间系统(IS-IS)。链路状态协议由网络中的每个交换节点(即准备转发数据包的节点;在互联网中,这些被称为路由器)执行。
链路状态路由的基本概念是,每个节点以图的形式构建到网络的连接映射,显示哪些节点连接到哪些其他节点。然后,每个节点独立计算从它到网络中每个可能目的地的下一个最佳逻辑路径。然后,每个最佳路径集合将形成每个节点的路由表。这与距离矢量路由协议形成鲜明对比,距离矢量路由协议的工作原理是让每个节点与其邻居共享其路由表,在链路状态协议中,节点之间传递的唯一信息与连接性有关。链路状态算法有时被非正式地描述为每个路由器,“向世界讲述它的邻居”
BGP报文种类:
- Open:负责和对等体建立邻接关系。
- KeepAlive:该消息在对等体之间周期性地发送,用以维护TCP的连接。(60s)
- Update:该消息被用来在BGP对等体之间传递路由信息。(通告和撤销路由)
- Notification:当BGP Speacker检测到错误的时候,就发送给消息给对等体。
- Router-refresh:用来通知对等体自己支持路由刷新能力。
BGP邻居:
BGP的邻居关系:
- BGP邻居关系建立在TCP连接的基础之上。
- 可以通过IGP或静态路由来提供TCP连接的可达性。
注:BGP的邻居是通过单播的方式建立的,所以首先需要在BGP进程下手动配置邻接地址。BGP没有自动发现邻居的机制,只能手动建立。
BGP中影响邻居建立的条件:
- 停留在Idle状态。
- 没有到达Peer的路由条目。
- EBGP多跳。(不去发送TCP的建立连接报文)
- 停留在Connect或者Active状态。
- 源地址错误。(查看对端的IP地址是否是本地指定的邻居地址)
- TCP的认证。(TCP MD5)
- 有到达peer的路由,但是路由错误。
- 过滤了TCP的报文。
注:在华为中如果是通过默认路由的方式到达邻居,那么该邻居通告的所有路由都为无效路由。
关于BGP AS Number:
默认使用连个字节的AS number,可以扩展到四个字节。AS Number需要进行申请。
- 1- 64511//公有的AS Number范围。
- 64512~65535 //私有的AS Number范围。
BGP状态机:
Idle:BGP连接的第一个状态。在空闲状态,BGP在等待一个启动事件。启动事件出现以后,BGP初始化资源,复位连接重试计时器(Connect-Reitry),发起第一条TCP连接,同时转入Connect(连接)状态。
Connet:在此状态,BGP发起第一个TCP连接,如果连接失败,则进入到active状态。如果TCP连接成功,就转入OpenSent状态,如果TCP连接失败,就转入Active状态。
Active:在此状态,BGP总是在试图建立TCP连接,如果连接重试计时器(Connect-Retry)超时,就退回到Connect状态,如果TCP连接成功,就转入OpenSent状态,如果TCP连接失败,就继续保持在Active状态,并继续发起TCP连接。
OpenSent:在此状态,TCP连接已经建立,BGP也已经发送了第一个Open报文,剩下的工作,BGP就在等待其对等体发送Open报文,并对收到的Open报文进行正确性检测,如果有错误,系统就会发送一个条出错的通知消息并回退到Idle状态。如果没有错误,BGP就开始放KeepAlive报文,并复位KeepAlive计时器,开始计时。同时转入OpenConfirm状态。
OpenConfirm:在此状态,BGP等待一个KeepAlive报文,同时复位保持计时器,如果收到一个KeepAlive报文,就转入Established阶段,BGP邻居的关系就建立起来了。
Established:在此状态,BGP邻居关系已经建立,这时,BGP将和它的邻居们交换Update报文,同时复位保持计时器。
另外,在除Idle状态以外的其他五个状态出现任何ERROR的时候,BGP状态机就会回退到Idle状态。在BGP对等体建立的过程中,通常可见的三个状态是:Idle,Active,Established。
Idle状态下,BGP拒绝任何进入的连接请求,是BGP的初始状态。
BGP路由通告原则:
连接建立时,BGP Speaker只把本身用的最优路由通告给对等体。
多条路径时,BGP Speraker只选择最优的路由放入路由表。
BGP Speraker从EBGP获得路由会向它所有的BGP对等体通告(包括EBGP和IBGP)。
通告给EBGP时,下一跳为自己。(注:如果通告路由的EBGP邻居需要接收的的EBGP邻居在同一网段,则通告时不修改下一跳。)
通告给IBGP时,不更改下一跳。防止次优路径。
BGP Speraker从IBGP获得的路由不会通告给其他的IBGP邻居。
IBGP的水平分割原理:从一个IBGP邻居收到的路由条目不会再通告给其他IBGP邻居。
如果想让所有的IBGP邻居都能收到路由,有三种解决方案:
- 全互联(每两台设备之间都建立IBGP邻居)。
- RP(路由反射器)。
- 联盟
BGP与IGP的同步。从IBGP邻居学来的路由信息:
如果同步关闭:会将从IBGP学到的路由传给eBGP邻居
如果同步开启:BGP不将从IBGP对等体获得的路由通告给它的EBGP对等体,除非该路由信息也能通过IGP获得。
先查找自己的IGP。如果IGP里面有这个网络,就把这个网络传给eBGP;如果IGP里面没有这个网络,就不会传给eBGP邻居。
所有厂商同步功能默认关闭。华为不支持开启,思科可以开启。
BGP同步规则的目的:
防止一个AS(不是所有的路由器都运行bgp)内部出现路由黑洞,即向外部通告了一个本AS不可达的虚假的路由.
BGP路由信息处理:
BGP路由信息处理:
- 当从对等体接收到更新数据包时,路由器会把这些更新数据包存储到路由选择信息库(Routing Information Base, RIB)中,并指明是来自哪个对等体的(Adj-RIB-In)。这些更新数据包被输入策略引擎过滤后,路由器将会执行路径选择算法,来为每一条前缀确定最佳路径。
- 得出的最佳路径被存储到本地BGP RIB (Loc-RIB)中,然后被提交给本地IP路由选择表(IP-RIB),以用作安装考虑。
- 除了从对等体接收来的最佳路径外,Loc-RIB也会包含当前路由器注入的(被称为本地发起的路由),并被选择为最佳路径的BGP前缀。Loc-RIB中的内容在被通告给其他对等体之前,必须通过输出策略引擎。只有那些成功通过输出策略引擎的路由,才会被安装到输出RIB (Adj-RIB-Out)中。
BGP路径属性(12条):
BGP作为一个策略工具,主要作用是实现AS间的路由信息传递。BGP就是结合丰富的路径属性,很好的控制路由信息的传递,从而实现路径的选择。
BGP属性分类(四类):
公认必遵(Well-known mandatory)公认强制
所有BGP路由器都可以识别,且必须存在于Update消息中。如果缺少这种属性,路由信息就会出错。
- origin
- as_path
- next hop
公认任意(Well-known discretionary)公认非强制
所有BGP路由器都可以识别,但不要求必须存在于Update消息中,可以根据具体情况来决定是否添加到Update消息中。
- Local-Preference
- Atomic-Aggregate(as-set)原子聚合//标识汇总路由
- MP Reach NLRI
可选过渡(Optional transitive)
BGP的路由器可以选择是否在Update消息中携带这种路由属性。接收的路由器如果不识别这种属性,可以转发个邻居路由器,邻居路由器可能会识别并使用到这种属性。
- Aggreagator//聚合者,标识聚合路由的来源AS和聚合者。通告汇总设备的Router-ID。
- Community
- Extended-Communities
可选非过渡(Optional non-transitive)
BGP路由器可以选择是否在Update消息中携带这种属性。在整个路由发布的路径上,如果部分路由器不能识别该属性,可能会导致该属性无法发挥效用。因此接收的路由器如果不识别这种属性,将丢弃这种属性,不必在转发给邻居路由器。
- MED(cost)
- Originator-ID//标识路由的来源设备
- Cluster-List//防止路由的反射回路
Oeigin
Origin属性用来定义路径信息的来源,标记一条路由是怎么成为BGP路由的。它有以下3种类型:
- IGP:具有最高的优先级。通过路由始发AS的IGP得到的路由信息,比如通过network命令注入到BGP路由表的路由,其Origin属性为IGP。
- EGP:优先级次之。通过EGP得到的路由信息,其Origin属性为EGP。
- Incomplete:优先级最低。通过其他方式学习到的路由信息。比如BGP通过import-route命令引入的路由,其Origin属性为Incomplete。
AS_Path
AS_Path属性按矢量顺序记录了某条路由从本地到目的地址所要经过的所有AS编号。当BGP路由器从EBGP对等体接收路由时,如果发现AS_Path列表中有本AS号,则不接收该路由,从而避免了AS间的路由环路。
- 当BGP Speaker本地通告一条路由时:
- 当BGP Speaker将这条路由通告到其他AS时,便会将本地AS号添加在AS_Path列表中,并通过Update消息通告给邻居路由器。
- 当BGP Speaker将这条路由通告到本地AS时,便会在Update消息中创建一个空的AS_Path列表。
- 当BGP Speaker传播从其他BGP Speaker的Update消息中学习到的路由时:
- 当BGP Speaker将这条路由通告到其他AS时,便会把本地AS编号添加在AS_Path列表的最前面(最左面)。收到此路由的BGP路由器根据AS_Path属性就可以知道去目的地址所要经过的AS。离本地AS最近的相邻AS号排在前面,其他AS号按顺序依次排列。
- 当BGP Speaker将这条路由通告到本地AS时,不会改变这条路由相关的AS_Path属性。
AS-path属性的类型:
- AS-Set :由一系列AS号无序的组成,包含在Update消息中。
- AS-sequence:由一系列AS号顺序的组成,包含在update消息中。
- AS-confed-sequence:在本地联盟内由一系列ad号按顺序地组成,包含在Update消息中,只能在本地联盟内传递。
- AS-confed-set:在本地联盟中由一系列AS号无序的组成,包含在Update消息中。只能在本地联盟内传递。
Next_Hop
Next_Hop属性记录了路由的下一跳信息。BGP的下一跳属性和IGP的有所不同,不一定就是邻居设备的IP地址。通常情况下,Next_Hop属性遵循下面的规则:
- BGP Speaker将本地始发路由发布给IBGP对等体时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
- BGP Speaker在向EBGP对等体发布某条路由时,会把该路由信息的下一跳属性设置为本地与对端建立BGP邻居关系的接口地址。
- BGP Speaker在向IBGP对等体发布从EBGP对等体学来的路由时,并不改变该路由信息的下一跳属性。
Local_Pref
- 该属性仅在IBGP对等体之间有效,不通告给其他AS。它表明路由器的BGP优先级。
- 该属性用于判断流量离开AS时的最佳路由。当BGP路由器通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择Local_Pref属性值较高的路由。
MED
MED属性用于判断流量进入AS时的最佳路由,当一个运行BGP的设备通过不同的EBGP对等体得到目的地址相同但下一跳不同的多条路由时,在其它条件相同的情况下,将优先选择MED 值较小者作为最佳路由。
MED属性仅在相邻两个AS之间传递,收到此属性的AS一方不会再将其通告给任何其他第三方AS。MED属性可以手动配置,如果路由没有配置MED属性,BGP选路时将该路由的MED值按缺省值0来处理。
团体属性
团体属性是一组有相同特征的目的地址的集合。团体属性用一组以4字节为单位的列表来表示,设备中团体属性的格式是aa:nn或团体号。
- aa:nn:aa和nn的取值范围都是0~65535,管理员可根据实际情况设置具体数值。通常aa表示自治系统AS编号,nn是管理员定义的团体属性标识。例如,来自AS100的一条路由,管理员定义的团体属性标识是1,则该路由的团体属性格式是100:1。
- 团体号:团体号是0~4294967295的整数。RFC1997中定义,0(0x00000000)~65535(0x0000FFFF)和4294901760(0xFFFF0000)~4294967295(0xFFFFFFFF)是预留的。
团体属性用来简化路由策略的应用和降低维护管理的难度,利用团体可以使多个AS中的一组BGP设备共享相同的策略。团体是一个路由属性,在BGP对等体之间传播,且不受AS的限制。BGP设备在将带有团体属性的路由发布给其它对等体之前,可以先改变此路由原有的团体属性。
公认团体属性
- Internet:缺省情况下,所有的路由都属于Internet团体。具有此属性的路由可以被通告给所有的BGP对等体。
- No_Advertise:具有此属性的路由在收到后,不能被通告给任何其他的BGP对等体。
- No_Export:具有此属性的路由在收到后,不能被发布到本地AS之外。如果使用了联盟,则不能被发布到联盟之外,但可以发布给联盟中的其他子AS。
- No_Export_Subconfed:具有此属性的路由在收到后,不能被发布到本地AS之外,也不能发布到联盟中的其他子AS。
BGP选路规则:
当到达同一目的地存在多条路由时,BGP依照如下策略顺序进行路由选择:
- 如果此路由的下一跳不可达,忽略此路由。
- 优选协议首选值(PrefVal)最高的路由。
- 优选本地优先级(Local_Pref)最高的路由。
- 优选本地生成的路由。
- 优选AS路径最短的路由。
- 比较Origin属性,依稀选Origin类型为IGP、EGP、Incomplete的路由。
- 优选MED值最小的路由。
- 优选从EBGP邻居学来的路由(EBGP路由优先级高于IBGP路由)
- 优选到下一跳IGP Metric较小的路由。
- 优选Cluster_List最短的路由。
- 优选Router ID最小的路由器发布的路由。
- 比较对等体的IP address,优选从具有较小IP地址的对等体学来的路由。
BGP路由汇总:
自动汇总:
开启BGP自动汇总后,只能针对重分发的进BGP的外部路由做自动汇总,并且只汇总成主类路由。
手动汇总:
手动汇总优先于自动汇总。
detail-suppressed //抑制明细路由。
suppress-policy //指定抑制哪些明细路由。
origin-policy //配置起源策略,针对哪些类型的路由做汇总,可以匹配属性。
as-set //用于汇总路由基础明细路由的AS-Path属性,防止环路问题。
注:如果汇总的明细路由来自不同AS,则汇总路由继承的明细路由AS—path属性标识为无序。
如果明细路由来自同一个as,则汇总继承的明细路由AS-Path为有序。
attribute-poliy //为汇总路由配置属性。
BGP路由表中的”s”标记表示该路由条目被抑制,并且此路由不能通告给邻居。
汇总路由的属性继承:
在华为中如果手工汇总并且不携带“detail-suppressed”参数,汇总路由会继承明细路由的community和origin属性。
- community属性:将明细路由中所有community属性汇总,作为汇总路由的community属性。
- origin属性:继承明细路由中起源最低的属性。
在华为中如果手工汇总并且携带“detail-suppressed”参数,抑制明细路由的同时会追加Atomic-aggregate属性,该属性标识汇总路由属性丢失。如果Atomic-aggregate属性被设置,则不会继承明细路由的community 属性。
BGP路由过滤:
理由前缀列表实现路由过滤。
peer 13.1.1.1 ip-prefix bgp import
利用filter-policy实现路由过滤
peer 13.1.1.1 filter-policy 2000 import
as-path-filter过滤路由
ip as-path-filter as deny 1000
ip as-path-filter as permit .*
peer 13.1.1.1 as-path-filter import
正则表达式:
- 正则表达式知识BGP过滤的一种方法。
- 正则表达式是按照一定的规则来匹配字符串的公式。基于这些字符串对BGP的as-path属性做出判断(接收或拒绝)。实际上可以认为他是一个as-path的acl。
- 正则表达式可以定义为多个permit或deny语句。语句与语句之间的关系是或 的关系。
正则表达式字符:
符号 | 说明 | |
---|---|---|
^ | 匹配一个字符串的开始。如^200表是只匹配as-path的第一个值为200. | |
$ | 匹配一个子符串的结束。如200$表示只匹配as-path的最后一个值为200. | |
. | 匹配任何单个字符,包括空格。 | |
匹配前面的一个字符或者一个序列,可以一次或者多次出现。 | ||
_ | 匹配一个符号。如逗号,括号,空格符号等。 | |
* | 匹配前面的一个字符或者一个序列,可以零次或多次出现。 | |
匹配变化的AS或者一个独立的匹配,通常和“ \ | ”一起使用 | |
\ | 逻辑或 | |
[ ] | 匹配一个范围内得as,通常和“ - ” 一起使用。 | |
- | 连接符。 |
BGP反射器:
路由反射器的反射原则(非非不传):
- 从EBGP邻居收到的EBGP路由可以反射给客户端、非客户端和其他的EBGP邻居。
- 从IBGP非客户端邻居收到的IBGP路由可以反射给客户端和其他的EBGP邻居,不能反射给非客户端。
- 从IBGP客户端邻居收到的IBGP路由可以反射给客户单、非客户端和其他EBGP邻居。
对等体之间的关系:
- Client只需维护与RR之间的IBGP会话。
- RR与RR之间需建立IBGP的全互联。
- Non-Client和Non-Client之间需建立IBGP全互联。
- RR与Non-Client之间需建立IBGP全互联。
Cluster List:
只有经过RR反射的路由才会携带Cluster_list和起源ID属性。
cluster-list属性的目的是为了防止在RR之间反射的路由环路,如果RR收到的路由条目中携带cluster-list属性,并且在列表中包含自己的cluster-id,则丢弃路由。如果不包含则接收并继续反射路由,同时追加自己的cluster-id。
Originator ID:
- Originator id属性用于防止在反射器和客户端/非客户端之间产生环路。
- Originator-id属性长4字节,可选非过渡属性,属性类型为9,是又路由反射器RR产生的,携带了本地AS内部路由发起者的Router ID。
- 当一条路由第一次被RR反射的时候,RR讲Originator-ID属性加入到这条路由,标识这条路由的始发路由器。如果一条路由中已经存在了Originator-id属性,则RR将不会创建新的Originator-id。
- 当其他BGP speaker接收到这条路由时,将比较收到的Originator-id和本地的router-id,如果两个id相同,bgp speaker会忽略掉这条路由,不做处理。
BGP联盟:
- 在联盟AS间传递联盟EBGP路由时不改变下一跳。
- 如果在联盟AS之间通过loopback口建立联盟EBGP邻居,同样需要指定EBGP多跳,默认TTL为1.
():表示联盟内有序的AS。
[]:表示联盟内无序的AS。 //华为才会有,思科是大括号
{}:表示联盟外无序的AS。
正则表达式中下划线可以配置小括号,大括号,不能匹配中括号。
BGP中如何下发默认路由:
针对peer通告默认。
本地创建默认路由后network进BGP。
本地创建默认路由后import进BGP。
default-route imported //配置引入默认路由
BGP命令行:
配置BGP只通告活动路由:active-route-advertise
配置IP RIB中过滤BGP路由:bgp-rib-only
这两条命令互斥。
as-path limit 1 //配置允许as-path的数量。默认255. 可配置1-2000.
4字节的AS号:
- 定义了一种新的Open能力码用于进行BGP连接的能力协商。
- 2中新的可选过渡属性,AS4-path和AS4-aggregator属性。
- 定义了AS-Trans(保留值为23456)用于衔接2字节的AS和4字节的AS。