OpenDaylight BGP使用者指引


译者:胖欧巴,在SDN的路上渐行渐远

概述

本节主要介绍OpenDaylight中BGP项目,对其配置和如何使用进行阐述。包括通过修改模块文件和RESTCONF的方式对BGP进行配置,并且举例介绍查看BGP拓扑和Populate BGP。

OpenDaylight的Karaf distribution会对基线版本的BGP进行预配置。可以在目录etc/opendaylight/karaf下找到两个文件:
  • 31-bgp.xml(定义基本解析和RIB支持)
  • 41-bgp-example.xml(包含了一个定制化部署的简单配置)


下面的内容将描述如何手动或者通过RESTCONF配置BGP。

配置BGP

RIB

<module>
    <type>prefix:rib-impl</type>
    <name>example-bgp-rib</name>
    <rib-id>example-bgp-rib</rib-id>
    <local-as>64496</local-as>
    <bgp-id>192.0.2.2</bgp-id>
    <cluster-id>192.0.2.3</cluster-id>
    ...
</module>


  • rib-id:BGP RIB Identifier,在这个配置文件中你可以通过复制粘贴的上方代码的方式指定很多BGP RIB。这些RIB必须有独一无二的rib-id和名称。

  • local-as:本地AS编码(部署OpenDaylight的位置),我们把这个用于最佳路径选择

  • bgp-id:本地BGP身份(部署OpenDaylight的虚拟机IP),用于最佳路径选择

  • cluster-id:Cluster Identifier,非强制部署,如无详细说明则只使用BGP Identifier


部分配置不是不必须的:主要取决于你的BGP路由器,你可能需要将链路状态属性类型在99和29中进行切换。检查路由器厂商版本。如果路由器支持类型为29,可以对iana-linkstate-attribute-type域进行更改。这位于本地文件31-bgp.xml中。

<module>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate">prefix:bgplinkstate</
type>
    <name>bgp-linkstate</name>
    <iana-linkstate-attribute-type>true</iana-linkstate-attribute-type>
</module>

  • iana-linkstate-attribute-type:IANA对BGP链路状态属性类型(=29)发布了早期配置。当TYPE=99时设置值为false;使用IANA指定类型29,可以将值设置为ture或者删除(默认删除为true)。


BGP Peer

客户端启动使用默认配置时会忽略初始化配置。因此第一步是修改包含bgp-peer的模块。

<module>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgppeer</
type>
    <name>example-bgp-peer</name>
    <host>192.0.2.1</host>
    <holdtimer>180</holdtimer>
    <peer-role>ibgp</peer-role>
    <rib>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:cfg">prefix:rib</type>
    <name>example-bgp-rib</name>
    </rib>
    ...
</module>


  • name:BGP Peer的名称,在这个配置文件中你可以通过复制粘贴上述模块指定很多的BGP Peer。

  • host:BGP speker的IP地址或主机名(OpenDaylight连接全局拓扑的IP)

  • holdtimer:单位:秒
  • peer-role:如果peer的角色没有声明,将使用默认值"ibgp"(角色的值也可以是"ebgp"或"rr-client")。这个地方区分大小写。
  • rib:BGP RIB身份证明


连接属性配置-可选

<module>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:reconnectstrategy">prefix:timedreconnect-
strategy</type>
    <name>example-reconnect-strategy</name>
    <min-sleep>1000</min-sleep>
    <max-sleep>180000</max-sleep>
    <sleep-factor>2.00</sleep-factor>
    <connect-time>5000</connect-time>
    <executor>
    <type xmlns:netty=
"urn:opendaylight:params:xml:ns:yang:controller:netty">netty:netty-eventexecutor</
type>
    <name>global-event-executor</name>
    </executor>
</module>


  • min-sleep-尝试重新连接的最小睡眠时间(毫秒)

  • max-sleep-尝试重新连接的最大睡眠时间(毫秒)

  • sleep-factor-尝试重新连接睡眠时间的功率因素

  • connect-time-TCP尝试连接的等待时间,默认连接时间超时TCP将进行重传


BGP Speaker配置

之前的条目解决了OpenDaylight初始化的BGP连接配置。OpenDaylight同时也支持BGP Speaker功能和接收Incomming BGP连接。

