本章主要内容列表:
配置和获取BGP信息
通过BGP-LS管理和可视化网络拓扑
添加和删除BGP网络路由
配置和获取PCEP信息
通过PCEP管理LSP通道
通过PCEP进行网络编程
使用Java管理扩展获取BGP和PCEP统计信息
通过TCP MD5认证增强BGP和PCEP的安全连接
使用OpenConfig实现BGP组件配置
实现BGP和PCEP协议的新扩展
在OpenDaylight的BGP-PCEP项目中,实现两个南向插件:Border Gateway Protocol(BGP) Linkstate分布管理三层拓扑信息,Path Computation Element Protocol(PCEP)作为路径实例方法实例化底层网络。两种协议都提供了可扩展功能。
BGP让互联网的网络正常工作的路由协议。根据RFC,BGP主要功能就是通过BGP交换网络可达信息。
PCEP是由IETF定义的基于TCP协议,它使得网络组件比如路由器可以把路径计算功能拿到外部路由实体中,即路径计算引擎(PCE)。PCE能够计算出网络的网络路径或者是网络路由。使用PCEP协议,客户端PCC可以向PCE请求路径计算。PCEP协议设计用于PCC和PCE之间通信。使用PCEP,可以将路径计算集中到OpenDaylight控制节点上,这也就是软件定义网络的好处。
本章中配置主要集中在使用OpenDaylight SDN控制器做BGP和PCEP的基本用户案例。
在本章中,我们将指导您通过手动配置OpenDaylight控制器的XML文件,用PCEP将路由器连接起来。路由器和OpenDaylight都需要配置。一量建立连接,控制器可以从路由器中接收路由信息,这可以用RESTCONF来完成。
本章这个配置方案需要路由器和OpenDaylight控制器通过BGC-PCEP来实现。你也可以使用Quagga路由器。为了使用BGP-PCEP,Opendaylight控制器可以通过手动配置或者使用RESTCONF完成配置。
按照指定说明使用Opendaylight BGP XML配置BGP配置文件
1 使用karaf脚本启动OpenDaylight,使用此客户端访问karaf 命令行:
2 安装面向用户的功能,需要获取使用BGP-LS连接到路由器所有的依赖项:
opendaylight-user@root>feature:install odl-bgpcep-
bgp-all
odl-bgpcep-pcep-all odl-restconf-all odl-netconf-
all
完成安装过程可能需要几分钟时间。为了确保安装正常,可以使用以下命令检查日志,他会列出已经安装的BGP服务。
opendaylight-user@root>feature:list -i | grep
bgp
可以使用如下的命令查看karaf日志检查相关错误:
opendaylight-user@root>log:tail
3 配置由Opendaylight发起的BGP连接:OpenDaylight karaf版本有一个预配置的BGP基线配置。这个XML配置文件可以通过karaf的根目录进入etc/opendaylight/karaf访问到。对于BGP配置有两个有用的文件分别是:31-bgp.xml和41-bgp-example.xml
更新41-bgp-example.xml指定部分,创建BGP-LS到对端IP地址连接即路由器的连接。
1 BGP对端配置:XML文件默认主机IP地址为192.0.2.1。更新以下BGP speaker的 IP地址以便Opendaylight与其连接。在这个例子中,我们用192.168.1.119作为BGP对端地址,或者说是路由器IP地址:
可以增加更多的BGP peer,这可以通过新增一个不同实例名称和IP地址的module来达到:
2 RIB配置:更新XML文件,在以下部分创建BGP消息段:
Local-as字段提供Opendaylight控制器配置的本地自治系统编号,该值与路由器的BGP自治系统配置应该相同。bgp-rib-id默认为192.0.0.2.2,这个应该用新建Opendaylight控制器实例的管理IP地址更新,在我们例子中为192.68.1.102。
3 在您的路由器上使用适当命令验证BGP peer配置是跟前面的配置相匹配的。
4 注意BGP对端基线配置是被注释掉的以防止客户端以默认配置启动。一旦所需配置完成,取消BGP对等配置模块的注释。在我们的例子中,是example-bgp-peer。此外,定时器可以配置为所需值。例如更新BGP客户端之间的间隔和BGP peer模块的重新尝试连接时间(以秒为单位)。可以启用TRACE模块在Karaf日志中查看调试结果,这可以通过编辑文件etc/org.ops4j.paxloging.cfg添加下行文件到文件结尾来完成:
一旦对这个文件修改完成,并重启karaf让新配置生效。在karaf控制台上键入log:tail应该能够看到下面trace日志来判断运行是否正常。
注意,上述日志中BGP的绑定端口是179,这是RFC定义的默认端口号。karaf日志也可以通过从karaf根目录下访问data/log/karaf.log获得。
4 BGP数据可以通过RESTCONF访问如下URL访问获得网络拓扑信息,使用GET请求,URL: http://
:8181/restconf/operational/ network-topology:network-topology/ Method: GET
JSON格式示范可以通过GitHub链接获得,以下为链接地址h t t p s : / / g i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / b l o b / m a s t e r / c ha p t e r 6 / c h a p t e r 6 - r e c i p e 1 / s a m p l e s / n e t w o r k _ t o p o l o g y . t x t 。
检索BGP路由信息库(RIB)数据使用以下GET请求:
URL: http://
:8181/restconf/operational/ bgp- rib:bgp-rib/rib/example-bgp-rib/
方法: GET
想GET操作的响应示例通过github获得: h t t p s : / / g i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / b l o b / m a s t er / c h a p t e r 6 / c h a p t e r 6 - r e c i p e 1 / s a m p l e s / r i b _ d a t a . t x t
对于BGP RIB数据的进一步细粒度地访问可以通过下面方法做到,不同的路由器支持的类型可能不同:
1 对于检索IPv4路由信息,访问GET如下URI:
对于检索IPv6的路由信息,GET的URI如下:
http://
:8181/restconf/operational/bgp-rib: bgp-rib/rib/example-bgp-rib/loc-rib/tables/ bgp-types:ipv6-address-family/ bgp-types:unicast-subsequent-address-family/ipv6-routes
2 对于检索IPv4 flowspec信息,使用如下的URI的GET操作:
http://
:8181/restconf/operational/bgp-rib:bgp-rib/rib/example-bgp-rib/loc-rib/tables/bgp-types:ipv4-address-family/bgp-flowspec:flowspec-subsequent-address-family/bgp-flowspec:flowspec-routes
对于检索IPv6流信息,使用如下的URI的GET操作:
http://
:8181/restconf/operational/bgp-rib:b
gp-rib/rib/example-bgp-rib/loc-rib/tables/bgp-
types:ipv6-address-family/bgp-flowspec:flowspec-
subsequent-address-family/bgp-flowspec:flowspec-
ipv6-routes
3 对于检索IPv4 BGP标记的单播路由,使用如下的URI的GET操作:
http://localhost:8181/restconf/operational/bgp-rib:bgp-rib/rib/example-bgp-rib/loc-rib/tables/bgp-types:ipv4-
address-family/bgp-labeled-unicast:labeled-unicast-
subsequent-address-family/bgp-labeled-unicast:labeled-
unicast-routes
4 对于检索IPv4 BGP链路状态,使用如下的URI的GET操作:
http://localhost:8181/restconf/operational/bgp-rib:bgp-rib/rib/example-bgp-rib/loc-rib/tables/bgp-
linkstate:linkstate-address-family/bgp-
linkstate:linkstate-subsequent-address-family/linkstate-
routes
安装odl-bgpcep-bgp-all 所有特性,启用BGP应用所有依赖都会被安装。以下是主要依赖:
BGP项目中定义了 用于BGP建模的Yang模型。它依赖于Opendayligh Yangtools项目通过Yang模型成生 Java APIs。Opendaylight控制器驱动服务抽象层(MD-SAL)用于存储和管理BGP信息。
需要安装Odl-restconf-al,然后才能过通公开的API接口查看BGP项目特性。
BGP项目协议框架需要下面的netty库支持。
配置BGP-PCEP需要Opendaylight config-subsystem支持。
因为BGP和PCEP支持MD5 认证,因此也需要tcpmd5项目。
安装以上功能之后,基线XML配置文件将被创建。通过安装配置BGP路由器和Opendaylight XML配置文件来建立BGP连接。
Opendaylight提供了两个主要配置文件用于BGP实现,以下为BGP中RIB配置。
31-bgp.xml :该文件定义了基础解析器和RIB的设置,除非需要变更Address Family Identifier (AFI) 和 Subsequent Address Family Identifier (SAFI),否则该文件保持不变。
41-bgp-example.xml :该文件包含配置示例编辑,应该修改该文件以适应自己的部署。
一旦配置完成并重启karaf实例后,这些参数会被Opendaylight拿到。使用Restful API 可以管理BGP路由和相关参数,我们将在下面进行讨论。
对于本节及后续章节,你可以试用Quagga路由器做为BGP对端,你也可以选择其他任何的路由器。Quagga是一个方便、开源的解决方案,可以用它做为尝试。配置Quagga路由器与BGP的Opendaylight集成实现说明参考如下:h t t p s : / / g i t h u b . c o m / j g o o d y e a r / O p e n D a y l
i
g h t C o o k b o o k / t r e e / m a s t e r / c h a p t e r 6 / c h a p t e r 6 - r e c i p e 1 / q u a g g a
在本章中,我们将回顾第一节的配置拓扑和存储的信息类型的详细信息。
第一节的配置是本节的先决条件。假设BGP peer和RIB配置如前已经配置完毕。使用karaf脚本启动OpenDaylight发行版本,安装前面所提到的功能。我们将使用BGP RestfulAPI查看 BGP-LS实现管理的不同拓扑。
我们之前配置三个主要拓扑如下。为了能够对着每一个拓扑进行管理,有必要好好的理解这些拓扑。
example-linkstate-topology:当通过LinkState消息发布网络拓扑信息,此拓扑用于管理节点和链路。请清意,拓扑名称应该与41-bgp-example.xml.中定义的模块匹配。可以访问以下URL获取Opendaylight实现的网络状态拓扑结构。
URI: http://
:8181/restconf/operational/network-topology:network-topology/topology/example-linkstate-topology
example-ipv4-topology :该拓扑用于管理网络拓扑节点的IPv4地址。同样,请注意拓扑名称应该跟41-bgp-example.xml中为其定义模块的名称匹配。opendaylight实现的IPv4网络拓扑可以通过下面的RUI访问获取。我们已经配置BGP对端 和本地BGP(Opendaylight实例属性),IPv4网络拓扑会对应列出其IP地址,如下面示例响应中所示:URI: http://
:8181/restconf/operational/network-topology:
network-topology/topology/example-ipv4-topology
example-ipv6-topology :该拓扑用于管理网络拓扑节点的IPv6地址。注意拓扑名称应该跟41-bgp-example.xml中为其定义模块的名称匹配。链接状态网络拓扑的Opendaylight实现可以访问下面URL获取:
URI: http://
:8181/restconf/operational/network-topology:network-topology/topology/example-ipv6-topology
对于上述GET REST操作示例响应可以在以下位置的Github链接访问获取:h t t p s : / / g i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / t r e e / m a s t e r / c h a
p t e r 6 / c h a p t e r 6 - r e c i p e 2 / s a m p l e s
Opendaylight实现中,每个BGP提供者实例应该配置唯一的RIB Id。例如在我们示例中:rid-id是example-bgp-rig。对于每一个BGP提供者实例,ODL定义了唯一拓扑。在我们的例子中,我们共定义了三种拓扑,分别是,type-ipv4-topology对应bgp-reachability-ipv4类型,example-linkstate-topology对应bgp-linkstate-topology类型,示例-ipv6-topology对应bgp-reachability-ipv6类型。每个拓扑类型对应Opendaylight中BGP实现定义的yang模型。对于每一个配置的rib-id,就配置了拥有唯一应用rib-id的BGP对端。同时生成了访问他们的REST API。
本章介绍如何使用BGP REST API添加IPv4路由。作为先决条件,本部分将指导您手动完成配置,使得OpenDaylight控制器并接受入站BGC链接,这本质上它行为更像BGP speaker。
作为本部分配置先决条件,假设已经按照第一节配置了RIB和常规BGP。为了扩展BGP peer的RIB应用功能比如IPv4路由等,我们需要配置BGP peer,并配置应用程序对端。
通过配置41-bgp-example.xml XML文件启用BGP speaker功能。更新配置将默认绑定地址从0.0.0.0更新为localhost,即127.0.0.1,并将默认绑定端口从179变更为1790。
在第一节中,我们配置了BGP peer到它自己的模块中,让我们看看peer-registry的标签。每一个BGP peer都要注册到peer registry,这样进来的BGP连接才被允许并被BGP spearker处理。下面就是我们配置示例:
BGP应用peer配置:由于BGP speaker需要所有的对端进行注册才能跟它们通信。我们将自己的模块上添加BGP peer。下面部分,如何用适当的信息替换相关代码:
Bgp-peer-id: 指的是opendaylight实例的IP地址,它是本地BGP标识符。
target-rib:指将存储数据的RIB标识符
application-rib-id:指RIB本地应用标识,用于存储路由信息。
可以配置更多的BGP peer来广播路由。
重新启动OpenDaylight分发版本,并且使用karaf脚本安装必要的功能,如前面要求的配置所述。
接下来我们通过BGP REST API添加和删除路由,通过对端路由器做路由的验证。
1 添加IPv4单播路由,请使用以下Restful API:
URI:
http://
:8181/restconf/config/bgp-rib:application-rib/ex
ample-app-rib/tables/bgp-types:ipv4-address-family/bgp-
types:unicast-subsequent-address-family
方法: PUT
PUT方法操作的示例JSON主体可以在以下位置的github位置获取: h t t p s : / / g i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / b l o b/ m a s t e r / c h a p t e r 6 / c h a p t e r 6 - r e c i p e 3 / s a m p l e s / a d d - i p v 4 - u n i c a s t - r o u t e . t x t
删除IPv4路由:使用相同的URI发起一个DELETE请求,删除所有添加路由。要删除特定路由,使用URL附加网络prefix-id.举例如果prefix是2.1.1.1、32前缀Id,我们将用:2.1.1.1%2F32
2 要添加IPv6单播路由,请使用以下Restful API
URI: http://
:8181/restconf/config/bgp-rib:application-rib
/example-app-rib/tables/bgp-types:ipv6-address-family/bgp-
类型:unicast-subsequent-address-family
方法: PUT
在github访问示例JSON请求: h t t p s : / / g i t h u b . c o m / j g o o d y e a r
/ O p e n D a y l i g h t C o o k b o o k / b l o b / m a s t e r / c h a p t e r 6 / c h a p t e r 6 - r e c i p e 3 / s a m p l e s /
a d d - i p v 6 - u n i c a s t - r o u t e . t x t
删除IPv6路由:对上述操作执行DELETE操作Rest URI应删除所有IPv6路由。 前缀URI与IPv6前缀只删除上述前缀的路由。 例如:要删除2001:db8:60 :: 5/128,URI应该追加2001:db8:60 :: 5%2F128
3 添加IPv4标记的单播路由,请使用以下Restful API:
URI:http://
:8181/restconf/config/bgp-rib:application-rib/example-app-rib/tables/bgp-types:ipv4-address-family/bgp-labeled-unicast:labeled-unicast-subsequent-address-family
方法: PUT
示例JSON请求可以在git的github上访问: h t t p s : // g i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / b l o b / m a s t e r / c h a p t e r 6 / c h a pt e r 6 - r e c i p e 3 / s a m p l e s / a d d - i p v 4 - l a b e l l e d - u n i c a s t - r o u t e . t x t
4删除IPv4标记的单播路由:对URI使用DELETE操作删除所有标记的路由。 删除特定的IPv4标签单播路由附加带有bgp-labeled-unicast的URI:labeled-unicast- route /
。
添加IPv4流量(BGP-FS):更改目标和4属性值,源前缀,协议和端口值。另外,其它属性可以用于设置流量速率和标记或者重定向。
URI:
http://
:8181/restconf/config/bgp-rib:application-rib/ex
ample-app-rib/tables/bgp-types:ipv4-address-family/bgp-
flowspec:flowspec-subsequent-address-family/bgp-
flowspec:flowspec-routes
方法: PUT
PUT请求的示例JSON位于github链接: h t t p s : / / g it h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / b l o b / m a s t e r / c h a p t e r 6 / c h a p t e r6 - r e c i p e 3 / s a m p l e s / a d d - i p v 4 - f l o w s p e c . t x t
删除IPv4 flowspec:对DELETE操作使用相同的URI删除所有BGP-FS路由。 为了删除一个特定的路由附加URI与bgp-flowspec:flowspec-route / route-key_value。
5 添加IPv6流量规范(BGP-FS),使用给指定的Restful API:
URI:
http://
:8181/restconf/config/bgp-rib:application-rib/ex
ample-app-rib/tables/bgp-types:ipv6-address-family/bgp-
flowspec:flowspec-subsequent-address-family/bgp-
flowspec:flowspec-ipv6-routes
Method: PUT
上述PUT请求的示例JSON可以在github链接访问: h t t p
s : / / g i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / b l o b / m a s t e r / c h a p t e r 6 / c
h a p t e r 6 - r e c i p e 3 / s a m p l e s / a d d - i p v 6 - u n i c a s t - r o u t e . t x t
删除IPv6 flowspec:在上面的链接上使用DELETE操作删除所有BGP-FS路由。 要删除特定路由前缀的URI与bgp-flowspec:flowspec-route/
.
RIB实现中,路由信息存放在opendaylight模型驱动服务抽象层(MD-SAL)数据存储。该实现支持四种类型的路由,即:IPv4Routes, IPv6Routes, LinkstateRoutes, FlowspecRoutes.这些路由可以通过REST API进行管理。
为了方便postman通过Rest API管理路由,我们可以通过Github下载链接h t t p s : / / g i t h u b . c o m / j g o o d y e a r / O p e n Da y l i g h t C o o k b o o k / t r e e / m a s t e r / c h a p t e r 6 / c h a p t e r 6 - r e c i p e 3 / p o s t m a n 。记得变更Opendaylight IP地址和JSON请求内容参数值,以符合您要求的配置。此外,我们可以通过Java捆绑的方式,用编程方式管理路由。
本部分将指导您手动配置完成OpenDaylight控制器XML文件,通过使用PCEP与路由器连接。路由器和OpenDaylight都需配置。一旦建立连接,控制器将可以用来查看标签交换路径和路径计算客户端信息。PCEP REST API 可用于执行CRUD类型的隧道管理操作。
下面的配置需要通过BGP-PCEP实现,它将实现路由器到OpenDaylight控制器的链接。Opendaylight预配置了基本PCEP配置,此配置应查看属性描述。
按照以下说明编辑Opendaylight XML文件以配置PCEP。
1 使用karaf脚本启动OpenDaylight,该脚本将为您提供访问karaf CLI的权限。
2 安装面向用户的功能下载使用PCEP连接到路由器所需的所有依赖
3 配置PCEP文件:一旦OpenDaylight karaf成功安装,在karaf根目录下加“etc / opendaylight / karaf”下面就创建了XML配置文件。与PCEP配置相关的XML配置文件如下:32-pcep.xml, 39-pcep-provider.xml, 和 33-pcep-segment- routing.xml。更新39-pcep-provider.xml指定部分配置,设置PCE的初始化地址以及侦听端口。添加“listen-address”和“listen-port”的标签如下:
重新启动opendaylight 并重新安装相关feature,使新配置生效。
4 使用Opendaylight检索PCEP 拓扑数据:Opendaylight定义了“PCEP拓扑”用于存储PCEP操作状态。拓扑显示PCC,并且显示发起每一个PCC隧道。如果没有配置PCC,则PCEP拓扑将没有条目显示。
使用以下URI访问PCEP拓扑:http://
:8181/restconf/operational/network-topology:network- topology/topology/pcep-topology
通过安装功能odl-bgpcep-pcep-all,启用PCEP实现的所有必要的依赖都会被下载。需要安装odl-restconf-all插件,通过应用 PCEP访问 Restful API。安装功能后,将创建基线XML配置文件。 Opendaylight中的PCEP实现提供了三个主要的配置文件,如下所示:
32-pcep.xml : 该文件定义了PCEP基础配置,如会话参数,不需要修改。
39-pcep-provider.xml : 此文件包含PCEP的示例配置文件。 PCEP默认设置适用于有状态(stateful07)PCEP扩展。 它需要更新服务器配置以适合您的部署。
33-pcep-segment-routing.xml : 该文件包含PCEP提供segment-routing的配置,无需修改。
配置完成并重新启动karaf实例后,Opendaylight会使用这些参数。 每个PCC客户端作为节点添加到实现提供的PCEP拓扑。
本部分将指导您完成创建,更新和删除draft-ietf-pce-stateful-pce-07和draft-ietf-pce-pce-initiated-lsp-00的LSP。PCC需要配置并运行起来。PCE是Opendaylight PCEP实现。建立了PCC到PCE连接,就可以使用PCEP远程过程调用实现来管理LSP。
配置需要PCC客户端完成安装,Opendaylight控制器完成BGP-PCEP使用。在这里我们使用pcc-mock测试工具和PCEP绑定,完成对隧道创建,更新和删除。在本部分还可以看到如何一步一步配置pcc-mock工具。
PCEP实现提供以下远程过程调用以便能够管理LSP。
1 要创建LSP,请按名称使用RPC:add-lsp在以下URI访问,并且使用指定JSON输入。
http://
:8181/restconf/operations/network-topology-pcep:
add-lsp方法: POST 内容类型: application/xml输入示范:
2 为了更新上面的步骤中创建的LSP使用RPC update-lsp和下面给出的JSON请求。
URL http://
:8181/restconf/operations/network-topology-pcep:update-lsp方法: POST内容类别: application/xml
输入示范:
3 删除LSP,请使用RPC remove-lsp和JSON请求,如下所示.URI:http://
:8181/restconf/operations/network-topology-pcep:
remove-lsp方法: POST类别: application/xml
输入示范:
方便使用postman收集功能,我们将REST操作管理LSP应用如下:
h t t p s : / / g i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b oo k / t r e e / m a s t e r / c h a p t e r 6 / c h a p t e r 6 - r e c i p e 5 / p o s t m a n
PCC客户端工具pcep-mock可以从链接下载为可执行jar:h t t p s : / / g
i t h u b . c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / t r e e / m a s t e r / c h a p t e r 7 / c h a p t e r 7 - r e c i pe 5 / p c c - m o c k / r e s o u r c e s
有关参数的详细信息,请参阅PCEP的RFC:draft-ietf-pce-stateful-pce-07和draft-ietf-pce-pce-initiated-lsp-00有关参数详细信息,请参阅pcc-mock的README。 假设Opendaylight控制器正在运行,并且安装了BGP-PCEP的必要功能。对于以下部分,我们运行pcc-mock如下例:
注意:本地地址是PCC IP地址,PCE地址应该是Opendaylight IP地址。 您现在应该能够看到以下输出到您的控制台:
本部分将指导您完成创建,更新和删除draft-ietf-pce-segment-routing-01 LSP路径。draft-ietf-pce-segment-routing-01是PCEP的segment routing的实现,并且扩展了上面一节提到的2个draft,draft-ietfpce-stateful-pce-07和draft-ietf-pce-pce-initiated-lsp-00。
本部分需要运行实例“pcc-mock”测试工具,正如前面描述的。
PCEP实现提供以下远程过程调用以能够管理segment routing LSP。
1. 创建segment routing LSP,使用“add-lsp”RPC。样例JSON ,输入如下:
URI: http://
:8181/restconf/operations/network-topolo
gy-pcep:add-lsp方法: POST 类别: application/xml
主体部分:
2 更新,使用RPC “update-lsp”,示例JSON如下。URI: http://
:8181/restconf/operations/network-topolo