本章中,我们将主要涉及如下内容:
Openflow交换机的远程配置
网络设备Yang模型的动态更新
引导程序的网络安全
本章中,我们将主要集中于在SDN内部的网络设备间建立动态连接。由于SNMP、OpConf有不一样的网络管理和配置协议,Opendaylight为不同的协议实现了统一的南向API以便于对大规模的网络设备进行统一管理。
OpenFlow配置协议(OF-Config)使SDN控制器来配置OpenfFlow交换机变得越来越简单。OF-Config是为Opendaylight提供远程配置OpenFlow数据通道能力的南向接口插件。
通过本单元你将学习如何使用Opendayligth将OpenVSwitch看作一个标准Openflow switch来进行远程配置。本章需要一个新的Opendaylight环境以及安装了OpenVSwitch 2.3、libnetconf和OF-Config supporting for OVS的Ubuntu14.04虚拟机。你可以从https://github.com/serngawy/of-config下载满足上述所有要求的Vagrant文件。你需要安装在你的计算机中的Vagrant软件来运行vagrant文件。要安装Vagrant,请访问https://www.vargantup.com。最后,可使用postman或其它任何REST API客户端来执行Opendaylight的REST API远程调用。
1. 使用karaf script启动Opendayligth环境,同时获得Karaf CLI的命令行入口:
$ cd distribution-karaf-0.4.1-Beryllium-SR1/
$ ./bin/karaf
________ ________ .__ .__ .__ __
\_____ \ ______ ____ ____ \______ \ _____ ___.__.| | |__| ____ | |___/
|_
/ | \\____ \_/ __ \ / \ | | \\__ \< | || | | |/ ___\| | \ __\
/ | \ |_> > ___/| | \| ` \/ __ \\___ || |_| / /_/ > Y \ |
\_______ / __/ \___ >___| /_______ (____ / ____||____/__\___ /|___|
/__|
\/|__| \/ \/ \/ \/\/ /_____/ \/
Hit '
' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '
' or type 'system:shutdown' or 'logout' to shutdown
OpenDaylight.
opendaylight-user@root>
2. 使用如下命令安装OF-Config南向API组件:
opendaylight-user@root> feature:install odl-of-config-all
使用如下命令检查OF-Config已安装的组件:
opendaylight-user@root> feature:list -i | grep of-config
正常情况下将返回如下信息:
3. 现在你需要使用如下命令从github克隆OF-Config仓库,开户新的命令行窗口并输入:
$ git clone https://github.com/serngawy/of-config.git
$ cd of-config/
4. 修改vargant文件中的network interface name使之与主机的网络接口对应。
$ vi Vagrantfile
将第65行的“en0”修改为主机的网络接口名称并保存。
启动虚拟机:
$ vagrant up
需要大概五分钟时间启动虚拟机并安装所需软件。
5. 在虚拟机中运行OVS OF-Config server,可以使用如下命令连接到虚拟机的ssh会话:
$ vagrant ssh
使用如下命令启动OFC-Server:
vagrant@vagrant-ubuntu-trusty-64:~$ sudo ofc-server -v 3 -f
6. 现在我们需要在Opendaylight和运行在虚拟机中的OFC-Server组件之间建立连接。在of-config目录下有一个名为OF-CONFIG.postman_collection的文件,我们要用它来向Opendaylight发送REST调用。
打开Postman并导入OF-CONIFG.postman_collection文件后,将获得3个可用的REST调用,分别是:
Connection-establishment,Modify-controller-connection
和
Get-Network:
7. 使用Connection-establishment payload操作Opendaylight连接到OVS,不要忘记修改payload中的
字段为虚拟机的IP地址。成功后将会收到状态码204:
8. 使用Get-Network payload 检测网络拓扑,将会返回虚拟机的IP地址以及已启用的功能。
Opendaylight使用OF-CONFIG南向接口插件以抽象的逻辑交换机的形式来定义OpenFlow交换机。OF-CONFIG协议允许Opendaylight配置OpenFlow逻辑交换机的essential artifacts,所以Opendaylight可以通过OpenFlow协议与交换机通信并进行控制。OF-Config提供的essential artifacts如下:
sync-conf-ocs: 与具备OpenFlow能力的交换机同步配置
modify-controller-connection: 在Openflow逻辑交换机上修改控制器连接配置
create-tls: 为Openflow逻辑交换机与控制器创建TLS隧道并进行认证证书配置
opt-flowtable: 操作Openflow逻辑交换机的流表
config-tunnel: 在Openflow逻辑交换机中配置隧道
config-port: 在具备Openflow能力的交换机中配置端口及队列
config-ols-basic: 在Openflow逻辑交换机中配置dpid、lost-connection-behavior的基础条目
做为如何在postman collection中使用这些essential artifact的示例,前文提供了编辑控制器连接的payload。此外,也可以参考Opendaylight的API Doc: http://localhost:8181/apidoc/explorer/index.html
使用netconf协议来更新网络设备的Yang模型需要Opendaylight持续捕捉发送至设备的请求。从大规模网络的设备中迭代式的捕捉数据请求(设备的Yang模型)将对网络带来极大的负载。Yang PubSub项目只允许Opendaylight请求网络设备Yang模型的更新部分。本单元我们将向你展示如何使用Opendaylight在netconf网络设备中注册一个持续的请求获取来监听yang模型的更新。
本单元介绍的操作需要Opendaylight Beryllium 环境,Opendaylight Netconf测试工具或具备netconf功能以及Yang推送能力的网络设备,例如Cisco IOS-XR设备。同时需要一个REST API客户端,最后你需要从本书的github仓库下载本单元对应的目录。
1.使用karaf script启动Opendayligth环境,同时获得Karaf CLI的命令行入口:
$ cd distribution-karaf-0.4.1-Beryllium-SR1/
$ ./bin/karaf
________ ________ .__ .__ .__ __
\_____ \ ______ ____ ____ \______ \ _____ ___.__.| | |__| ____ | |___/
|_
/ | \\____ \_/ __ \ / \ | | \\__ \< | || | | |/ ___\| | \ __\
/ | \ |_> > ___/| | \| ` \/ __ \\___ || |_| / /_/ > Y \ |
\_______ / __/ \___ >___| /_______ (____ / ____||____/__\___ /|___|
/__|
\/|__| \/ \/ \/ \/\/ /_____/ \/
Hit '
' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '
' or type 'system:shutdown' or 'logout' to shutdown
OpenDaylight.
opendaylight-user@root>
2. 使用如下命令安装Yang推送功能:
opendaylight-user@root> feature:install
odl-yangpush-ui
使用如下命令检查Yang推送功能的可用性:
opendaylight-user@root> feature:list -i | grep yangpush
正常情况下将返回如下信息:
3. 接下来我们要下载Opendaylight Netconf测试工具。转至本单元目录并执行如下命令下载该工具:
$ cd chapter4/chapter4-recipe5/
$ wget
https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/netconf/netconftesttool/1.0.2-Beryllium-SR2/netconftesttool-1.0.2-Beryllium-SR2-executable.jar
4. 使用如下命令启动Netconf测试工具:
$ java -Xmx1G -XX:MaxPermSize=256M -jar netconf-testtool- 1.0.2-Beryllium-SR2-executable.jar --debug true --schemas-dir schema/
将会获得如下输出
[main] INFO NetconfDeviceSimulator - All simulated devices started successfully from port 17830 to 17830
5. 使用如下命令检测模拟设备是否正常运行:
$ ssh admin@localhost -p 17830 -s netconf
模拟设备的连接允许任意口令。需要时可直接输入回车以继续操作。连接成功后将会返回hello消息。
6. 现在我们要使用postman做为REST API客户端向Opendaylight data store添加模拟的netconf设备并注册持续更新请求以使Opendaylight可以获得Yang模型的更新。从本单元目录中导入yang-push.postman_collection.json文件至postman后,将会得到如下payload:Post YangPush Device, Get Netconf devices and Post RPC Push Updates:
7. 我们要使用第一个REST API payload “Post YangPush Device” 来向Opendaylight data store注册设备。如payload数据所示,该设备名称为xrvr2,按下来可以使用第二个REST API payload “Get Netconf device” 来检测该设备是否成功注册并已连接。
8. 接下来我们要使用“Post RPC Push Updates payload”注册continuous fetch请求以达到从模拟设备接收yang模型更新的目的。请求的返回信息如下:
{
"output": {
"subscription-id": "sub-2"
}
}
注册在Opendaylight中的Push Update请求会以每分钟一次的频率连续不断的向模拟的netconf设备发送fetching update请求。我们通过向simulator schemas目录增加yang-push模块在Netconf 测试工具中模拟了Yang推送能力。在本单元的schema目录下存在如下文件:[email protected], [email protected],以及[email protected]。ietf-datastore-push.yang包含了Opendaylight的可向设备注册的订阅及过滤条件,同时也包含了可向Opendaylight发送的RPC调用的定义。当netconf设备的数据产生了更新,仅更新部分的数据会通过已经注册的continuous fetching update request来向Opendaylight发送。
在一个可伸缩的SDN网络中,基于证书的身份认证以及密钥的分发工作是一个挑战。Opendaylight的SNBI项目提供了zero-touch的安全方法在网络设备和Opendaylight充当的SDN控制器之间建立安全连接。任何利用IEEE 802.1AR – 2009标准进行安全标识的设备均可以与Opendaylight之间建立安全通信。Opendaylight和网络设备会自动发现对方并获取分配到对方的IP地址、交换证书并最终建立安全连接。
本单元需要如下环境:Ubuntu 14.04主机、Opendaylight环境、docker和snbi/beryllium docker镜像、使用Postman做为REST API客户端。并且如果想要使用本单元目录下预定义的vagrant文件的话,还需要安装vagrant。本单元你将学习到如何使用Opendaylight在两个实现了安全设备标识标准的模拟设备之间来建立安全通信。
1.如果已有预备条件中所述的环境,则可忽略本步骤并直接进入第4步。如需使用预定义的vagrant文件来建立环境,首先需要安装vagrant软件,然后转至本单元目录下的SnbiVMs目录:
$ cd chapter4-recipe6/SnbiVMs/
修改vargant文件中的network interface name使之与主机的网络接口对应。
$ vi Vagrantfile
将第65行的“en0”修改为主机的网络接口名称并保存,然后启动虚拟机:
$ vagrant up
需要大概15-20分钟时间启动虚拟机并安装所需软件。
2. 安装完成后,会获得三个运行状态的虚拟机: SnbiODL、Snbi01、Snbi02.
$ vagrant status
将会返回正在运行的虚拟机列表。
3. 现在启动四个控制台窗口并使用vagrant ssh命令登录到每个虚拟机,然后设置虚拟机名称:
$ vagrant ssh snbiODL-vm
$ vagrant ssh snbi1-vm
$ vagrant ssh snbi2-vm
在第四个控制台窗口中登录到snbiODL-vm,我们在Opendaylight的karaf console的操作过程需要操持此控制台的可用。
4. 使用karaf script启动Opendayligth环境,同时获得Karaf CLI的命令行入口:
$ cd distribution-karaf-0.4.1-Beryllium-SR1/
$ ./bin/karaf
________ ________ .__ .__ .__ __
\_____ \ ______ ____ ____ \______ \ _____ ___.__.| | |__| ____ | |___/
|_
/ | \\____ \_/ __ \ / \ | | \\__ \< | || | | |/ ___\| | \ __\
/ | \ |_> > ___/| | \| ` \/ __ \\___ || |_| / /_/ > Y \ |
\_______ / __/ \___ >___| /_______ (____ / ____||____/__\___ /|___|
/__|
\/|__| \/ \/ \/ \/\/ /_____/ \/
Hit '
' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '
' or type 'system:shutdown' or 'logout' to shutdown
OpenDaylight.
opendaylight-user@root>
5. 使用如下命令安装SNBI功能:
opendaylight-user@root> feature:install odl-snbi-all
使用如下命令来检测OF-Config已经安装的功能特性:
opendaylight-user@root> feature:list -i | grep snbi
6. 现在我们需要创建所需的网络拓扑结构以模拟本单元的网络,Snbi1-vm和Snbi2-vm通过直连方式连接到snbiODL-vm。使用如下命令在每个虚拟机中创建网络端口:
$ sudo ip6tables -A INPUT -j DROP -p udp --destination-port 4936 -i eth0
然后检测 iptables:
$ sudo ip6tables –list
7. 现在使用如下命令在网络端口间建立连接:
$ sudo ip link add snbi-ra type dummy
$ sudo ip addr add fd08::aaaa:bbbb:1/128 dev snbi-ra
$ sudo ifconfig snbi-ra up
可以使用如下命令检测snbi-ra的网络端口信息:
$ ifconfig
8. 现在启动Postman并从本单元目录中导入snbi.postman_collection.json文件。导入后将会得到三个REST API请求,分别是:Add domain list, Get domain list 以及Del domain list:
使用Add domain list请求向Opendaylight发送domain列表。
9. 在Karaf CLI中执行start secure_domain命令使Opendaylight转变为active discover模式:
opendaylight-user@root> snbi:start secure_domain
10. 我们首先要在snbiODL-vm中启动snbi/beryllium docker镜像,然后在snbi1-vm和snbi2-vm中也同样启动该镜像。使用如下命令在所有虚拟机中启动snbi/beryllium镜像:
snbiODL-vm:
$ sudo docker run -v /etc/timezone:/etc/timezone:ro --net=host -- privileged=true --rm -t -i -e SNBI_UDI=UDI-FirstFE -e SNBI_REGISTRAR=fd08::aaaa:bbbb:1 snbi/beryllium:latest /bin/bash
snbi1-vm:
$ sudo docker run -v /etc/timezone:/etc/timezone:ro --net=host --privileged=true --rm -t -i –e SNBI_UDI=UDI-dev1 -e SNBI_REGISTRAR=fd08::aaaa:bbbb:1 snbi/beryllium:latest /bin/bash
snbi2-vm:
$ sudo docker run -v /etc/timezone:/etc/timezone:ro --net=host --privileged=true --rm -t -i –e SNBI_UDI=UDI-dev2 -e SNBI_REGISTRAR=fd08::aaaa:bbbb:1 snbi/beryllium:latest /bin/bash
现在在容器的CLI中执行如下命令以检测设备信息:
snbi.d> show snbi device
11. 现在回到Karaf CLI中可以在日志中看到snbi/berylliumcontainers的证书和密钥信息。执行如下命令:
opendaylight-user@root> log:tail
12. 使用如下命令在每个host中验证路由信息:
$ ip -6 route show
13. 现在在几个vm之间使用ping命令验证它们之间的安全连接:
snbiODL-vm > $ ping6 fd02:a8f9:890b:0:e22:f722:cf0b:1
在snbiODL-vm中,Opendaylight和运行在snabi容器中的snapi-agent建立了SSL连接来保证通信的安全性。因为Opendaylight和snbi agent运行在同一主机上,这被看作是安全通信。同时,运行在snabiODL-vm、snabi1-vm和snabi2-vm中的所有snapi-agent使用他们自己的发现协议互相发现对方。所有snabi-agnet之间会建立安全的SSL连接,同时被看作是snabi-agent之间的安全通信。并且运行在snabi-agent主机中的其它网络服务可以基于Opendaylight使用snabi-agent已经建议的SSL连接启动安全通信。