BGP Speaker在本地的配置文件41-bgp-example.xml中:
<module>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-peeracceptor</
type>
    <name>bgp-peer-server</name>
    <!--Default parameters-->
    <!--<binding-address>0.0.0.0</binding-address>-->
    <!--<binding-port>1790</binding-port>-->
    ...
    <!--Drops or accepts incoming BGP connection, every BGP Peer that should
be accepted needs to be added to this registry-->
    <peer-registry>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-peerregistry</
type>
    <name>global-bgp-peer-registry</name>
    </peer-registry>
</module>


修改speaker配置

修改绑定地址:取消地址绑定的tag并且修改地址(例如修改为127.0.0.1)。默认绑定地址为0.0.0.0。

修改绑定端口:取消地址绑定的tag并且修改端口(例如修改为1790)。默认绑定端口为179(详见BGP RFC)。

Incomming BGP连接

BGP Speaker丢弃所有来自未知BGP Peer的BGP连接。这个由添加到Speaker中的bgp-peer-registry配置(registry在31-bgp.xml中注册)。

如果需要配置BGP peer到注册表中,只需在例如41-bgp-example.xml文件中配置常规的BGP Peer。注意:BGP peer取决于相同的bgp-peer-registry和bgp-speker:
<module>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgppeer</
type>
    <name>example-bgp-peer</name>
    <host>192.0.2.1</host>
    ...
    <peer-registry>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgp-peerregistry</
type>
    <name>global-bgp-peer-registry</name>
    </peer-registry>
    ...
</module>


BGP peer自身可以注册到注册表中,允许进入bgp-speaker处理的BGP连接。(peer-registry的配置属性现在是可选的,并且向后兼容)。通过配置,OpenDaylight将初始化到192.0.2.1的连接并且也会接收到来自192.0.2.1的连接。在实际中两个连接都将被建立,其中只有一个会保持,另一个会被丢弃。低级别bgp的设备在初始化连接时会被注册表丢弃。每个BGP peer必须在自己的模块中进行配置。注意,模块的名字需要有区分,所以在配置很多peer的情况下更改主机时也要将名字一并更改。有一种只用于传入连接的配置peer方法(这个连接不会被OpenDaylight初始化,OpenDaylight只会等待对端peer的传入连接。对端peer用他的IP地址标识id)。配置仅用于传入连接属性initiate-connection添加到对端peer。

<module>
    <type xmlns:prefix=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">prefix:bgppeer</
type>
    <name>example-bgp-peer</name>
    <host>192.0.2.1</host> // IP address or hostname
of the speaker
    <holdtimer>180</holdtimer>
    <initiate-connection>false</initiate-connection> // Connection will not
be initiated by ODL
    ...
</module>

  • initiate-connection:如果将值设为false,OpenDaylight将不会初始化到这个peer的连接,每个peer的默认设置值为true。


BGP Application Peer

一个BGP speaker需要注册所有能连接到他的peer(也就是说一个没配置的BGP peer,OpenDaylight不能与其成功连接)。第一步是配置RIB。然后,用自己的RIB应用配置peer应用以取代peer的固定配置。修改bgp-peer-id的值为本地BGP-ID,该id用于BGP最佳路径选择算法。

<module>
    <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgpapplication-
peer</type>
    <name>example-bgp-peer-app</name>
    <bgp-peer-id>10.25.1.9</bgp-peer-id>
    <target-rib>
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:rib-instance</
type>
        <name>example-bgp-rib</name>
    </target-rib>
    <application-rib-id>example-app-rib</application-rib-id>
    ...
</module>

  • bgp-peer-id:本地BGP的id(部署OpenDaylight的虚拟机IP),用于最佳路径选择
  • target-rib:数据传输所用的已存在RIB的ID
  • application-rib-id:本地appplication RIB的ID(所有在OpenDaylight设置的路由都将在这里显示)


通过RESTCONF配置

另一种配置BGP的方法是通过RESTCONF进行动态配置。在启动前确认你已经完成了安装指南的1-5步骤。这时不用再重启Karaf,而是去加载另一个feature,该feature将提供访问restconf/config/URL的功能。
feature:install odl-netconf-connector-all


