资料.note

noteId: 24DAD2BFE52144E79F4C5FC34E8980A0 · 原始路径:/ALL/网络 - C模块/1-路由协议合集、路由控制、策略路由/BGP (TCP-179)/资料.note · 图片:1 · 附件待处理:0

 
BGP 使用TCP协议,端口号为179
·会话的目标端口号为179
·会话的源端口号是随机的
 
·名词解释:‘ 收敛状态 ’
当全网每一台路由器都拥有所有的路由信息,并且完全一致时,这种状态被称为收敛状态,一个网络只有在收敛状态时,才能保证全网可达。
 
1、BGP 的作用:
(1)划分 ‘AS’自治区域
将一台路由器的路由更新限制在一定的范围内,也只有这样,一个被划分为更小范围的网络,才能达到收敛状态。所以现实情况是,我们的互联网被划分成了一个一个更小范围的网络,而任何一台路由器的路由更新,被限制在这个特定的范围内,而这个特定的范围,就是你应该知道的被称为自治系统的网络范围,即autonomoussystem(AS) 。
 
IGP:
只在一个AS内部更新的路由协议,称为Interior Gateway Protocol (IGP)
 
BGP:
在AS与AS之间更新的路由协议,称为Border Gateway Protocol (BGP)。
 
(2)自主定义 ‘路由策略’和‘安全策略’
将互联网划分成若干个小范围的网络后,那么这每一个小网络就可以单独定义各自的路由策略与安全策略,并且这样不需要干扰其它AS,也不受其它AS干扰。
 
2、AS 自治号范围:
1 —— 4294967295(2009年1月之前:1 - 65535;2009年1月之后:1 - 4292967295)
当前更多使用的还是:1 —— 65535
(1)公有 AS自治号:
公有 AS自治号 只能用于互联网(公网)【不可重复,全球唯一】:
1 —— 64511
(2)私有 AS自治号,只能用于内网(不允许传入互联网):
 
 
 
3、BGP 邻居:
(1)手工指定邻居
路由器允许OSPF后,会主动去发现和形成OSPF邻居
当路由器运行BGP后,并不会主动去发现和寻找其它BGP邻居,BGP的邻居必须手工指定
 
·当路由器运行了BGP进程后,只能够被称为 BGP-Speaker,当和其它运行了BGP的路由器形成邻居之后,就被称为BGP-Peer
(2)当BGP形成邻居后,一开始交换所有路由信息,但是之后会采用增量更新,也就是只有路由有变化时,才会更新,并且只更新有变化的路由。
 
 
4、思科路由器运行的 BGP 为version 4
· 一台路由器只能运行一个BGP进程,并且整台路由器只能属于一个AS,但是一台路由器可以承载多个address family,而一个支持多个address family的BGP和一个不支持的可以正常通信,但这也仅限于Ipv4。
 
 
5、iBGP 与 eBGP:
(1)iBGP(内部BGP)
当一台BGP路由器 和 其它BGP路由器建立邻居时,如果对方路由器的 AS自治号 与 自己的AS自治号 相同,则邻居关系为 iBGP(internet BGP),反之,就是eBGP
 
(2)eBGP(外部BGP)
BGP路由 和其它BGP路由器建立邻居时,如果双方 AS自治号不同,则邻居关系为 eBGP(external BGP)
 
 
6、BGP 邻居建立过程:
(1)Idle:
BGP进程被启动或被重置,这个状态是等待开始,比如等于指定一个BGP peer,当收到TCP连接请求后,便初始化另外一个事件,当路由器或peer重置,都会回到idle状态。
 
(2)Connect:
检测到有peer要尝试建立TCP连接。
 
(3)Active:
尝试和对方peer建立TCP连接,如有故障,则回到idle状态
 
(4)OpenSent:
TCP连接已经建立,BGP发送了一个OPEN消息给对方peer,然后切换到OpenSent状态,如果失败,则切换到Active状态。
 
(5)OpenReceive:
收到对方peer的OPEN消息,并等待keepalive消息,如果收到keepalive,则转到Established状态,如果收到notification,则回到idle状态,比如错误或配置改变,都会发送notification而回到idle状态。
 
(6)Established:
从对端peer收到了keepalive,并开始交换数据,收到keepalive后,hold timer都会被重置,如果收到notification,就回到idle状态。
 
 
7、BGP 更新源:
BGP并不能主动在网络中寻找邻居,必须手工指定BGP邻居的地址,那么BGP才会将数据包发往指定的地址来请求建立邻居,与此同时,BGP发出的请求数据包除了写明目标IP地址外,还要写上自己的IP地址,即BGP源地址。路由器自己产生流量后从接口发出时,流量从哪个接口被发出,那么这些数据包的源IP地址就是哪个接口的地址。因此当BGP发出数据包寻找邻居时,这些数据包从哪个接口被发出,那么BGP源IP地址就是哪个接口的地址。要两台BGP路由器要正常建立邻居,必须双方路由器都相互指定邻居,相互发送数据包才行。当一台BGP路由器收到建立邻居的请求后,如果发现数据包的目标IP不是自己的BGP源地址,那么就拒绝该连接请求,只有当请求数据包的目标IP与自己的BGP源地址相同时,才可建立BGP邻居。需要注意的是,这个条件只在两个邻居之间,任意一个邻居满足条件即可,并不需要双方都满足,也就是说一方收到的数据包目标IP与自己的BGP源地址相同即可,另一方收到的数据包目标IP与它的BGP源地址不同也没关系,只要单方面符合条件就行,但是通常我们都保证双方一致。BGP的源地址是可以随意更改的,但只能是路由器上的接口地址。
 
考虑到路由器的loopback口在设备正常工作的情况下,不会像物理接口那样出现中断,所以建议在BGP邻居之间使用loopback接口的地址来建立TCP连接,当指定邻居时,不再将邻居的地址指定为对方物理接口地址,而改为指定对方的loopback地址,这样一来,既然物理接口中断,只要还有通畅的链路,那么BGP邻居仍然可以保持连接。
在将BGP邻居地址指定为对方loopback地址时,为了使数据包的目标IP与对方的BGP源地址相同,所以邻居也要将BGP源地址更改为自己的loopback接口地址,从而使得双方正常建立BGP连接。
 
 
8、BGP TTL:
考虑到外部自治系统的路由器对BGP发起DOS攻击,所以BGP要求外部BGP邻居,即eBGP邻居必须与自己直连,而iBGP邻居可以任意距离。这些控制是通过控制BGP数据包的TTL值来实现的,将建立eBGP邻居时发出的数据包的TTL值限制为1,就限制了eBGP邻居必须直连,而由于iBGP邻居可以在任意位置,所以建立iBGP邻居时发出的数据包的TTL值为最大,即255。对于建立eBGP的数据包的TTL值可以随意修改,甚至改为255都行。
 
 
 
9、BGP AS_Path:
BGP的路由可能会从一个AS发往另外一个AS,从而穿越多个AS。但是由于运行BGP的网络会是一个很大的网络,路由从一个AS被发出,可能在经过转发之后,又回到了最初的AS之中,最终形成路由环路,所以出于防止环路的目的考虑,BGP在将路由发往其它AS时,也就是发给eBGP邻居时,需要在路由中写上自己的AS号码下一个AS收到路由后,再发给其它AS时,除了保留之前的AS号码之外,也要添加上自己的AS号码,这样的写在路由中的AS被称为AS-path如果BGP收到的路由的AS_PATH中包含自己的AS号码,就认为路由被发了回来,以此断定出现了路由环路,最后就会丢弃收到的路由。BGP只有在将路由发给eBGP时,才会在AS-path中添加自己的AS号码,而在发给iBGP时,是不会添加AS号码的,因为iBGP邻居在同一个AS中,即使要添加,AS号码全是一样的,所以没有必要。
 
 
 
10、BGP防环
在IGP协议中,我们将路由协议分成两大类:距离矢量路由协议和链路状态路由协议,而BGP被划分为路径矢量路由协议(path-vector routing),路径矢量算法结合了距离矢量特性与AS-path防环特性。
因为BGP在将路由发给eBGP邻居时,会将自己的AS号码添加到AS-path中,所以可以以此来防止环路,而在将路由发给iBGP时,是不会往AS-path添加AS号码的,因此在iBGP之间传递路由时,没有防止环路的机制。考虑到为iBGP之间的路由传递也加入防环机制,因而强制将BGP路由在AS内部只传一跳,具体操作为:一台BGP路由器从eBGP邻居收到路由,发给iBGP邻居之后,iBGP邻居收到后就不能再传给其它任何iBGP邻居,只能传递给eBGP邻居。此规则被多数人称为BGP的水平分割,就是一台BGP路由器从iBGP邻居收到的路由,不能传递给其它iBGP邻居,只能传给eBGP邻居。
 
在AS内部,除了建立全互联的iBGP邻居关系外,还可以通过BGP Reflector(BGP反射器)和BGP Confederation(BGP联邦)的方式来实现路由全网传递
 
 
11、BGP 路由表
当路由器之间建立BGP邻居之后,就可以相互交换BGP路由。一台运行了BGP协议的路由器,会将BGP得到的路由与普通路由分开存放,所以BGP路由器会同时拥有两张路由器,一张是存放普通路由的路由表,被称为IGP路由表,就时平时我们使用命令show ip route看到的路由表,IGP路由表的路由信息只能从IGP协议和手工配置获得,并且只能传递给IGP协议;另外一张就是运行BGP之后创建的路由表,称为BGP路由表,需要通过命令show ip bgp才能查看,BGP路由表的路由信息只能传递给BGP协议,如果两台BGP邻居的BGP路由表为空,就不会有任何路由传递。
初始状态下,BGP的路由表为空,没有任何路由,要让BGP传递相应的路由,只能先将该路由导入BGP路由表,之后才能在BGP邻居之间传递。默认情况下,任何路由都不会自动进入BGP路由表,BGP路由表的路由获得有多种方式,可以从BGP邻居获得,也可以手工将IGP路由导入BGP路由表,还可以将其它路由重分布进BGP只要BGP的路由不是从邻居学习到的而是手工导入的,那么这样的路由被称为BGP本地路由。
因为BGP的邻居类型分为两种:eBGP和iBGP,所以BGP路由的AD值也有区分,如果BGP的路由是从eBGP学习到的,AD值为20,可以发现,从eBGP邻居学习到的路由,将优于任何IGP协议;从iBGP学习到的路由的AD值为200,同样可以发现,此类路由的优先级低于任何IGP协议。BGP除了以上两种AD值之外,如果BGP路由是从本地手工导入的,即BGP本地路由,则BGP本地路由的AD值为200,与iBGP路由的AD值相同,优先级低于任何IGP协议。
 
 
12、BGP Synchronization
BGP邻居之间的通信与交流运行在TCP的基础上,在两个节点之间,只要网络是通的,就能够建立TCP建立,网络的连通,可以是任何IGP路由协议,甚至是静态路由,总之,只要网络是通的,TCP连接就一定能够建立起来只要让两台路由器之间连通,保证TCP能够正常连接,就能够保证BGP的通信。
因为BGP在建立邻居时,BGP的源地址可以是任意地址,这些地址可以不是直连的,只要是能通信的,能建立TCP连接即可。当BGP在向邻居发送流量时,只要将流量发往邻居的对端地址,因为邻居的地址并不一定是直连的,所以要找到去往邻居地址的路径,可能需要查询IGP路由表,因为IGP为BGP的通信与连接提供了保证。
由此可见,BGP要将数据发给邻居,BGP在查询去往邻居的路径时,采用的是递归查询,BGP查询去往邻居的过程中,可能要多次查询IGP路由表,只要在IGP路由表中找到了去往邻居地址的相应路径或相应下一跳,那么就会将数据发给这个下一跳。
在上图的网络中,R1与R4建立eBGP连接,R3与R5建立eBGP连接,而R1与R3建立iBGP连接。在R1与R3建立iBGP连接时,R1通过目标地址3.3.3.3找到邻居R3,R1的BGP源地址为1.1.1.1,而R3也通过目标地址1.1.1.1找到邻居R1,R3的BGP源地址为3.3.3.3,为了让1.1.1.1和3.3.3.3能够正常通信,从而建立TCP连接,R1、R2、R3之间启用了IGP协议OSPF,OSPF的目的只是为了使1.1.1.1能够与3.3.3.3通信,并不传递AS中庞大的路由信息。
当AS 10中的R4将网段10.1.1.0/24通告给AS 20中的R1后,因为R1与R3之间是iBGP邻居,所以R1将路由10.1.1.0/24传递给R3,最终R3将路由10.1.1.0/24传递给AS 30中的R5。当R5将目的地为10.1.1.0/24的流量发给R3时,R3在查询路由表后得知,去往10.1.1.0/24的数据包需要发给iBGP邻居1.1.1.1才能够到达,于是R3便执行递归查询,查询如何去往1.1.1.1,正因为R1与R3之间的通信是靠OSPF提供的,所以R3得知去往1.1.1.1必须将数据包交给R2,即交给下一跳23.1.1.2,因为R2只运行了OSPF为BGP服务,所以R2没有BGP的路由10.1.1.0/24,当R2发现数据包的目标地址为10.1.1.0/24后,只能将数据包全部丢弃,这就类似于路由黑洞。
从以上情况中可以看出,当BGP从iBGP收到路由时,因为邻居之间可能跨越了多台IGP路由器,所以BGP在将数据包发往目的地时,通常会发给一台只运行了IGP的路由器,而只运行IGP的路由器并没有BGP的路由,因而最终导致数据包丢失,造成路由黑洞。要杜绝此类问题的发生,其实答案很明了,就是让AS中只运行IGP的路由器同时也拥有BGP的路由表即可。由于以上原因,在BGP路由传递中,有以下一条规则:当BGP要将从iBGP邻居学习到的路由信息传递给其它邻居之前(这个邻居通常是eBGP邻居),这些路由必须在IGP路由表中也能学到,否则认为此路由无效而不能发给其它邻居。
此规则称为iBGP与IGP路由同步。
在上图环境中,在R3将从iBGP邻居R1学习到的路由传递给eBGP邻居R5之前,必须确定这条路由在自己的IGP路由表中也存在,否则不使用该路由。要查看路由在IGP路由表中是否存在,使用命令show ip route即可。
注意,只有从iBGP邻居学习到的路由,才受iBGP与IGP路由同步规则的限制,如果路由是从eBGP邻居学习到的,则不受此规则限制,并且此规则可以手工开启或关闭。
BGP 同步默认是开启的,在IOS 12.2(8)T 以及之后的版本默认都是关闭的。
 
 
 
