こんな夜中にOpenFlowでネットワークをプログラミング!

第4回いよいよOpenFlowの動作環境を構築!

はじめに

前回はNTTデータのR&D部門で検討している次世代クラウドの概要を説明しました。OpenFlowによりサーバとネットワークが密に融合する世界を体感していただけたのではと思います。

今後の連載では少し趣向を変えて、実際にOpenFlowでネットワークを制御する方法を説明していく予定です。今回は、まずオープンソースソフトウェア(OSS)を用いてOpenFlowが動作する環境を構築する方法を説明します。

OpenFlowの動作環境を構築する

では、OSSを用いてOpenFlowを動作させる方法について説明します。図1はOpenFlowを動作させるための基本構成です。OpenFlowの世界ではOpenFlowコントローラからOpenFlowスイッチに制御ルールを書き込むことで、OpenFlowスイッチにさまざまな動作をさせることができます。今回は、OpenFlowコントローラにレイヤ2モジュールをロードさせることで、OpenFlowスイッチにレイヤ2スイッチと同様の動きをさせます。

図1 OpenFlowの基本構成
図1 OpenFlowの基本構成

本来はOpenFlow コントローラとOpenFlowスイッチは別筺体にインストールするのが基本ですが、今回は用意するサーバ装置数を減らすため、同一筺体にインストールします。

