OpenFlow簡易ルータの実践活用(3) 〜LinuxボックスでOpenFlowスイッチ構築編〜
最近、SDN業界では、ホワイトボックス版Linuxベースのオープンなネットワーク機器をデプロイする動きが活発ですよね。
ネットワークにダウンサイジングの波 - [1]スイッチの「オープン化」と「スケールアウト」が進む:ITpro
ネットワークにダウンサイジングの波 - [3]ホワイトボックスに賭ける、ACCESSとPica8の挑戦:ITpro
そこで、これまでの技術ブログ活動の集大成として、ホワイトボックス版OpenFlowスイッチによるOpenFlow簡易ルータを自宅ネットワークに導入してみるチャレンジに取り組んでみたいと思います。
◆OpenFlow簡易ルータのハードウェア構成
今後、OpenFlowスイッチの量産化を意識して、OpenFlowルータの物理構成としての要求条件について、優先順位の高いものから選定ポイントを挙げてみます。
(1)複数の物理NICが搭載していること(何は、さておきといった感じです)
(2)Debian系Linuxが動作すること(オープン版スイッチは、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ボックスは、こんな感じです。
ちなみに、汎用品が見当たらないケーブル類は、@wakadannacomさんの助け舟により幸運にもゲットすることができました。
- 16pin→DIN15pin変換VGAケーブル
- 電源変換ケーブル 4ピン(メス)->SATA15ピン(メス)
◆Linuxインストールの留意点
Debian系Linuxとして、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ボックスの導入形態は、こちらの構成になります。
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でのオープン戦のライブ映像も、ストレスなく閲覧できておりました。
あと、回線速度計測の結果も、良好でしたね。
今回の技術興味のポイントとしては、実際の通信パケットが、OpenFlowスイッチを通過する度に、Linuxボックス側のCPUがFlowエントリに従って、宛先MACアドレス,送信元MACアドレスを書き換えた上で、パケット転送処理を実施している点であり、DNA940の搭載CPU「Intel® Celeron® M 600MHz」が、パケット転送のオーバヘッドとして、「どの程度の影響を与えるか?」という点です。
結論としては、通常のインターネット利用の体感に、ほとんど影響するものではありませんでした。
(DNA940は、GigabitEthernet搭載なので、このあたりの処理限界を確認できてはおりませんが...)
◆終わりに
今回は、LinuxボックスDNA940で構築したをOpenFlowスイッチを自宅ネットワークに導入して、インターネットが利用できるところまで確認できました。結果には、大変、満足しております。
あとは、時間がゆるせば、今後、最新OpenvSwitch機能を試しておきたいところですね。