本文主要是提供了有關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目錄下,可以在管理節點上部署,當集群部署時他們將自動被復制到在單元實例中的正確位置。
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"
}
]
}
]
}
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
由實驗驗證可知,主機間是可以通信的。