OpenFlowコントローラは「NOX」を、OpenFlowスイッチは「openflow」というOSSを利用します(どちらも後述⁠⁠。なお、本稿ではopenflowとOpenFlowは区別が難しいため「openflow」「OpenFlowSwitch」と呼ぶことにします。両者ともOSSで公開されており、カスタマイズなども自由です。

今回動作させるOpenFlowプロトコルのバージョンは1.0になります。ちなみにバージョン1.1が実装されたOSSは筆者が知るかぎり、本稿執筆時(2011年6月10日)では存在しません。

事前準備

今回はマシンを3台利用してOpenFlowの動作環境を構築します。サーバ3にはNICが2つ搭載されている前提で話を進めます。また、1つのNICには1つの物理ポートしか存在しないことを前提とします。

ソースコードのダウンロードにgitコマンドを用いるため、インターネットに接続できる環境が必要になります。また、⁠sudo」⁠apt-get」コマンドはOSインストール時に自動でインストールされることを想定しています。

マシンを3台用意するのが難しい方はVMwarePlayerを用いて同様の構成を1台のマシン上に構築することも可能です。VMware Playerを利用する方は、図1のサーバ1からサーバ3のeth0までの通信路とサーバ2からサーバ3のeth1までの通信路をVLAN(Virtual LAN)で分離してください。また、サーバ3にNICが1つしか搭載されていない場合もVLANを用いることで図1と同様の構成を実現できます。

OSのインストール

サーバ1、サーバ2、サーバ3にOSをインストールします。OSはUbuntu10.04 Desktop(32ビット版&日本語版)を利用します。VMwarePlayer を利用する方はDesktop 版ではなく、Alternate版を用いて軽量インストールを行う方法もあります。各サーバにOSをインストールした後は以降に示す設定を行ってください。

ユーザアカウントの設定

まずは作業用のユーザアカウントを1つ作成します。Ubuntuでは特別な設定をしないかぎりrootでログインできないため、root権限が必要なコマンドを実行する場合はsudoコマンドを用いることになります。

次のコマンドを実行して「hogehoge」というユーザを作成してください。

$ sudo adduser hogehoge
$ sudo usermod -G admin hogehoge

本稿ではとくに明記しないかぎり、ユーザ「hogehoge」で作業を行います。

IPv6の無効化

OpenFlowバージョン1.0はIPv6を処理できないため、OSの設定を変更してIPv6を無効にします。sysctl.confファイルを開き、ファイルの最後に2行追加してください。

sysctl.confファイルを開く
$ sudo nano /etc/sysctl.conf
sysctl.confに追記する2行
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1

最後にsysctl.confファイルへの変更を有効にするため、次のコマンドを実行します。

$ sudo sysctl -p

インターネット接続の設定

ソースコードやパッケージのインストールを行うため、サーバ3をインターネットに接続できるように設定してください。

プロキシサーバが存在するような特殊な環境の場合は、apt-getコマンドに特別な設定が必要になります。

OpenFlowSwitchのインストール

サーバ3にOpenFlowSwitch をインストールします。まずは次のコマンドを実行しコンパイルに必要なパッケージをインストールしてください。

$ cd /home/hogehoge/
$ sudo apt-get install git-core automake m4 pkg-config libtool

次に、OpenFlowSwitchのソースコードを取得します。Stanford Gitリポジトリから必要なソフトウェアを取得してください。

$ git clone git://openflow.org/openflow.git

gitに失敗する場合はプロキシサーバの存在を疑うとよいでしょう。続いてコンパイルを行います。コンパイルは先ほどリポジトリからダウンロードしたファイルに含まれるboot.shを利用します。

次の手順に沿ってコンパイルとインストールを行ってください。

$ cd openflow
$ ./boot.sh
$ ./configure
$ make
$ sudo make install

以上でOpenFlowSwitchのインストールは完了です。

NOXのインストール

続いてサーバ3 にNOX をインストールします。次のコマンドを実行しNOXのコンパイルに必要なパッケージをインストールしてください。

$ cd /home/hogehoge/
$ sudo apt-get install autoconf automake g++ libtool swig make git-core libboost-dev libboost-test-dev libboost-filesystem-dev libssl-dev libpcap-dev python-twisted python-simplejson python-dev

パッケージインストール後は、米スタンフォード大学が用意したパッケージ依存性確認のファイル「nox-dependencies」を利用して、インストールに必要なパッケージに漏れがないか確認します。

$ cd /etc/apt/sources.list.d/
$ sudo wget http://openflowswitch.org/downloads/debian/nox.list
$ sudo apt-get update
$ sudo apt-get install nox-dependencies

次に、リポジトリからNOXのソースコードを取得します。

$ cd /home/hogehoge/
$ git clone git://noxrepo.org/nox

先ほどと同様ですが、gitに失敗する場合はプロキシサーバの存在を疑ってください。NOXのコンパイルはOpenFlowSwitchと同様にboot.shを利用することで簡単に行えます。

$ cd nox
$ ./boot.sh
$ mkdir build/
$ cd build/
$ ../configure
$ sudo make -j 5

今回はWebで公開されているNOXのインストールマニュアルに沿って、makeコマンドの引数に「-j 5」を付加して実行していますが、環境によっては単に「sudo make」とするほうが早くコンパイルが終了する場合があります。また、サーバのスペックによってはmakeに10~20分程度必要な場合もあるようです。

以上でNOXのインストールが完了です。

IPアドレスの設定とケーブル接続

各サーバにIPアドレスを設定します。

  • サーバ1:192.168.0.1/24
  • サーバ2:192.168.0.2/24
  • サーバ3:IPアドレスの設定なし

すでに必要なインストールは完了しているので、これ以降、サーバ3からインターネットに接続できる必要はありません。

サーバ3のeth0とeth1は「IPアドレスの設定なし」に設定する必要があります。IPアドレスを設定しないことでeth0やeth1は単にパケットが通過するだけのケーブルのような存在になります。

NICを2つ持つサーバ3のeth0とeth1を両方ともIP アドレスの設定なしにすると、/etc/network/interfaceファイルは次のようになります。

/etc/network/interfaceファイルの内容
auto lo
iface lo inet loopback

もちろん、サーバ3が3つのNICを持つ場合は3つめのNICにIPアドレスを割り当てても問題はありません。最後に図1に示したとおり各サーバをLANケーブルで接続してください。これですべての環境構築作業が完了しました。

OpenFlowを動かしてみる

それでは、実際にOpenFlowを動かしてみましょう。OpenFlowの世界ではOpenFlowスイッチがクライアントで、OpenFlowコントローラがサーバになります。よってOpenFlowSwitchを起動する前にNOXを起動させておく必要があります。

NOXの起動方法

NOXは起動時にロードするモジュールにより動作が変わります。たとえば、OpenFlowスイッチにレイヤ2 スイッチと同じ動作をさせる「pyswitch」モジュールをNOX起動時にロードすれば、OpenFlowスイッチはレイヤ2スイッチになります。同様にOpenFlowスイッチにレイヤ3スイッチと同じ動きをさせるモジュールをロードすれば、OpenFlowスイッチはレイヤ3スイッチになります。

まったく独自のモジュールを用意すれば、OpenFlowスイッチは、どこにも販売されていない独自の動作をするスイッチになります。今回はOpenFlowスイッチにレイヤ2スイッチと同様の動作をさせることにします。

次のコマンドを実行してNOXを起動してください。

$ cd ~/nox/build/src
$ ./nox_core -v -i ptcp:6633 pyswitch

ここではpyswitchを引数にとることで、pyswitchモジュールをロードしています。⁠-v」はコンソールに詳細情報を表示するという意味で、⁠-i ptcp:6633」は6633番ポートでOpenFlowスイッチからの接続を受け付けるという意味になります。

OpenFlowSwitchの起動方法

続いてOpenFlowSwitchを起動します。先ほどまで利用していたコンソールはNOXが起動している状態になっているため、別ウィンドウで新規にコンソールを作成してください。

OpenFlowSwitchを動かすためには、2つのコマンド「ofdatapath」「ofprotocol」を利用します。それぞれのコマンドを実行するとofdatapathプロセスとofprotocolプロセスが生成されます図2⁠。ofdatapathコマンドは、OpenFlowネットワークで利用するNICを明示的に指定するコマンドで、ofprotocolコマンドはOpenFlowスイッチとOpenFlowコントローラをOpenFlowプロトコルで接続するコマンドになります。

図2 OpenFlow関連のプロセス一覧
図2 OpenFlow関連のプロセス一覧

なお、OpenFlowSwitchのコマンドにはインストール時にパスが通るように設定されるため、以後の作業ではとくにカレントディレクトリを意識する必要はありません。

OpenFlowネットワークで利用するNICの指定

ここでは、どのNICをOpenFlowネットワークに参加させるかを指定します。次のコマンドでeth0とeth1をOpenFlowネットワークに参加させます。

$ sudo ofdatapath punix:/var/run/dp0.sock -i eth0,eth1 -D

punixで指定しているdp0.sockの部分はofdatapathプロセスとofprotocolプロセスがプロセス間通信を行うために必要なファイル名です。-Dはデーモンとして実行することを示します。

NOXへの接続

それでは次にOpenFlowSwitchからNOXへの接続を行いましょう。NOXとの接続は次のコマンドで行います。

$ sudo ofprotocol unix:/var/run/dp0.sock tcp:127.0.0.1

unixの部分はofprotocolプロセスとofdatapathプロセスがプロセス間通信を行うために利用するファイル名になります。tcpはOpenFlowSwitchの接続先を示します。今回はOpenFlowSwitchとNOXが同一筺体にインストールされているため「127.0.0.1」と指定します。このコマンドを実行後、コンソール上に次のように表示されれば正常に接続完了です。

|INFO|tcp:127.0.0.1: connected

OpenFlowSwitchやNOXを停止する

念のためOpenFlowSwitchやNOXの停止方法も説明しておきます。

①NOXの停止

NOXが動作しているコンソール上で[Ctrl][c]を行い、プロセスを停止します。

②ofprotocolプロセスの停止

ofprotocol が動作しているコンソール上で[Ctrl][c]を行い、プロセスを停止します。

③ofdatapathプロセスの停止

プロセスIDを確認して該当プロセスをkillします図3⁠。

停止させる順番は、①NOX、②ofprotocolプロセス、③ofdatapathプロセスの順をお勧めします。

図3 ofdatapathプロセスの停止
図3 ofdatapathプロセスの停止

OpenFlowネットワーク上で通信する

それでは実際に、OpenFlowネットワーク上で通信を行ってみましょう。ここでは図1のサーバ1からサーバ2へpingを飛ばす単純な通信を行います。NOXはpyswitchコンポーネントを読み込んで起動しているため、OpenFlowスイッチはL2スイッチとして動作します。よってpingパケットは問題なくサーバ1からサーバ2に届くはずです。それでは、サーバ1で次のコマンドを実行してみてください。

$ ping 192.168.0.2

pingに対してサーバ2から応答があれば成功です。

まとめ

今回はOSSを用いて実際にOpenFlowが動作する環境を構築しました。pingを飛ばすだけの単純な通信でしたが、OpenFlowコントローラがロードするモジュールによりOpenFlow スイッチの動作が決定されることを実感できたのではないでしょうか。

次回はOpenFlowコントローラがロードするモジュールの作成方法を説明する予定です。

おすすめ記事

記事・ニュース一覧