SDN開発エンジニアを目指した活動ブログ

〜SDNなオープンソース製品を実際に使って試してみる〜

OpenFlow簡易ルータの実践活用(3) 〜LinuxボックスでOpenFlowスイッチ構築編〜

最近、SDN業界では、ホワイトボックス版Linuxベースのオープンなネットワーク機器をデプロイする動きが活発ですよね。
ネットワークにダウンサイジングの波 - [1]スイッチの「オープン化」と「スケールアウト」が進む:ITpro
ネットワークにダウンサイジングの波 - [3]ホワイトボックスに賭ける、ACCESSとPica8の挑戦:ITpro

そこで、これまでの技術ブログ活動の集大成として、ホワイトボックス版OpenFlowスイッチによるOpenFlow簡易ルータを自宅ネットワークに導入してみるチャレンジに取り組んでみたいと思います。

◆OpenFlow簡易ルータのハードウェア構成

今後、OpenFlowスイッチの量産化を意識して、OpenFlowルータの物理構成としての要求条件について、優先順位の高いものから選定ポイントを挙げてみます。

(1)複数の物理NICが搭載していること(何は、さておきといった感じです)
(2)DebianLinuxが動作すること(オープン版スイッチは、Debian系が有望とのことなので...)
(3)なるべく、安価であること(小遣いから工面するわけですから)
(4)見た目がルータ機器っぽいこと(見栄えって案外と重要ですよね)
(5)基本構成として、なるべく汎用性が高いこと(動作実績などを重視したいところなんですけど...)

◆ハードウェアの製品選定

これが、予想通り(?)に難航しました。
世の中、多NICポート搭載の小型Linuxボックスって、なかなか見つからない...
個人的な財力があれば、「OpenBlocks AX3」あたりを選定したいところなんですが...

そんな折に、¥12,800 (税込)で4ポートGigabitEthernet搭載のLinuxボックスを見つけました。
株式会社ネクスコム・ジャパン - 産業用ファンレスコンピュータ, Panel PC, 産業用無線LAN, PCベースFA制御, マシンオートメーション, 車載用テレマティクスPC, デジタルサイネージ, ネットワーク&コミュニケーション関連, IP Camera

(1)〜(4)の条件は、満たしておりますね。
(5)は、こちらのブログ記事でも記載されてますように、HDD用の電源ケーブルVGAケーブルが汎用製品ではないという課題がありそうですが、即買いしてOpenFlow簡易ルータの導入に着手しました。
DNA940にFreeBSD10.0-RELEASEをインストールする: AliceSystem開発日記

◆OpenFlow簡易ルータの外観

実際に構築したLinuxボックスは、こんな感じです。
f:id:ttsubo:20140309154004j:plain

ちなみに、汎用品が見当たらないケーブル類は、@wakadannacomさんの助け舟により幸運にもゲットすることができました。
f:id:ttsubo:20140309153948j:plain

  • 16pin→DIN15pin変換VGAケーブル
  • 電源変換ケーブル 4ピン(メス)->SATA15ピン(メス)

Linuxインストールの留意点

DebianLinuxとして、Ubuntu Server版をインストールしました。
ここでの落とし穴は、DNA940搭載CPUは、”Intel® Celeron® M 600MHz”ということなので、PAE非搭載CPUだということですね。
こちらの技術ブログに記載されているように、このままでは、Ubuntu 12.04 LTSをインストールすることができません。
PAE非搭載CPUで使えるLinux » のろまのひでっち ウェブサイト
そこで、敢えて、11.10をインストールした上で、12.04にupgradeしました。
upgrade from 11.10 to 12.04 - No upgrade option available in update manager - Ask Ubuntu

◆自宅ネットワークへの導入形態

Linuxボックスの導入形態は、こちらの構成になります。
f:id:ttsubo:20140309155007j:plain

1. Ryuコントローラの環境構築

まずは、Ryuコントローラ構築からはじめます。

$ sudo apt-get -y install python-pip python-dev libxml2-dev libxslt1-dev python-lxml
$ sudo pip install ryu

2. OpenvSwitch(2.0.1)の環境構築

最近、OpenvSwitch(2.0.1)がリリースされたみたいです。
以下に構築メモを掲載しておきます。

$ uname -a
Linux OFS 3.2.0-60-generic #91-Ubuntu SMP Wed Feb 19 03:55:18 UTC 2014 i686 i686 i386 GNU/Linux
tsubo@OFS:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.4 LTS"