通过下面链接获取已配置的模块:localhost:8181/restconf/config/network-topology:network-topology/topology/topologynetconf/
node/controller-config/yang-ext:mount/config:modules/ 这个URL也用于POST新配置。如果想修改此列表中的任意其他配置,确定包括了正确的命名空间,即可。RESTCONF将会反馈命名空间的错误。

使用PUT或绝对路径更新已存在的配置。

遵循用户指南中的描述的步骤至关重要。

RIB

首先,设置RIB。这个模块已经进行了配置,我们要做的就是去修改我们需要的参数。在这个例子中,修改bgp-rib-idlocal-as

URL:http://127.0.0.1:8181/restconf ... p-rib

PUT:
<module xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
    <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:rib-impl</
type>
    <name>example-bgp-rib</name>
    <session-reconnect-strategy xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:protocol:framework">x:reconnectstrategy-
factory</type>
        <name>example-reconnect-strategy-factory</name>
    </session-reconnect-strategy>
    <rib-id xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">example-bgprib</
rib-id>
    <extensions xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:spi">x:extensions</
type>
        <name>global-rib-extensions</name>
    </extensions>
    <codec-tree-factory xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">x:bindingcodec-
tree-factory</type>
        <name>runtime-mapping-singleton</name>
    </codec-tree-factory>
    <tcp-reconnect-strategy xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:protocol:framework">x:reconnectstrategy-
factory</type>
        <name>example-reconnect-strategy-factory</name>
    </tcp-reconnect-strategy>
    <data-provider xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">x:bindingasync-
data-broker</type>
        <name>pingpong-binding-data-broker</name>
    </data-provider>
    <local-as xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">64496</local-as>
    <bgp-dispatcher xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type>bgp-dispatcher</type>
        <name>global-bgp-dispatcher</name>
    </bgp-dispatcher>
    <dom-data-provider xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom">x:dom-async-databroker</
type>
        <name>pingpong-broker</name>
    </dom-data-provider>
    <local-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type>bgp-table-type</type>
        <name>ipv4-unicast</name>
    </local-table>
    <local-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type>bgp-table-type</type>
        <name>ipv6-unicast</name>
    </local-table>
    <local-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type>bgp-table-type</type>
        <name>linkstate</name>
    </local-table>
    <local-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type>bgp-table-type</type>
        <name>flowspec</name>
    </local-table>
    <bgp-rib-id xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">192.0.2.2</bgprib-
id>
</module>


Important:需不需要取决于你的BGP路由器,你可能需要在链路状态属性类型99和29之间进行选择。联系你的路由器厂商获取相关信息。如果路由器支持类型29可以选择为true。

URL:http://127.0.0.1:8181/restconf ... state

PUT:
<module xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
    <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate">x:bgplinkstate</
type>
    <name>bgp-linkstate</name>
    <iana-linkstate-attribute-type xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:linkstate">true</ianalinkstate-
attribute-type>
</module>


BGP Peer

我们同样需要对bgp-peer进行配置。在这个例子中,需要对整个模块进行配置。请更改hostholdtimerpeer-role(如果需要的话)的值。

POST:
<module xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
    <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgp-peer</
type>
    <name>example-bgp-peer</name>
    <host xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">192.0.2.1</host>
    <holdtimer xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">180</holdtimer>
    <peer-role xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">ibgp</peer-role>
    <rib xmlns"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:cfg">x:rib</type>
        <name>example-bgp-rib</name>
    </rib>
    <peer-registry xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgp-peerregistry</
type>
        <name>global-bgp-peer-registry</name>
    </peer-registry>
    <advertized-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgp-tabletype</
type>
        <name>ipv4-unicast</name>
    </advertized-table>
    <advertized-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgp-tabletype</
type>
        <name>ipv6-unicast</name>
    </advertized-table>
    <advertized-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgp-tabletype</
type>
        <name>linkstate</name>
    </advertized-table>
    <advertized-table xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgp-tabletype</
type>
        <name>flowspec</name>
    </advertized-table>
</module>


你所需求的信息可以通过连接speaker的ODL获取。

BGP Application Peer

修改bgp-peer-id也就是本地BGP ID的值,用于BGP最佳路径选择算法。

POST:
<module xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
    <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:bgpapplication-
peer</type>
    <name>example-bgp-peer-app</name>
    <bgp-peer-id xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">10.25.1.9</bgppeer-
