BGP总结(一)
0.AS
狭义:在RIP、OSPF和EIGRP等IGP协议中,AS表示只运行此单种协议的路由域
广义:运行多个IGP协议的路由域,多个IGP协议之间通过路由重发布来实现通信,AS和AS之间通过BGP来实现通信。
AS号码划分为公有AS和私有AS,公有AS的范围是1-64511,私有AS范围是64512-65534;公有AS只能用于互联网,并且全球唯一,不可重复,而私有AS可以在得不到合法AS的企业网络使用,可以重复。很显然,因为私有AS可以被多个企业网络重复使用,所以这些私有AS不允许传入互联网。ISP在企业用户边缘,需要过滤掉带有私有AS号码的路由条目。
1.BGP的概况
BGP(Border Gateway Protocol,边界网关协议)是一种用于AS(Autonomous System,自治系统)之间的动态路由协议。BGP最新的版本是BGP第4版本(BGP4),它是在RFC4271中定义的;一个路由器接口只能属于一个AS。BGP是一种外部网关协议(Exterior Gateway Protocol,EGP),与OSPF、RIP等内部网关协议(Interior Gateway Protocol,IGP)不同,其着眼点不在于发现和计算路由,而在于控制路由的传播和选择最佳路由。BGP的主旨是提供一种域间路由选择系统,确保自治系统只能够无环地交换路由选择信息。BGP是一种基于策略的路由选择协议,BGP在确定最佳路径时考虑的不是速度,而是让AS能够根据多种BGP属性来控制数据流的传输。
发送BGP消息的路由器称为BGP发言者(BGP Speaker),它接收或产生新的路由信息,并发布(Advertise)给其它BGP发言者。当BGP发言者收到来自其它AS的新路由时,如果该路由比当前已知路由更优、或者当前还没有该路由,它就把这条路由发布给自治系统内所有其它BGP发言者。相互交换消息的BGP发言者之间互称对等体(Peer),若干相关的对等体可以构成对等体组(Peer group)。
BGP在路由器上以下列两种方式运行:
IBGP(Internal BGP):当BGP运行于同一自治系统内部时,被称为IBGP,管理举例为200;
EBGP(External BGP):当BGP运行于不同自治系统之间时,称为EBGP,管理举例为20。
1)BGP的特性
BGP将传输控制协议(TCP)用作其传输协议。是可靠传输,运行在TCP的179端口上(目的端口)。由于传输是可靠的,所以BGP使用增量更新,在可靠的链路上不需要使用定期更新,所以BGP使用触发更新。
类似于OSPF和ISIS路由协议的Hello报文,BGP使用keepalive周期性地(60s)发送存活消息以维持邻居关系。BGP在接收更新分组的时候,TCP使用滑动窗口,接收方在发送方窗口达到一半的时候进行确定,不同于OSPF等路由协议使用1-to-1窗口。
2)BGP的三张表
邻居关系表:记录所有BGP邻居。使用命令show ip bgp summary可以查看到
转发数据库表:记录每个邻居的网络;包含多条路径去往同一目的地,通过不同属性判断最好路径;数据库包括BGP属性。使用命令show ip bgp可以查看
路由表:BGP路由选择进程从BGP转发表中选出前往每个网络的最佳路由,并加入到路由表中;EBGP路由(从外部AS获悉的BGP路由)的管理距离为20;IBGP路由(从AS系统获悉的路由)管理距离为200。使用命令show ip route bgp可以查看
3)BGP的四种消息类型
Open(打开报文):用来建立最初的BGP连接。(包含hold-time,router-id)。主要是利用此报文建立邻居,运行BGP的路由器打开与邻居的TCP连接,并发送打开报文,如果邻居接受这种邻居关系,就响应保活报文。
open消息包含:1.BGP version,均为BGPv4;2.My AS,即发送open消息的路由器所属的AS;3.Hold timer,BGP speaker收到update或keepalive消息的等待时间,默认为180s,为0表示不发送keepalive消息;
4.BGP ID,BGP speaker的 id,如果路由器要同时运行OSPF和BGP,那么需要使用相同的router-id。
Update(更新报文):对等体之间使用这些消息来交换网络层可达性信息。更新报文是BGP协议的核心,路由器使用它来撤销以前已通知的终点和宣布到一个新终点的路由或两者都有。注:BGP可以撤销好几个在以前曾通知过的终点,但在单个更新报文中则只能通知一个新终点。
Keepalive(保活报文):对等体之间周期性的交换这些消息以保持会话有效。(默认60秒)。是用来告诉对方自己是工作的,保活报文只包括公共首部。
Notification(通知报文):这些消息用来通知出错信息。当检测出差错状态或路由器打算关闭连接时,路由器就发送通知报文。
所有的BGP消息共享同样的公有首部,在学习不同类型的消息之前,先讨论公共首部,如下图所示,这个首部的字段如下。
标记:这个16字节标记字段保留给鉴别用
长度:这个2字节字段定义包括首部在内的报文总长度
类型:这个1字节段定义分组的类型,用数值1至4定义BGP消息类型
Open(打开报文)格式如下所示。
版本:这个1字节字段定义BGP的版本,当前的版本是4
自治系统:这个2字节字段定义自治系统号。
保持时间:这个2字节字段定义一方从另一方收到保活报文或更新报文之前所经过的最大秒数,若路由器在保持时间的期间内没有收到这些报文中的一个,就认为对方是不工作的。
BGP协议标识:这是2字节字段,这定义发送打开报文的路由器,为此,这个路由器通常使用它的IP地址中的一个作为BGP标识符。
选项长度:打开报文还可以包含某些选项参数,若包含,则这个1字节字段定义选项参数总长度,若没有选项参数,则这个字段的值为0
选项参数:若选项参数长度的值不是0,则表示有某些选项参数,每一个选项参数本身又有两个字段,参数长度和参数值,到现在已定义的唯一的选项参数是鉴别。
Update(更新报文):如下所示。
不可行路由长度:这个2字节字段定义下一字段的长度。
撤销路由:这个字段列出必须从以前通知的清单中删除的所有路由
路径属性长度:这个2字节字段定义下一个字段的长度
路径属性:这个字段定义到这个报文宣布可达性的网络路径属性
网络层可达性信息:这个字段定义这个报文真正通知的网络。它有一个长度字段和一个IP地址前缀,长度定义前缀中的位数。前缀定义这个网络地址的共同部分。例如,若这个网络是123.1.10.0/24,则网络前缀是24而前缀是123.1.10。
Notification(通知报文)格式如下:
差错码:这个1字节字段定义差错的种类
差错子码:这个1字节字段进一步定义每一种差错的类型
差错数据:这个字段可用来给出关于该差错的更多的诊断信息
4)运行BGP的路由器的4个相关进程
1.BGP open,建立BGP会话;2.BGP scanner,检查下一跳的可达性;3.BGP I/O,处理update或者keepalive消息;4.BGP router,BGP的算法。
5)建立邻居的过程
在两个BGP发言人交换信息之前,BGP都要求建立邻居关系。BGP不是动态地发现所感兴趣的运行BGP的路由器,相反,BGP使用一个特殊的邻居IP地址来配置。BGP使用周期性的Keepalive分组来确认BGP邻居的可访问性。Keepalive计时器是保持时间(Hold Time)的三分之一,如果发给某一特定BGP邻居三个连续的Keepalive分组都丢失的话,保持时间计时器超时,那个邻居被视为不可达,RFC1771对保持时间的建议是90秒,Keepalive计时器的建议值是30秒。
邻居关系建立要经历的六个状态阶段
Idle:在此状态下不分配网络资源,不允许传入的BGP连接。当在持续性差错条件下,经常性的重启会导致波动。因此,在第一次进入到空闲状态后,路由器会设置连接重试定时器,在定时器到期时才会重新启动BGP,思科的初始连接重试时间为60秒,以后每次连接重试时间都是之前的两倍,也就是说,连接等待时间呈指数关系递增。
Connect:(已经建立完成了TCP三次握手),BGP等待TCP连接完成,如果连接成功,BGP在发送了OPEN分组给对方之后,状态机变为OpenSent状态,如果连接失败,根据失败的原因,状态机可能演变到Active,或是保持Connect,或是返回Idle。
Active:在Active状态下,初始化一个TCP连接来建立BGP间的邻居关系。如果连接成功,BGP在发送了OPEN分组给对方之后,状态机变为OpenSent状态,如果连接失败,可能仍处在Active状态或返回Idle状态。
OpenSent:BGP发送OPEN分组给对方之后,BGP在这一状态下等待OPEN的回应分组,如果回应分组成功收到,BGP状态变为OpenConfirm,并给对方发送一条Keepalive分组,如果没有接到回应分组,BGP状态重新变为Idle或是Active。
OpenConfirm:BGP在这个状态下等待对方的Keepalive分组,如果成功接收,状态变为Established,否则,因为出现错误,BGP状态将重新变为Idle。
Established:这是BGP对等体之间 可以交换信息的状态,可交换的信息包括UPDATE分组、KeepAlive分组和Notification分组。
connect和active都是TCP连接阶段,active是发起方,connect是应答方。可以使用命令show ip bgp summary、debug ip bgp events、debug ip bgp来查看。
6)建立IBGP邻居
IBGP运行在AS内部,不需要直连。IBGP有水平分割(即在路由信息传送过程中,不再把路由信息发送到接收到此路由信息的接口上。),建议使用Full Mesh(即所有结点之间都直接连接),由于Full Mesh不具有扩展性,为了解决IBGP的Full Mesh问题,使用路由反射器(RR)和联邦两种方法来解决。主要减少了backbone IGP中的路由。Neighbor后所指的地址可达。发起方不能是缺省路由,应答方不能是缺省路由。可以使用下面两种方法来建立IBGP邻居:
※邻居之间可以通过各自的一个物理接口建立对等关系,该对等关系是通过属于它们共享的子网的IP地址来建立的。
※邻居之间也可以通过使用环回接口建立对等关系。
在IBGP中,由于假定了IBGP邻居在物理上直接相连的可能性不大,所以将IP分组头中的TTL域设置为255。
7)建立EBGP邻居
EBGP运行在AS与AS之间的边界路由器上,默认情况下,需要直连或使用静态路由,如果不是直连,必须指EBGP多跳。命令Neighbor x.x.x.x ebgp-multihop [1-255],不选择为最大值,255跳。
可以使用下面两种方法来建立EBGP邻居:
※邻居之间可以通过各自的一个物理接口建立对等关系。
※邻居之间也可以通过使用环回接口建立对等关系。
8)neighbor ip-address remote-as number命令
例:neighbor 10.1.1.1 remote-as 100
指定对方属于哪一个AS。所指的10.1.1.1地址,必须在IGP中可达。
A、允许邻居用这个地址来访问我的179端口,但没有指明访问本路由器的哪个地址,只检查源地址。
B、本路由器以更新源地址去访问neighbor后面这个地址的179端口,是否可以建立TCP链接要看对方是否允许我的更新源来访问它。
示例:
两台路由器运行RIPv2,都将环回口宣告进RIP。这时假如在两台路由器之间运行IBGP邻居关系:
R1:neighbor 192.168.2.1 remote-as 1
R2:neighbor 10.1.1.1 remote-as 1
双方都没有写更新源(neighbor x.x.x.x update-source lo0代表本路由器的更新源为lo0口,BGP的包以这个接口的地址为源地址发送出去。)。一边指环回口,一边指直连接口。可以建立邻居。这里有2个TCP的session,其中只有R1去访问R2的环回口的179端口的TCP session可以建立。可以用show tcp brief查看。
Router#sh tcp brief
TCB Local Address Foreign Address (state)
65693960 10.1.1.1.51124 192.168.2.1.179 ESTAB
这时在R2上写上确定更新源命令:neighbor 10.1.1.1 update-source lo1,这时即可建立2条TCP session。可以使用命令Show tcp brief查看到2条TCP session在建立,当一条establish完成后,另一条过会即消失。
Router#sh tcp brief
TCB Local Address Foreign Address (state)
65693960 10.1.1.1.51124 192.168.2.1.179 CLOSED
65693E14 10.1.1.1.37992 192.168.2.1.179 ESTAB
Router#sh tcp brief
TCB Local Address Foreign Address (state)
65693E14 10.1.1.1.37992 192.168.2.1.179 ESTAB
注:路由器建立BGP邻居写两条正确的neighbor命令,是为了冗余。
9)IBGP同步
BGP同步规则指出,BGP路由器不应用使用通过IBGP获悉的路由或将其通告给外部邻居,除非该路由是本地的或是通过IGP获悉的。同步开启意味着,从一个IBGP邻居学来的路由,除非从IGP中也同样学习到,否则不可能被选为最优。如果IGP为OSPF,那么在IGP中,这些前缀的router-id也必须与通告这些前缀的bgp的router-id相匹配。才有可能被选为最优。
示例:
R1、R2、R3同为OSPF area 0中路由器(每台路由器的router-id如上图所示),R2上一条路由3.3.3.0/24宣告进OSPF。R1、R3运行IBGP,R1将3.3.3.0/24的前缀引入BGP,传给R3。这时R3既从OSPF area0中的R2学习到该前缀,又从IBGP对等体R1,学习到该前缀,如果R3的synchronizaion是开启的,检查同步,在R3的BGP转发表里:
R1
router ospf 10
router-id 2.2.2.1
log-adjacency-changes
network 10.1.1.0 0.0.0.255 area 0
network 11.1.1.0 0.0.0.255 area 0
!
router bgp 100
synchronization
bgp log-neighbor-changes
redistribute ospf 10
neighbor 11.1.1.2 remote-as 100
no auto-summary
R3
router ospf 10
router-id 2.2.2.3
log-adjacency-changes
network 11.1.1.0 0.0.0.255 area 0
!
router bgp 100
synchronization
bgp log-neighbor-changes
neighbor 11.1.1.1 remote-as 100
no auto-summary
R3#sh ip bgp
BGP table version is 30, local router ID is 11.1.1.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* i3.3.3.3/32 10.1.1.1 11 100 0 ?
* i10.1.1.0/24 11.1.1.1 0 100 0 ?
r>i11.1.1.0/24 11.1.1.1 0 100 0 ?
R3#sh ip bgp 3.3.3.3
BGP routing table entry for 3.3.3.3/32, version 26
Paths: (1 available, no best path)
Not advertised to any peer
Local
10.1.1.1 (metric 20) from 11.1.1.1 (11.1.1.1)
Origin incomplete, metric 11, localpref 100, valid, internal, not synchronized
说明同步检查没有通过,当把R1的bgp的router-id改为2.2.2.2时,R3这时检查同步就可以通过了。
R1
router ospf 10
router-id 2.2.2.1
log-adjacency-changes
network 10.1.1.0 0.0.0.255 area 0
network 11.1.1.0 0.0.0.255 area 0
!
router bgp 100
synchronization
bgp router-id 2.2.2.2
bgp log-neighbor-changes
redistribute ospf 10
neighbor 11.1.1.2 remote-as 100
no auto-summary
R3#sh ip bgp
BGP table version is 37, local router ID is 11.1.1.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
r>i3.3.3.3/32 10.1.1.1 11 100 0 ?
r>i10.1.1.0/24 11.1.1.1 0 100 0 ?
r>i11.1.1.0/24 11.1.1.1 0 100 0 ?
R3#sh ip bgp 3.3.3.3
BGP routing table entry for 3.3.3.3/32, version 35
Paths: (1 available, best #1, table Default-IP-Routing-Table, RIB-failure(17))
Flag: 0x820
Not advertised to any peer
Local
10.1.1.1 (metric 20) from 11.1.1.1 (2.2.2.2)
Origin incomplete, metric 11, localpref 100, valid, internal, synchronized, best
关闭同步的条件
※将EBGP的路由重分布进IGP
※本AS不为其他AS提供穿越服务(末节的AS)
※穿越路径上所有路由器都运行BGP
BGP总结(一)的更多相关文章
- ISP路由表分发中的AS与BGP
➠更多技术干货请戳:听云博客 摘要 本文面向,初级网络工程师,数据挖掘工程师,涉及EGP(外部网关协议; Exterior Gateway Protocol),IGP(内部网关协议; Interior ...
- bgp多线
BGP(边界网关协议)主要用于互联网AS(自治系统)之间的互联,BGP的最主要功能在于控制路由的传播和选择最好的路由. 中国网通 .中国电信.中国铁通.教育网和一些大的民营IDC运营商都具有AS号,全 ...
- BGP路由协议详解(完整篇)
原文链接:http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文,曾许诺过要完善这个文档,但 ...
- 边界网关协议BGP
Border Gateway Protocol (BGP) is a standardized exterior gateway protocol designed to exchange routi ...
- 如何使用 Quagga BGP(边界网关协议)路由器来过滤 BGP 路由
在之前的文章中,我们介绍了如何使用 Quagga 将 CentOS 服务器变成一个 BGP 路由器,也介绍了 BGP 对等体和前缀交换设置.在本教程中,我们将重点放在如何使用前缀列表prefix-li ...
- RIP、OSPF、BGP、动态路由选路协议、自治域AS
相关学习资料 tcp-ip详解卷1:协议.pdf http://www.rfc-editor.org/rfc/rfc1058.txt http://www.rfc-editor.org/rfc/rfc ...
- Mininet实验 基于Mininet实现BGP路径挟持攻击实验
参考:基于Mininet实现BGP路径挟持攻击实验 实验目的: 掌握如何mininet内模拟AS. 掌握BGP路径挟持的原理和分析过程. 实验原理: 互联网是由相互连接的自治系统AS组成的,通过一个通 ...
- 如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤
在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀.同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀. 拓扑 服务供应商A和B希望在 ...
- BGP学习笔记
源自红茶三杯: BGP应用于大规模网络或运营商,用作在AS间传递路由信息 使用BGP的三大理由 1. 大量路由需要承载, IGP只能容纳千条,而BGP可以容纳上万(应该是IGP结合BGP使用?) 2. ...
- BGP详解
相信各位站长在托管服务器或者选择虚拟主机的时候,提供商都会说他们的机房是双线机房,保证你的站点访问速度,那么这里所谓的双线机房到底是何意思,它又为何能提升站点的访问速度呢? 一遍小型机房的所谓双线路其 ...
随机推荐
- ethernet
OSI参考模型 简化相关网络操作:提供不同厂商之间的互联 应用层 为应用程序提供服务 HTTP Telnet 表示层 数据格式化,加密.解密 ASCII EBCDIC JPEG 会话层 建立.维护.管 ...
- 有哪些适合个人开发的微信小程序
微信小程序提供了一个简单.高效的应用开发框架和丰富的组件及API,帮助开发者在微信中开发具有原生 APP 体验的服务. 微信小程序支持采用云开发模式,无需后台服务,十分的方便快捷,适合个人开发一些工具 ...
- Linux下最常用的10个文件压缩工具
作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...
- 快速了解JavaScript的基础知识
注释 单行注释: // 单行注释 多行注释: /* 多行 注释 */ 历史上 JavaScript 可以兼容 HTML 注释,因此 <!-- 和 --> 也可以是单行注释. x = 1; ...
- Qt开发的应用记录读取用户习惯设置的方法
Qt开发的应用记录读取用户习惯设置的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/w ...
- 【C++】《Effective C++》第五章
第五章 实现 条款26:尽可能延后变量定义式的出现时间 只要定义了一个变量而其类型带有一个构造函数或析构函数,那么 当程序的控制流到达这个变量定义式时,你得承受这个构造成本. 当这个变量离开这个作用域 ...
- LeetCode237 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...
- IPC 经典问题:Reader & Writer Problem
完整代码实现: #include <stdio.h> #include <unistd.h> #include <time.h> #include <stdl ...
- docker save 保存导出镜像
Docker保存镜像 tag 镜像 # 镜像打 tag 标签 # docker tag 镜像id/名 新名字 docker tag fce91102e17d tomcat01 commit 镜像 注意 ...
- 【Java】运算符(算术、赋值、比较(关系)、逻辑、条件、位运算符)
运算符 文章目录 运算符 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 5. 条件运算符 6. 位运算符 7. 运算符优先级 8. 运算符操作数类型说明 9.code 算术运 ...