現在位置: ホーム / ブログ / OpenDaylight SDN コントローラを RESTful API で制御してみよう !

OpenDaylight SDN コントローラを RESTful API で制御してみよう !

NECOMA Project の関谷です。最重量級です。

みなさん、SDN (Software Defined Networking) コントローラの OpenDaylight というものをご存知でしょうか ?
OpenDaylight は Linux Foundation が中心となって開発されているオープンソースの SDN コントローラ実装です。

主に Java 言語を用いて実装されており、SDN の代表的なプロトコルである OpenFlow をはじめとして、NetConfOVSDB といった標準的なコントロールプロトコルを使うことができる実装になっています。他の SDN  コントローラの多くが OpenFlow のみしか扱えない実装になっているのに比べ、様々なプロトコルをサポートすることで、より多くの SDN 機器を制御し、ネットワークを構築することが可能となっています。

今回は、この OpenDaylight を使って OpenFlow スイッチを制御する方法と、さらに外部プログラムから RESTful API を使って OpenDaylight を制御する方法を紹介したいと思います。NECOMA Project でも、この OpenDaylight を利用して SDN ネットワークを制御し、研究開発を行っていきます。でも私以外のメンバーは Ryu SDN Framework が好きみたいですが。。。

気をとりなおして OpenDaylight を紹介してみたいと思います。

まず、OpenDaylight をインストールする必要があるのですが、Java 言語で書かれているというくらいで、Java 言語が動くほとんどの OS で動作します。OpenDaylight の Web サイトに行くと、既にコンパイルされたバイナリが用意されています。まずとりあえず使ってみたい、という方はこのバイナリを利用するのが手軽です。以下のサイトからダウンロードできます。

https://www.opendaylight.org/software/downloads

バイナリは3種類にわかれていまして、Base エディション、Virtualization エディション、Service Provider エディションが用意されています。Base エディションが一番機能が少なく、Service Provider エディションが一番機能が多くなっています。OpenFlow スイッチを制御するだけであれば、Base エディションで十分です。

zip 形式で固められたファイルをダウンロードし、展開します。すると、ディレクトリ内に run.sh (WIndows の場合は run.bat を使用) とうファイルがあるので、これを実行するだけです。Java が実行できる環境が整っていれば、run.sh スクリプトを実行後しばらく待つと、

osgi> 

というコマンドプロンプトが返ってきます。これで OpenDaylight の起動が完了しました。コマンドラインからも制御はできるのですが、基本は Web ブラウザを使った制御となります。Web ブラウザを立ち上げ、http://127.0.0.1:8080/ にアクセスしてみてください。OpenDaylight と書かれた Web 画面が見えると思います。

初期ユーザネーム / パスワードは admin / admin なので、ログインしてみてください。ログインすると以下のような画面が表示され、もし同一ネットワーウセグメント内部に LLDP (IEEE802.1AB プロトコル) が有効になっている機器があれば、自動的に発見されて画面に表示されます。ネットワーク機器の Plug & Play みたいなもんですね。当然、この機能を利用するためには、スイッチと OpenDaylight を閉じたネットワークセグメントにつなぐことをお勧めします。外部からの接続性があるセグメントに設置するのは危険です。


OpenFlow スイッチ (Open vSwitch) が 2台発見されている例

OpenFlow スイッチが認識されたら、その OpenFlow スイッチに Flow ルールを入力してみましょう。手動で Flow ルールを入力するには、画面上部の "Flows" タグをクリックし、"Add Flow Entry" ボタンをクリックします。すると、以下のような画面が表示されますので、ここでルールを入力します。OpenFlow に詳しい人ならば、何を入力すればいいかは直感的にわかりますね。