id> <!-- Your local BGP-ID that will be used in BGP Best Path Selection
algorithm -->
    <target-rib xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">x:rib-instance</
type>
        <name>example-bgp-rib</name>
    </target-rib>
    <application-rib-id xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">example-apprib</
application-rib-id>
    <data-broker xmlns=
"urn:opendaylight:params:xml:ns:yang:controller:bgp:rib:impl">
        <type xmlns:x=
"urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">x:bindingasync-
data-broker</type>
        <name>pingpong-binding-data-broker</name>
    </data-broker>
</module>


教程

查看BGP拓扑

将简单介绍能够通过RESTCONF查看BGP数据。这也是当前查看这些数据的唯一方式。

Important:从Helium版本开始端口从8080变为8181.

网络拓扑视图

网络拓扑的基本URL是:http://localhost:8181/restconf ... logy/

如果正确的配置了BGP,应该会像下面这样显示:
<network-topology>
    <topology>
        <topology-id>pcep-topology</topology-id>
        <topology-types>
            <topology-pcep/>
        </topology-types>
    </topology>
    <topology>
        <server-provided>true</server-provided>
        <topology-id>example-ipv4-topology</topology-id>
        <topology-types/>
    </topology>
    <topology>
        <server-provided>true</server-provided>
        <topology-id>example-linkstate-topology</topology-id>
        <topology-types/>
    </topology>
</network-topology>


BGP数据由BGP speaker发送,如果三个拓扑都已配置会展示三个拓扑:

example-linkstate-topology:通过链路状态更新信息展示链接和节点,链接:http://localhost:8181/restconf ... ology

example-ipv4-topology:展示拓扑中节点的IPv4地址,链接:http://localhost:8181/restconf ... ology

example-ipv6-topology:展示拓扑中节点的IPv6地址,链接:http://localhost:8181/restconf ... ology

路由信息库(RIB)视图

另一个视图通过BGP RIBs提供BGP数据,URL如下:http://localhost:8181/restconf ... -rib/

这里有多个配置的RIB:
  • AdjRibsIn(per Peer):Adjacency RIB In,来自BGP Peer的BGP路由信息
  • EffectiveRib(per Peer):在导入策略后的BGP路由信息
  • LocRib(per RIB):Local RIB,所有BGP Peer的BGP路由信息
  • AdjRibsOut(per Peer):Adjacency RIB Out,在使用外部的策略后,将通知BGP路由


当配置IPv4地址和链路状态时,输出是这样的:
<loc-rib>
    <tables>
        </attributes>
        <safi>x:linkstate-subsequent-address-family</safi>
        <afi>x:linkstate-address-family</afi>
        </linkstate-routes>
    </tables>
    <tables>
        </attributes>
        <safi>x:unicast-subsequent-address-family</safi>
        <afi>x:ipv4-address-family</afi>
        </ipv4-routes>
    </tables>
</loc-rib>


你可以通过扩展这些RESTCONF连接看到每个AFI的细节;

IPv4:http://localhost:8181/restconf ... outes

Linkstate:http://localhost:8181/restconf ... outes

Populate RIB

如果已经配置了peer,可以通过调用下面的RESTCONF填充RIB:

URL:http://localhost:8181/restconf ... mily/
  • example-app-rib就是添加application RIB id(在配置文件中指定的)和指定AFI与SAFI表数据的位置


POST:

Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ipv4-routes xmlns="urn:opendaylight:params:xml:ns:yang:bgp-rib">
    <ipv4-route>
        <prefix>200.20.160.1/32</prefix>
        <attributes>
            <ipv4-next-hop>
                <global>199.20.160.41</global>
            </ipv4-next-hop><as-path/>
            <multi-exit-disc>
                <med>0</med>
            </multi-exit-disc>
            <local-pref>
                <pref>100</pref>
            </local-pref>
            <originator-id>
                <originator>41.41.41.41</originator>
            </originator-id>
            <origin>
                <value>igp</value>
            </origin>
            <cluster-id>
                <cluster>40.40.40.40</cluster>
            </cluster-id>
        </attributes>
    </ipv4-route>
</ipv4-routes>


这个请求的预期响应,是204 No content

译者:胖欧巴,在SDN的路上渐行渐远

转载请联系作者并注明出处。

1 个评论

顶一下,翻译组辛苦了!

要回复文章请先登录注册