$ wget http://openvswitch.org/releases/openvswitch-2.0.1.tar.gz
$ tar zxvf openvswitch-2.0.1.tar.gz
$ rm openvswitch-2.0.1.tar.gz
$ cd openvswitch-2.0.1
$ sudo apt-get install build-essential fakeroot
$ dpkg-checkbuilddeps
dpkg-checkbuilddeps: Unmet build dependencies: debhelper (>= 8) autoconf (>= 2.64) automake (>= 1.10) | automake1.10 libssl-dev python-all (>= 2.6.6-3~) python-qt4 python-twisted-conch
$ sudo apt-get install debhelper autoconf automake libssl-dev python-all python-qt4 python-twisted-conch
$ dpkg-checkbuilddeps
$ sudo fakeroot debian/rules binary
$ cd ..
$ sudo dpkg -i openvswitch-common_2.0.1-1_i386.deb openvswitch-switch_2.0.1-1_i386.deb
Selecting previously unselected package openvswitch-common.
(Reading database ... 62168 files and directories currently installed.)
Unpacking openvswitch-common (from openvswitch-common_2.0.1-1_i386.deb) ...
Selecting previously unselected package openvswitch-switch.
Unpacking openvswitch-switch (from openvswitch-switch_2.0.1-1_i386.deb) ...
Setting up openvswitch-common (2.0.1-1) ...
Processing triggers for man-db ...
Setting up openvswitch-switch (2.0.1-1) ...
FATAL: Module openvswitch not found.
 * Inserting openvswitch module
 * /etc/openvswitch/conf.db does not exist
 * Creating empty database /etc/openvswitch/conf.db
 * Starting ovsdb-server
 * Configuring Open vSwitch system IDs
FATAL: Module openvswitch not found.
 * Inserting openvswitch module
 * Enabling remote OVSDB managers
Processing triggers for ureadahead ...

$ cd openvswitch-2.0.1
$ sudo apt-get install libtool autopoint
$ ./boot.sh
$ ./configure --with-linux=/lib/modules/`uname -r`/build
$ make
$ ls -la ./datapath/linux/openvswitch.ko
-rw-rw-r-- 1 tsubo tsubo 4107386 Mar  9 10:39 ./datapath/linux/openvswitch.ko

$ modinfo ./datapath/linux/openvswitch.ko
filename:       ./datapath/linux/openvswitch.ko
version:        2.0.1
license:        GPL
description:    Open vSwitch switching datapath
srcversion:     EEA0E974ABDD9576BE7716E
depends:        libcrc32c,gre
vermagic:       3.2.0-60-generic SMP mod_unload modversions 686

$ sudo make modules_install
cd datapath/linux && make modules_install
make[1]: Entering directory `/home/tsubo/openvswitch-2.0.1/datapath/linux'
make -C /lib/modules/3.2.0-60-generic/build M=/home/tsubo/openvswitch-2.0.1/datapath/linux modules_install
make[2]: Entering directory `/usr/src/linux-headers-3.2.0-60-generic'
  INSTALL /home/tsubo/openvswitch-2.0.1/datapath/linux/openvswitch.ko
  DEPMOD  3.2.0-60-generic
make[2]: Leaving directory `/usr/src/linux-headers-3.2.0-60-generic'
depmod `sed -n 's/#define UTS_RELEASE "\([^"]*\)"/\1/p' /lib/modules/3.2.0-60-generic/build/include/generated/utsrelease.h`
make[1]: Leaving directory `/home/tsubo/openvswitch-2.0.1/datapath/linux'

$ sudo modprobe gre
$ sudo modprobe libcrc32c
$ sudo insmod ./datapath/linux/openvswitch.ko

$ lsmod|grep open
openvswitch            75156  0 
libcrc32c              12543  1 openvswitch
gre                    12853  1 openvswitch


$ sudo vi /etc/network/interfaces
————————
auto eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0

auto eth1
iface eth1 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ip link set $IFACE promisc on
down ip link set $IFACE promisc off
down ifconfig $IFACE down

auto eth2
iface eth2 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ip link set $IFACE promisc on
down ip link set $IFACE promisc off
down ifconfig $IFACE down
————————

$ sudo reboot

$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl add-port br0 eth1
$ sudo ovs-vsctl add-port br0 eth2
$ sudo ovs-vsctl set-controller br0 tcp:192.168.0.100:6633
$ sudo ovs-vsctl set bridge br0 other-config:datapath-id=0000000000000001
$ sudo ovs-vsctl set bridge br0 protocols=OpenFlow13

datapath-idもデフォルト値を使用せず、敢えて、「0000000000000001」を前提としております。
OpenvSwitch設定パラメータは以下の通りです。
(OpenFlowチャネルも、昔のポート番号6633のままとしております)

