本文主要是提供了有关ONOS的SDN-IP实例如何安装、配置及在SDN网络中如何运行SDN-IP的操作,通过实践了解并实现SDN网络与外部网络无缝对接融合。
1 网络模型
SDN-IP允许SDN网络与使用BGP路由协议相邻的外部网络对等和交换流量。下图显示了SDN-IP网络模型中的各种元素。
2 BGP对等拓扑实例
对于如何设置BGP拓扑没有严格的要求,只要每个SDN-IP实例能够接收通过iBGP发布的SDN网络的所有路由就可以了。下图显示了一个BGP配置实例:
上图网络中的各个节点和线显示了BGP对等会话。黑线是内部BGP Speaker和外部BGP路由器之间建立的eBGP会话,红线是BGP Speaker和SDN-IP实例之间的iBGP会话。
每个外部BGP路由器于一个或多个内部BGP Speaker对等。 SDN-IP目前不支持外部多跳BGP对等会话,所以每个对等会话必须在同一个子网中。不同的对等会话可以在不同的子网中,所以为了对接外部路由器,在SDN网络中需要为每个对等会话分配IP地址。在SDN网络中的IP地址被分配给BGP Speaker。它不要求每个内部BGP Speaker对应外部每个路由器,因为BGP Speaker在他们之间使用iBGP重新分配路由。然而,对于完全冗余的对接外部网络,外部peer应该有多个内部BGP Speaker对等会话。上图可以看出, BGPRouter1与每个内部BGP Speaker进行对等会话。
网络内的BGP Speaker使用iBGP与SDN-IP实例进行对等会话。SDN-IP是一个被动的iBGP peer:它监听BGP是否更新,但它不通知其自身的更新。在网络内的iBGP对等会话可以设置成多种方式,最简单的方法是在BGP Speaker和SDN-IP实例之间进行全网的iBGP对等会话,如上图红色线iBGP所示,通过这种方式,网络中所有BGP节点都可以学习所有的路由。两个SDN-IP实例之间的iBGP会话是没有必要的,因为在SDN-IP实例中不上报自己的路由。各种不同的iBGP拓扑结构如下图所示:
3 SDN-IP配置
SDN-IP目前采用的是简单的JSON文件格式导入配置数据,主要有两个单独的文件:用来存储IP和MAC地址的addresses.json和存储BGP对等会话数据的sdnip.json。
网络文件配置:
配置文件需要放置在config目录下。手动部署ONOS和SDN-IP,需要把配置文件复制在每个实例的config目录下,目录在KARAF_ROOT/../config,路径目前还没有配置。使用ONOS单元机制部署一个ONOS群集时,该配置文件可以放在ONOS_ROOT/tools/package/config目录下,可以在管理节点上部署,当集群部署时他们将自动被复制到在单元实例中的正确位置。
#p#
3.1 Addresses配置
Addresses.json配置的ONOS地址用来与外部网络通信,主要是为了给proxy ARP使用,proxy ARP知道怎样响应来自外部网络的ARP请求。如下所示:
{ "addresses" : [ { "dpid" : "00:00:00:00:00:00:00:a1", "port" : "1", "ips" : ["10.0.1.101/24"], "mac" : "00:00:00:00:00:01" }, { "dpid" : "00:00:00:00:00:00:00:a2", "port" : "1", "ips" : ["10.0.2.101/24"], "mac" : "00:00:00:00:00:01" }, { "dpid" : "00:00:00:00:00:00:00:a5", "port" : "1", "ips" : ["10.0.3.101/24"], "mac" : "00:00:00:00:00:01" }, { "dpid" : "00:00:00:00:00:00:00:a6", "port" : "1", "ips" : ["10.0.4.101/24"], "mac" : "00:00:00:00:00:01" } ] }
文件中包含多个地址项的数组,每个地址项描述了交换机端口绑定的一系列地址,每个项包含绑定的交换机端口(通过DPID和端口号指定)、一系列的IP地址绑定到端口、一个单独的MAC地址被用来每个IP地址的ARP响应。SDN-IP运行时,被SDN网络用来对等外部BGP路由器的每个地址需要配置到addresses.json文件中。
3.2 BGP配置
sdnip.json文件包含BGP对等会话的详细信息,也包含内部BGP Speaker 和外部BGP peers之间的连通性。
{ "bgpPeers" : [ { "attachmentDpid" : "00:00:00:00:00:00:00:a1", "attachmentPort" : "1", "ipAddress" : "10.0.1.1" }, { "attachmentDpid" : "00:00:00:00:00:00:00:a2", "attachmentPort" : "1", "ipAddress" : "10.0.2.1" }, { "attachmentDpid" : "00:00:00:00:00:00:00:a5", "attachmentPort" : "1", "ipAddress" : "10.0.3.1" }, { "attachmentDpid" : "00:00:00:00:00:00:00:a6", "attachmentPort" : "1", "ipAddress" : "10.0.4.1" } ], "bgpSpeakers" : [ { "name" : "bgp", "attachmentDpid" : "00:00:00:00:00:00:00:a3", "attachmentPort" : "1", "macAddress" : "00:00:00:00:00:01", "interfaceAddresses" : [ { "interfaceDpid" : "00:00:00:00:00:00:00:a1", "interfacePort" : "1", "ipAddress" : "10.0.1.101" }, { "interfaceDpid" : "00:00:00:00:00:00:00:a2", "interfacePort" : "1", "ipAddress" : "10.0.2.101" }, { "interfaceDpid" : "00:00:00:00:00:00:00:a5", "interfacePort" : "1", "ipAddress" : "10.0.3.101" }, { "interfaceDpid" : "00:00:00:00:00:00:00:a6", "interfacePort" : "1", "ipAddress" : "10.0.4.101" } ] } ] }
#p#
sdnip.json主要是包含两个列表: bgpPeers 和 bgpSpeakers。
bgpPeers包含SDN网络对等的外部peer的entry,每个peer有一个对等的地址,连接SDN网络的接入点通过DPID和port来指定。
bgpSpeakers包含SDN网络中每个BGP Speaker的entry,BGP Speaker的头部包含了Speaker的任意名称,连接SDN网络的接入点和BGP Speaker的MAC地址。每个BGP Speaker有一系列的“interfaceaddress”和IP地址用来对等会话。
3.3 SDN-IP端口配置
上文已经提过,bgp端口地址是5000,在 KARAF_ROOT/etc/org.onosproject.sdnip.SdnIp.cfg.文件中进行配置:
bgpPort=5000
4 运行SDN-IP
onos-app-config 用来读 addresses.json里的文件信息;onos-app-proxyarp用来代表主机和路由器响应ARP请求的proxy arp模块
onos> feature:install onos-app-config onos> feature:install onos-app-proxyarp
配置依赖满足后,安装sdn-ip应用:
onos> feature:install onos-app-sdnip
sdn-ip启动,阅读配置文件并安装网络intents建立 BGP peering 会话的连通性,然后使用多点单点intents安装网络开始接收路由。
以下SDN-IP命令主要用于用户监控系统状态:
显示连接SDNIP的IBGP邻居,每个邻居有一个内部BGPSpeaker,可以显示显示特定的邻居:
bgp-neighbors [-j|--json] [-n|--neighbor ]
显示BGP peers接收到的***路由信息,包括BGP指定信息:
bgp-routes [-j|--json] [s|--summary]
显示一个特定BGP邻居的所有路由信息(即使不是***路由):
bgp-routes [-j|--json] [n|–neighbor ]
显示SDNIP的路由表信息,应该几乎和BGP路由信息相同,但是包括其他源路由信息:
routes [-j|--json] [s|--summary]
4.1 故障排查
(1)检查SDNIP是否被安装:
onos>feature:list | grep sdnip
(2)检查内部BGPSpeaker对等ONOS是否正确,如果正确,可以看到一系列内部BGPSpeaker:
onos>bgp-neighbors
(3)检查ONOS是否接收到期待的路由:
onos> routes
(4)路由被接收的话,为每个路由将启动MultiPointToSinglePoint intents,通过查找MultiPointToSinglePoint intents数检查是否正确,和路由数应该是相同的,且所有的intents应该是已安装状态:
onos> intents –s
5 实例演示
5.1 Mininet中的设置
mininet> h1 ip addr show ... inet 192.168.1.1/24 brd 192.168.1.255 scope global h1-eth0 ... mininet> h2 ip addr show ... inet 192.168.2.1/24 brd 192.168.2.255 scope global h2-eth0
每个主机都有一个不同的IP子网,当SDNIP运行时,这些主机之间能够通信,这是因为在SDN网络中使用了基于BGP路由的路由流量。
SDNIP未启动时,主机间ping操作,是不通信的:
mininet> h1 ping h2 PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data. From 192.168.1.254 icmp_seq=1 Destination Net Unreachable From 192.168.1.254 icmp_seq=2 Destination Net Unreachable From 192.168.1.254 icmp_seq=3 Destination Net Unreachable
5.2 SDN-IP启动运行
onos> feature:install onos-app-config onos> feature:install onos-app-proxyarp onos> feature:install onos-app-sdnip
SDNIP成功启动后验证主机间的连通性:
mininet> h1 ping h2 PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data. 64 bytes from 192.168.2.1: icmp_seq=1 ttl=62 time=0.693 ms 64 bytes from 192.168.2.1: icmp_seq=2 ttl=62 time=0.139 ms 64 bytes from 192.168.2.1: icmp_seq=3 ttl=62 time=0.149 ms
由实验验证可知,主机间是可以通信的。