手動で Flow ルールを入れる場合には、このようにして入力していきます。つまり、OpenDaylight の操作画面を利用して入れられるルールは静的なルール (Proactive Rule) だけです。パケットの状況に応じて動的なルールを設定 (Reactive Rule) したい場合には、制御するための OpenDaylight のプラグインを作成するか、もしくは外部プログラムを作成し、RESTful API を用いて OpenDaylight に対して Flow ルールを入力するかのどちらかの方法を選択することとなります。Java のプロジェクト管理に慣れている方であれば前者も可能なのですが、単に OpenFlow を使って動的に Flow ルールを制御したい、というだけであれば、後者の外部プログラムを利用するほうが簡単です。

そこで、今回の主題である (やっと辿り着きましたが。。。) RESTful API を使った、Flow ルールの制御を行ってみたいと思います。RESTful API は、様々な言語にライブラリやクラスが用意されているため、比較的容易に利用することができます。今回は最も簡単な方法として、curl というコマンドラインのプログラムを用いて、OpenDaylight を制御してみたいと思います。

例えば、OpenDaylight コントローラの IP アドレスが 192.168.160.1 であれば、以下のコマンドラインを用いて Flow ルールの一覧を取得することができます。

>  curl -u admin:admin -H 'Accept: application/json' 'http://192.168.160.1:8080/controller/nb/v2/flowprogrammer/default' | python -mjson.tool

最後の python は出力結果の整形のために利用しているだけです。まだ何も Flow ルールが設定されていなければ

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    17    0    17    0     0    738      0 --:--:-- --:--:-- --:--:--   772
{
    "flowConfig": []
}

という結果が返ってくるはずです。では、Flow ルールを設定してみましょう。TEST1 という名前で、スイッチのポート番号 2番から入ってきた IPv4 パケットはすべからく破棄する、というルールを 00:00:00:00:00:00:00:03 という ID を持った OpenFlow スイッチに設定する例です。

curl -u admin:admin -H 'Content-type: application/json' -X PUT -d '{"installInHw":"true", "name":"TEST1", "node" {"id":"00:00:00:00:00:00:00:03", "type":"OF"}, "ingressPort":"2", "etherType": "0x800", "priority":"1000","actions": ["DROP"]}' 'http://192.168.160.1:8080/controller/nb/v2/flowprogrammer/default/node/OF/00:00:00:00:00:00:00:03/staticFlow/TEST1'

Flow ルールの設定が成功すれば、一行

Success

という結果が返ってきます。ここで、先ほどの Flow ルールを確認する RESTful API をもう一度送信してみると、今度は

{
    "flowConfig": [
        {
            "actions": [
                "DROP"
            ],
            "etherType": "0x800",
            "ingressPort": "2",
            "installInHw": "true",
            "name": "TEST",
            "node": {
                "id": "00:00:00:00:00:00:00:04",
                "type": "OF"
            },
            "priority": "500"
        }
    ]
}

という結果が返ってくるはずです。いかがでしょう。非常に簡単な例ですが、RESTful API を用いて、動的に Flow ルールを OpenDaylight コントローラに設定し、OpenFlow スイッチに設定することができました。当然、他にも多くの API が用意されています。詳しくは OpenDaylight の公式 wiki である

https://wiki.opendaylight.org/view/OpenDaylight_Controller:REST_Reference_and_Authentication

を参照して下さい。また、Python からの API の使い方は、

http://fredhsu.wordpress.com/2013/06/14/adding-flows-in-opendaylight-using-python-and-rest-api/

といったページが参考になると思います。

今回は、コンパイル済みの OpenDaylight バイナリをダウンロードし、試してみました。これは OpenDaylight 1.0 (Hydrogen) と呼ばれるバージョンであり、最新の安定リリース版となっています。しかし、OpenDaylight の開発は非常に活発に行われており、その進化は日進月歩です。現在の開発版の最新コードを git を用いて取得すると、次期バージョンに向けた OpenDaylight 実装がダウンロードされます。このバージョンでは、RESTful API が少し変更され、今回紹介した例と少し異なっていますが、最新バージョンを追いかけたい人は、自身で情報を集め、工夫してみてください。


タグ: