熊建辉, 卢 宇,b, 郑中华
(福建师范大学a.协和学院;b.物理与能源学院,福州350117)
随着各种新型ICP及应用不断涌现,生活、工作、娱乐越来越网络化、便捷化,电信骨干网络流量每年以50%以上的速度高速增长,使得互联网规模的不断扩大及运营商网络出现流量分布不均衡、资源利用率低等问题[1],产生了如何基于现有网络实现多样化路由策略等实现流量调度需要。核心骨干网络路由器路由条目多达十余万条,路由协议成为计算机网络的核心技术和万物互联的基础技术。边界网关协议(Border Gateway Protocol,BGP)是目前唯一的一种广泛应用于运营商网络的外部网关协议(Exterior Gateway Protocol,EGP)[2],可用来解决不同自治系统(Autonomous System,AS)之间的路由及通过路由策略优化路由的问题,从而实现流量按需可控调度。
骨干网路由设备价格昂贵,而现网承载任务重大、试验风险高[3]。本文基于EVE-NG虚拟仿真环境下的IOL 及i86bi_linux-L3-adventer prisek9-ms.157-3.M.bin仿真设计并实现了一个多AS有选路需求的仿真网络,重点是研究BGP路由协议的技术框架、原理,验证BGP路由协议工作机制,仿真设计方案还可直接移植到实际的网络中。
路由协议根据作用范围可分为内部网关协议(Interror Gateway Protocol,IGP)和EGP。BGP 属于EGP被称为路径矢量路由协议,支持CIDR和VLSM,有别于距离矢量路由协议在于其定义了路径属性,并且可以根据需要通过设置不同的BGP路径属性值来控制选路[4]。BGP路由条目数量巨大,以增量更新及触发更新机制基于TCP179端口更新路由信息。当前使用的BGP协议版本为RFC 4271,并且在一些方面进行了升级,具体详见RFC6286,RFC6608,RFC6793,RFC7606,RFC7607,RFC7705,RFC 8212(2017 年7月)等。以下从BGP基本术语、邻居建立机制、消息类型等入手阐述BGP路由协议原理。
自治系统(AS):处于同一个管理机构控制之下的路由器和网络群组的集合。如CHINANET-IDC-GD就是一个AS。AS通过16 bit的AS号来标识,并分公共AS号(1~64511)和私有AS号(64512~65535),在RFC 6793 中其长度扩展为32 bit(1 ~4294967295)[5]。在AS内一般运行IGP,运营商网络常用的IGP有ISIS、OSPF 等。
BGP发言者(BGP Speaker):运行BGP协议的路由器,也称BGP路由器。
BGP对等体(BGP Peer):相互交换消息的BGP发言者之间互称为BGP对等体。
EBGP关系:处于不同AS的边界BGP发言者与对等体之间的关系。为形成EBGP关系一般需要确保BGP发言者与对等体存在直连或静态路由。
IBGP关系:因BGP路由穿越本AS传递到另外一个AS,而在本AS内形成的BGP发言者与对等体之间的关系。为形成IBGP关系先确保AS内部存在IGP(如OSPF等)路由使得BGP发言者与对等体网络能通。
BGP路由协议中通过形成并维护BGP邻居表(adjancy table),BGP 转发表(forwarding database)及路由表(routing table)来实现其工作机制。其中形成邻居表是基础,每个BGP发言者邻居关系建立过程(BGP有限状态机)如下:
空闲(Idle)状态:为初始状态,当协议激活后初始化,复位计时器,发起第一个TCP连接,同时监听远程对等体所发起的连接,转向连接状态。
连接(Connect)状态:开始TCP连接并等待TCP连接成功的消息。如果TCP连接成功,则进入Open发送状态;如果TCP连接失败,进入活跃状态。
活跃(Active)状态:总是试图建立TCP连接,若连接计时器超时,则退回到连接状态,TCP连接成功就转为OPEN发送状态。
OPEN 发送(Open sent)状态:TCP连接已建立,已发送第一个OPEN报文,等待接收对方的Open报文,并对报文进行检查,若发现错误则发送Notification消息报文并退回到Idle状态。若检查无误则发送Keepalive消息报文,Keepalive计时器开始计时,并转为Open证实状态。
OPEN证实(Open confirm)状态:等待接受Keepalive报文,复位保持计时器。如收到Keepalive报文,就转为Established状态,邻居关系完成。如果系统收到一条更新或Keepalive消息,它将重新启动保持计时器;如果收到Notifi cation消息,则退回到空闲状态。
已建立(Established)状态:邻居关系协商完成,即建立了邻居(对等体)关系,路由器将和邻居交换Update报文,同时复位保持计时器。
Open消息:为TCP连接建立(3次握手)后发送的第一个消息,用于建立BGP对等体之间的邻居关系形成BGP邻居表。
Keepalive消息:BGP会周期性地向对等体发出Keepalive消息,用来复位保持稳定的邻居关系。
Update消息:用于在对等体之间交换路由信息,其中携带BGP路径属性,它既可发布可达路由信息,也可撤销不可达路由信息,用来形成BGP转发表。
Notification消息:当BGP检测到错误状态时,就向对等体发出Notification消息,之后BGP连接会立即中断。
Route-refresh消息:当路由策略发送变化时,请求BGP邻居重新通告路由的消息,用来刷新BGP转发表。
BGP协议中AS能接收邻居的消息也会宣告消息给邻居[7],消息中的路径属性可以根据需要设计路由策略来修改,然后根据选路原则从BGP转发表中选择最优的BGP转发条目放进路由表中。
BGP协议把一个AS理解为一个大的路由器,BGP表的每一条条目包含下一跳AS、网络目的前缀及若干属性。该属性称为BGP路径属性,正是设计了众多BGP路径属性,方可根据需要改变BGP路径属性来制定想要的路由策略,从而实现流量调度,成为BGP除能支持大规模路由条目外另一大优势。BGP路径属性就是可对特定路由进行了进一步描述的参数,被携带在Update消息中在BGP路由器中传递,通过制定策略在发送或接受该消息时对路径属性值进行修改,然后再根据BGP选路原则决定该条目是否优选为最佳,最佳的将被放进路由表中。BGP路径属性可被看作是不同类型的metric值,一般分为公认强制遵守、公认可选遵守、可选并传递的、可选不传递的等4类属性[8]。公认的属性是指不同网络设备厂商都识别的,又分为强制包含和可选包含。可选是指可以不识别此类属性,传递的是指传递给对等体,不传递即不会传递给对等体。目前BGP及其扩展协议定义了多达16种路径属性,其中常见的属性有ORIGIN、AS-PATH、NEXT-HOP、LOCAL-PREF、MULTI-EXIT-DISC(MED)、Community及Weight等等,其中前3个为公认强制遵守的,第4个为公认可选遵守的,第5个为可选并传递的,第6个为可选不可传递的[9]。
BGP选路原则即BGP协议选择最优BGP转发表条目放进路由表中的优先顺序,作为制定BGP路由策略的基础。是否能成为最优BGP转发条目与改条目中携带的BGP路径属性有关,由于不同厂商的BGP路径属性不一样,BGP选路原则也有差异,比如有些厂商路由器ID也参与选路(级别较低)[10]。以路由器为例,BGP选路原则首先得满足路由的下一跳可达、关闭同步等前提,具体原则包含14条,按属性优先级从高往低匹配,一旦匹配成功则不再往下匹配。以下为常用的6条原则:
(1)先比较Weight值,越大越优先:Weight属性为厂家私有,本地通告的路由的Weight为32 768,从BGP对等体学习的路由Weight属性默认为0,保证了本地始发的路由最优先,该参数本地有效。
(2)再比较LOCAL_PREFf值,越大越优先:Local Preference属性只能在IBGP对等体之间传递,如果在EBGP对等体之间收到的路由的路径属性中携带Local Preference,则会触发Notifica tion报文,中断BGP链接。
(3)本地通告的路由优先:如果LOCAL_PREF值相同,则选择BGP本地通告的路由也就是下一跳为0.0.0.0的转发的条目放进路由表。
(4)最短AS路径的优先:AS路径即记录路由信息传递过程所经过的AS号,AS数量最少的优先。并且聚合路由时,使用as-set后产生的AS列表中{}内的AS号长度为1;而在联盟内的AS列表中()内的AS号长度不参与计算。另外不同方向的route-map中插入的AS号的位置是不同的。
(5)比较origin属性:该属性标识路径信息的来源,为公认强制属性,该属性值为:IGP,标识信息来源于AS内部;EGP,标识信息通过AS外部学习;Incomplete,标识信息通过别的方式习得;并且优先顺序:IGP>EGP>incomplete。Origin属性虽然在BGP路由信息必须中携带,但很少使用作为BGP选路策略。
(6)多出口标识符(Multi-Exit Discriminator,MED):该属性为公认可选(主流厂商都实现该路径属性)非传递属性,MED值越小越优先,MED可以在IBGP间传递,可以传递给EBGP;但是最多只能传递到相邻的AS中。通常用于AS的出口策略,也即控制进入本AS的入流量。在厂家的BGP表显示为metric。它跟Local Preference属性基本上是相反的,配置上则很相似。
BGP路由策略就是根据要实现的选路目标及BGP选路原则而制定修改BGP路径属性的一套方法。BGP路由策略实现的具体过程:根据选路原则确定要修改的路径属性,然后抓获BGP条目信息,最后修改其中需要修改的路径属性,该过程可以发生在BGP条目信息的发送者或接受者上。通常通过访问控制列表(ACL)、前缀列表(Prefix-list)等设置条件,然后通过Route-map中match语句来匹配调用设置的条件,对于匹配成功的通过Route-map中的set语句来修改具体的路径属性。
Route-map应用范围非常广泛,其一般形式如下:
route-map Name [deny|permit]N1 //Name 为该routemap的名字,N1为该序列的序列号
match X1 X2...Xn //X1、X2...Xn 表示匹配条件X1、X2...Xn“与”的关系
set Y1 //Y1 为同时满足X1、X2...Xn时修改路径属性的语句
...
...
route-map Name [deny|permit]Nx
match Xx1
...
match Xx+n //Xx1...Xx+ n 表示匹配条件Xx1...Xx+n“或”的关系
set Yx //Yx为满足条件Xx1...Xx+n中的至少一个时修改路径属性的语句
一个Route-map一般包含多个序列语句,每个序列语句中可包含match匹配语句和set修改路径属性的语句,并且末尾隐含deny any序列语句。序列语句中[deny|permit]为可选、默认为permit,根据场景不一样所代表的含义不一样,Nx为该序列的序列号默认为10,除第1个外所有序列均需标明序列号。Routemap定义好需调用在接口上方可生效。
下一代仿真虚拟环境(EmulatedVirtual Environment-Next Generation,EVE-NG),原名是Unified Networking Lab。EVE-NG实质为一块深度定制的Ubuntu操作系统,不仅融合了dynamips、IOL、KVM 还支持多个厂家的网络设备;不仅可以模拟仿真网络设备,还可运行虚拟机,只要能将虚拟机的虚拟磁盘格式转换为qcow2都可以在EVE-NG上运行,因此EVENG为一名副其实的仿真虚拟环境平台。应用时,可直接安装在x86架构的物理主机上或部署在VMware Workstation及Exsi平台上,另外还有ova版本直接导入VMware等虚拟机中运行[11]。EVE-NG目前包含社区版、专业版及学习中心版[12]。
EVE-NG与以往GNS3、eNSP、HCL及Packet Tracer不同。GNS3虽然也是融合了dynamips但更像是一款单机版虚拟仿真软件,虽然dynamips能够部署成C/S架构,但文本配置比较复杂;而EVE-NG可部署成B/S架构,管理应用简单,服务端安装EVE-NG并根据不同客户需要搭建不同的网络结构,客户端只需支持http/https登录服务端选择网络结构进行实验。学习中心版可供多个客户同时登录并隔离实验。
本实验通过EVE-NG虚拟仿真环境下的Cisco IOL 及i86bi_linux-L3-adventerprisek9-ms.157-3.M.bin型号的IOS仿真了一个包含6台路由器的多AS多出口的BGP 网络,R1、R2、R3、R4 属于AS64521,R5、R6分别位于AS64525、AS64526,重点研究BGP在3个AS特别是AS 64521中的实现机制和过程,该网络设备间连接及接口信息等情况如图1所示。
图1 BGP网络实例结构
BGP路由协议有良好的特性,本实验重点展示了通过local-prefer ence属性、MED属性设计路由策略来实现如下目标:
(1)AS64525与AS64526网络相通;
(2)访问AS64525 的.5.5.50/24 网段时通过R1;
(3)AS64525 访问AS64526 中的60.60.60.0/24、60.60.61.0/24 网段时通过R2 出发;
(4)AS64525与AS64521间的多出口链路中的一个断开时所有流量通过另外一条链路。
实验过程中根据需要拓展ping查看数据往返情况、BGP链接、邻居表、BGP转发表、路由表等信息。在部署BGP时首先部署好IGP(如OSPF等)使得本AS域内全网可通,方可建立BGP连接[13],在本例中通过逻辑链路的Full-mesh(IBGP)实现AS64521内BGP路由器之间的互联。
(1)网络基本配置。按照表1,分别配置路由器R1~R6各端口的IP地址和子网掩码等信息,其中Lo0、Lo1等为环回网卡,测试用。
表1 网络基本配置
(2)AS64521 IGP配置。根据以上理论分析:在一个AS内部须先运行IGP,在本实验中选择OSPF(选择IS-IS也行,均为运营商网络主流协议),为简化问题假定R1、R2、R3、R4 均处于骨干区域(area 0),以R2为例配置如下,R1、R3、R4的配置以此类推。
R2(config)#router ospf 100
R2(config-router)#net 2.2.2.2 0.0.0.255 area 0
R2(config-router)#net 10.1.25.0 0.0.0.255 area 0
R2(config-router)#net 10.1.23.0 0.0.0.255 area 0
R1、R3、R4均配置完毕后,在R4上分别拓展ping 1.1.1.1、2.2.2.2,源为4.4.4.4,测试结果如下:
Sending 5,100-byte ICMP Echos to 1.1.1.1,timeout is 2
seconds:!!!!!
Success rate is 100 percent(5/5),round-trip min/avg/max = 4/19/40 ms
Sending 5,100-byte ICMP Echos to 2.2.2.2,timeout is 2
seconds:.!!!!
表明AS内已实现全网可达。
(3)BGP 基本配置。根据图1,R1、R2、R3、R4 为同一AS,R5、R6分别单独为一个AS,它们之间的AS号及关系见表2,分别配置路由器R1~R6的AS号及其邻居关系。
表2 AS及BGP邻居关系
R1上的BGP配置如下,R2、R3、R4上的BGP配置与R1类似不再赘述,R5、R6通过直连接口配置与邻居间的BGP关系。
R1(config)#router bgp 64521
R1(config-router)#bgp router-id 1.1.1.1
R1(config-router)#no auto-summary
R1(config-router)#no synchronization
R1(config-router)#neighbor 3.3.3.3 remote-as 64521
R1(config-router)#neighbor 3.3.3.3 up lo0
R1(config-router)#neighbor 3.3.3.3 next-hop-self
R1(config-router)#neighbor 4.4.4.4 remote-as 64521
R1(config-router)#neighbor 4.4.4.4 up lo0
R1(config-router)#neighbor 4.4.4.4 next-hop-self
R1(config-router)#neighb 10.1.15.5 remote-as 64525
配置好R1、R2、R3、R4、R5、R6 上的BGP 基本信息后,可以查看到建立的TCP关系,以R1为例,其BGP TCP链接关系如下,表明其与R3、R4的IBGP关系及与R5的EBGP关系建立好了。
R1#show tcp bri
TCB Local Address Foreign Address (state)
C6CC8908 1.1.1.1.47519 3.3.3.3.179 ESTAB
C6CC5A98 1.1.1.1.25826 4.4.4.4.179 ESTAB
C6CC63A0 10.1.15.1.29240 10.1.15.5.179 ESTAB
在BGP中通告路由和建立TCP关系是分开的,接下来需要在R5、R6上向网络通告自己的BGP路由,以R6为例通告路由配置如下(R5与之类似不再赘述):
R6(config)#router bgp 64526
R6(config-router)#net 6.6.6.0 mask 255.255.255.0
R6(config-router)#network 60.60.60.0 mask 255.255.255.0
R6(config-router)#network 60.60.61.0 mask 255.255.255.0
R5、R6 通告完路由后,在R1、R2、R3、R4、R5、R6上查看到到达5.5.5.0/24、6.6.6.0/24、50.50.50.0/24、60.60.60.0/24、60.60.61.0/24 等网络的路由信息,以R6为例信息如图2所示:
图2 通告后R6上的路由信息
以上表明BGP配置成功。
(4)测试及分析。通过以上配置,AS64525与AS64526之间的网络通过穿越AS64525网络理应互通。选择在R5上测试,为了更清晰的看到数据的往返路由情况,我们选择了拓展Ping,目标IP为6.6.6.6、源IP 为5.5.5.5,选择“记录”路由过程信息,具体信息如图3所示,以上结果看出正确率为100%,表明该网络可达;通过记录的路由过程信息表明从5.5.5.0/24 到60.60.61.0/24 去往时经历了R5、R1、R3、R4、R6,返回时经历了R6、R4、R3、R2、R5。进一步,在R5上继续拓展Ping,目标IP 改为为60.60.60.6 或6.6.6.6、源IP 改为50.50.50.5 或5.5.5.5,记录的路由过程信息与上面一样,测试结果见表3。
图3 R5 拓展ping 6.6.6.6、源IP 为5.5.5.5 结果
表3 AS64525与AS64526间连通性测试
测试结果表明“去”均是经历R1,“回”都是经历R2。测试看起来貌似很成功,但是BGP的“路径”特性及“负载”功能还未得到体现,更重要的是如果本结构图中E0/0接口均换成F0/0后,测试结果是“去”和“回”都是经过R2,这样造成了所有大流量都是经过R2,而R1却空闲。因此需要进一步选路优化。
通过以上工作实现了第1点需求,接下来通过BGP选路优化实现第2点和第3点同时保障第4点需求,即进一步实现AS64525 自治系统5.5.5.0/24 网段访问6.6.6.0/24 时(从R1 出去然后)从R1 返回;AS64525 自治系统访问60.60.60.0、60.60.61.0/24网段时从R2出去(然后从R2返回);当AS64525与AS64521之间的一个链路故障时,所有流量自动切换到另一链路[14]。
根据前面阐述的基本原理,BGP选路主要通过Route-map并结合访问控制列表(Access Control List)或前缀列表(Prefix-list)来实现,以下分别来通过案例进行论证。
(1)实现访问AS64525 的5.5.5.0/24 网段时通过R1。选路分析:通过上面BGP基本工作,已实现了流量从R1出去、从R2返回,所以接下来只需要实现AS64525 自治系统5.5.5.0/24 网段访问6.6.6.0 从R1返回即可。因此需要使得在R3上优选从R1收到的5.5.5.0/24 即可,根据选路原则,可选择增大R1 的local-preference属性值(默认值为100),具体设计的路由策略如下:
R1(config)#access-list 1 permit 5.5.5.0
R1(config)#route-map out_of_R1 permit 10
R1(config-route-map)#match ip address 1
R1(config-route-map)#set local-preference 110
R1(config-route-map)#exit
R1(config)#route-map out_of_R1 permit 20
R1(config)#router bgp 64521
R1(config-router)#neighbor 3.3.3.3 route-map out_of_R1 out
在R3上,查看BGP转发表,会看到返回5.5.5.0/24 的路由最优路由下一跳是1.1.1.1(R1),如图4所示。实现目标。
图4 调整R1的local-preference后R3上的BGP转发表
(2)实现访问AS64526 中的60.60.60.0/24、60.60.61.0/24 网段时通过R2。选路分析:通过上面BGP基本工作,已实现流量从R1出去、从R2返回,所以接下来只需要实现AS64525自治系统访问60.60.60.0/24、60.60.61.0/24 网段时从R2 进入AS64521即可,因此需要使得R5上优选从R2收到的关于60.60.60.0/24、60.60.61.0/24 网段的路由信息即可。根据选路原则,可选择增大R1发来的关于60.60.60.0/24、60.60.61.0/24 路由信息的MED 属性值(厂家设备中以metric标识,默认为0),由于涉及到两个网段为了提高效率通过prefix-list来抓取,具体设计的路由策略如下:
R1(config)#ip prefix-list 2 permit 60.60.60.0/23 ge 24 le 24
R1(config)#route-map out_of_R2 permit 10
R1(config-route-map)#match ip address prefix-list 2
R1 (config-route-map)#set metric 10
R1(config-route-map)#exit
R1(config)#router bgp 64521
R1(config-router)#neighbor 10.1.25.5 route-map out_of_R2 out
在R5上,查看BGP转发表,收到来自R1的关于60.60.60.0/24、60.60.61.0/24 条目的Metric 属性变为10,因此也变成了次优路由,最优路由经由R2,详细信息如图5所示。
(3)测试与分析。在R5上,通过拓展ping R6目的IP 为6.6.6.6 源IP 为5.5.5.5 时,记录的ping包往返路由信息如图6所示,成功率为100%,往返路由为:R5-> R1-> R3-> R4-> R6-> R6-> R4-> R3->R1,实现了源为5.5.5.0/24 的信息从R1 发从R1 回的目标。
图6 R5 拓展ping IP 为6.6.6.6 源IP 为5.5.5.5 结果
在R5上,继续拓展ping R6目的IP分别为60.60.60.6、60.60.61.6,源IP 分别为50.50.50.5、5.5.5.5,记录所有ping包往返路由信息,成功率均为100%,测试结果详细信息如表4所示。
表4 优化后AS64525测试
测试结果表明:实现了访问AS64525 的5.5.5.0/24网段时通过R1;实现了访问AS64526中的60.60.60.0/24、60.60.61.0/24 网段时通过R2。
进一步测试是否实现了当AS64525与AS64521之间的一个链路故障时,所有流量自动切换到另一链路。测试如下:现在假定AS64525与AS64521间R5-R2链路故障(关闭R5的S1/1),在R5上查看到的BGP转发表如图7所示;并且在R5上能ping通R6。
图7 R5与R1直接链路故障是R5上的BGP转发表
BGP路由协议作为互联网核心骨干网络中的核心和基础[15],网络规模庞大且流量调度需求多样化、协议原理复杂。通过EVE-NG虚拟仿真环境下的IOL及i86bi_linux-L3-adventerpr isek9-ms.157-3.M.bin 型号的IOS仿真设计并实现了一个BGP实例网络,并结合给定选路需求演绎了路由策略设计的方法和具体过程,基于对邻居表、BGP转发表、路由表等信息和拓展ping得到的路由过程信息的分析,清晰验证了BGP路由协议原理和卓越特性。并且该仿真设计方案可直接移植到实际网络中,对指导实际网络的应用有一定应用价值。