13、Path Attributes(路径属性)
默认情况下,到达同一目的地,BGP只走单条路径,并不会在多条路径之间执行负载均衡。对于IGP路由协议,当有多条路径可以到达同一目的地时,则根据最小metric值来选择最优路径,而BGP存在多条路径到达同一目的地时,对于最优路径的选择,BGP并不会以metric值大小为依据,BGP对于最优路径的选择,需要靠比较路由条目中的Path Attributes,即路径属性,只有在比较多条路由的属性之后,才能决定选择哪条为最优路径。BGP的每条路由都带有路径属性
·BGP的路径属性可以划分为以下四类:
(1)公认强制(Well-Known Mandatory)
对于任何一台运行BGP的路由器,都必须支持公认强制属性,并且在将路由信息发给其它BGP邻居时,必须在路由中写入公认强制属性,这些属性是被强制写入路由中的,一条不带公认强制属性的路由被BGP路由器被视为无效而被丢弃,一个不支持公认强制属性的BGP,是不正常的,不合法的BGP。
BGP路由必须携带的公认强制属性有三个:
1、Origin
2、Next_Hop
3、AS-path
 
 
(2)公认自选(Well-Known Discretionary)
公认自选属性并不像公认强制属性那么严格,任何一台运行BGP的路由器都必须支持公认自选属性,必须理解和认识公认自选属性,但是为路由写入公认自选属性并不是必须的,是否要为路由写入公认自选属性可以自由决定,为路由写上公认自选属性之后,所有BGP路由器都能认识和理解,并且都会自动保留和传递该属性。
 
 
(3)可选可传递(Optional Transitive)
并不是所有运行BGP的路由器都能理解和支持可选可传递属性,路由的可选可传递属性是任意写入的,其它BGP路由器并不一定能理解,也并不一定能保留和传递该属性,但是当为路由设置了可选可传递属性后,可以明确要求BGP路由器保留和传递该属性。
 
 
(4)可选不可传递(Optional Nontransitive)
只有特定的BGP路由器才理解和支持可选不可传递属性,并且可选不可传递属性理论上是不能手工设置的,即使手工设置了可选不可传递属性,这些属性也不能任意传递,只可以传递到特定的BGP路由器。