3. OpenFlow簡易ルータの動作準備

ここからは、PC版OpenvSwitchによるOpenFlow簡易ルータの動作準備とまったく同一ですが、いちおう再掲しておきます。
Ryu SDN Frameworkが動作する環境に、OpenFlow簡易ルータのプログラム一式を以下のサイトからダウンロードした上で、 Ryuコントローラを起動します。
Release OpenFlow簡易ルータ(基本動作版) · ttsubo/simpleRouter · GitHub

  • Ryuコントローラの起動
$ cd simpleRouter-0.1/ryu-app/
$ ryu-manager openflowRouter.py 
loading app openflowRouter.py
loading app ryu.controller.ofp_handler
loading app ryu.controller.ofp_handler
creating context wsgi
instantiating app None of SimpleMonitor
creating context monitor
instantiating app openflowRouter.py of OpenflowRouter
instantiating app ryu.controller.ofp_handler of OFPHandler
(10256) wsgi starting up on http://0.0.0.0:8080/

4. OpenFlow簡易ルータのアドレス等の設定

OpenFlow簡易ルータの物理ポートにIPアドレスを付与して、デフォルトゲートウェイ設定を行います。通常のルータ機器であれば、CLIで実施する作業でしょうけど、ここでは、RESTful-IFにて、パラメータ設定を行っております。
注)ポート番号とIPアドレスの対応付けは、ここで指定することになります。よって、実際の物理ポートとケーブル結線が一致していないと通信できません。

  • eth1側の物理ポート設定
$ curl -s -X POST -d '{"interface": {"macaddress": "00:00:00:00:00:01", "ipaddress": "192.168.100.100", "port": "1", "opposite_ipaddress": "192.168.100.1"}}' http://localhost:8080/openflow/0000000000000001/interface | python -mjson.tool
{
    "id": "0000000000000001", 
    "interface": {
        "ipaddress": "192.168.100.100", 
        "macaddress": "00:00:00:00:00:01", 
        "opposite_ipaddress": "192.168.100.1", 
        "port": "1"
    }
}
  • eth2側の物理ポート設定
$ curl -s -X POST -d '{"interface": {"macaddress": "00:00:00:00:00:02", "ipaddress": "192.168.101.100", "port": "2", "opposite_ipaddress": "192.168.101.1"}}' http://localhost:8080/openflow/0000000000000001/interface | python -mjson.tool
{
    "id": "0000000000000001", 
    "interface": {
        "ipaddress": "192.168.101.100", 
        "macaddress": "00:00:00:00:00:02", 
        "opposite_ipaddress": "192.168.101.1", 
        "port": "2"
    }
}
$ curl -s -X POST -d '{"gateway": {"ipaddress": "192.168.100.1"}}' http://localhost:8080/openflow/0000000000000001/gateway | python -mjson.tool
{
    "gateway": {
        "ipaddress": "192.168.100.1"
    }, 
    "id": "0000000000000001"
}

以上で、環境準備は終了です。

◆実際、使ってみて ...

Linuxボックスで構築したOpenFlowスイッチを介して実際にインターネットにアクセスしてみました。
結論としては、PC版OpenvSwitchと同様に、普段のインターネット利用での操作感と、まったく遜色ありませんでした。通常の検索ポータルでのキーワード検索や、YouTubeなども、普通に利用できました。
さきほど配信されていたustreamでのオープン戦のライブ映像も、ストレスなく閲覧できておりました。
f:id:ttsubo:20140309161521j:plain

あと、回線速度計測の結果も、良好でしたね。
f:id:ttsubo:20140309173133j:plain

今回の技術興味のポイントとしては、実際の通信パケットが、OpenFlowスイッチを通過する度に、Linuxボックス側のCPUがFlowエントリに従って、宛先MACアドレス,送信元MACアドレスを書き換えた上で、パケット転送処理を実施している点であり、DNA940の搭載CPU「Intel® Celeron® M 600MHz」が、パケット転送のオーバヘッドとして、「どの程度の影響を与えるか?」という点です。
結論としては、通常のインターネット利用の体感に、ほとんど影響するものではありませんでした。

(DNA940は、GigabitEthernet搭載なので、このあたりの処理限界を確認できてはおりませんが...)

◆終わりに

今回は、LinuxボックスDNA940で構築したをOpenFlowスイッチを自宅ネットワークに導入して、インターネットが利用できるところまで確認できました。結果には、大変、満足しております。
あとは、時間がゆるせば、今後、最新OpenvSwitch機能を試しておきたいところですね。