オープンソースの「OpenDaylight」を使ってネットワークを可視化してみる。

前回の記事から大きく期間が空いてしまいました。

自分の記事を読んでくれている方、楽しみにしてくれている方、ありがとうございます。そして、遅くなってごめんなさい。こういう記事を書くのに慣れていないため、筆が重くなってしまいました。(汗)

OpenDaylightのアプリケーション開発は、前回の記事で予告した通り、第3弾に投稿します。

1.はじめに


1.1. 実施すること

今回の記事では、ネットワークの可視化に挑戦します。本記事の構成は以下です。

・スイッチをブラウザ画面に表示
・通信中のホストをブラウザ画面に表示
・おまけ
・さいごに

2. スイッチをブラウザ画面に表示


これから使用するネットワークをブラウザ画面に表示してみます。記事内ではトポロジーという言葉を使用していますが、詳しい説明は省略します。気になった方はWikiページで確認してみてください。(URL

トポロジー以外にも、この章は色々と説明が長くなってしまうことが予想されるので、ある程度省略し、概要だけに書いています。ご了承ください。

※必要な説明は別記事に起こそうと思います。
※個別の環境差分は考慮できておりません。

2.1. mininet起動

前回の記事でインストールしたmininetを起動し、スイッチとホストを仮想的に生成します。topo-3sw-3host.pyファイルはこちらです。(当サイトからダウンロード)

ダウンロードしたファイルは、mininetのホームディレクトリ直下のcustomの中に入れてください。格納場所はどこでも大丈夫ですが、読み取り権限などにご注意下さい。以下のコマンドをUbuntu上で実行するとmininetを起動できます。

$ mn --controller=remote,ip=<SDNコントローラーのIPアドレス> --custom <pyファイル> --topo mytopo

mininetで構成されるネットワーク構成図を簡単に描きました。

ODL1

2.2. ODLでトポロジ確認

トポロジを見るには、SDNコントローラーのURLにアクセスします。

http://<SDNコントローラーのIPアドレス>:8181/index.html#/topology

トポロジ-画面には、openflow:1、openflow:2、・・・と表示されます。スイッチのsw1、sw2、・・・に対応しています。

ODL2

mininetを起動するとOpenvSwitchによってブリッジされ、SDNコントローラー(OpenDaylight)とそれぞれのスイッチと接続されます。簡単な接続関係の図を書きました。

ODL3

2.3. VTNを使ってテナント作成

VTNについても、前回の記事でインストールしていますのでそのまま利用します。VTNでは仮想テナントという概念で、ネットワークを制御しています。詳しい内容はOpenDaylightのWikiページで確認できます。(URL

それでは、仮想テナントを作成(SDNコントローラーに登録)します。以下の6つのcurlコマンドは、SDNコントローラーをインストールしたサーバー上で実行しています。異なるサーバーから実行するには、localhostの部分をSDNコントローラーのIPアドレスに変更して下さい。

i) 仮想テナント作成

$ curl --user "admin":"admin" -H "Content-type: application/json" -X POST \
http://localhost:8181/restconf/operations/vtn:update-vtn \
-d '{"input":{"tenant-name":"vtn1"}}'

ii) 仮想テナント上に仮想ブリッジを作成

$ curl --user "admin":"admin" -H "Content-type: application/json" -X POST \
http://localhost:8181/restconf/operations/vtn-vbridge:update-vbridge \
-d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1"}}'

iii) 仮想ブリッジにインターフェース「if1」を作成

$ curl --user "admin":"admin" -H "Content-type: application/json" -X POST \
http://localhost:8181/restconf/operations/vtn-vinterface:update-vinterface \
-d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1"}}'

iv) 仮想ブリッジにインターフェース「if2」を作成

$ curl --user "admin":"admin" -H "Content-type: application/json" -X POST \
http://localhost:8181/restconf/operations/vtn-vinterface:update-vinterface \
-d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if2"}}'

 v) インターフェース「if1」にポート「s2-eth1」をマッピング

$ curl --user "admin":"admin" -H "Content-type: application/json" -X POST \
http://localhost:8181/restconf/operations/vtn-port-map:set-port-map \
-d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if1", "node":"openflow:2", "port-name":"s2-eth1"}}'

vi) インターフェース「if2」にポート「s3-eth1」をマッピング

$ curl --user "admin":"admin" -H "Content-type: application/json" -X POST \
http://localhost:8181/restconf/operations/vtn-port-map:set-port-map \
-d '{"input":{"tenant-name":"vtn1", "bridge-name":"vbr1", "interface-name":"if2", "node":"openflow:3", "port-name":"s3-eth1"}}'

上記のコマンドを全て実行すると、ホスト2とホスト3の間でpingが通るようになります。実際にpingを打ち込んでみます。

mininet> h2 ping h3

作成した仮想テナントを、作成したトポロジに重ねると、以下のイメージになります。
[補足]idle状態でのタイムアウト値は300秒に設定されているため、無通信状態が5分続けば、再びpingはdrop(拒否)されるようになります。

ODL4

3. 通信中のホストをブラウザ画面に表示


3.1. hosttrackerをインストール

OpenDaylight側が認識したホストを、ブラウザ画面に表示してみようと思います。別のfeatureをインストールします。

opendaylight-user@root>feature:install odl-l2switch-hosttracker

インストール完了後、OpenDaylightの画面にホストが表示されるようになります。
上記でインストールしたfeatureは、l2switchという名称のプロジェクトで開発されているものです。つまり、L2ネットワークの機能です。
[補足]featureは依存関係があり、依存先のfeatureを自動で取り込んでくれます。

ODL5.png

4. おまけ


4.1. OpenvSwitchのコマンドでフローを確認

OpenvSwitchで提供されているコマンドでフローを参照できます。
VTNテナントを作成する前後で、どのようなフローが登録されたのか確認してみます。

■VTNテナント作成前

sw2(openflow:2)のフロー参照

$ ovs-ofctl dump-flows -OOpenFlow13 s2
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x7f57ffffffffffff, duration=99.354s, table=0, n_packets=1907, n_bytes=162858, send_flow_rem priority=0 actions=CONTROLLER:65535

sw3(openflow:3)のフロー参照

$ ovs-ofctl dump-flows -OOpenFlow13 s3
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x7f57ffffffffffff, duration=109.373s, table=0, n_packets=1911, n_bytes=163198, send_flow_rem priority=0 actions=CONTROLLER:65535

■VTNテナント作成後

実はVTNテナント作成直後では、ホスト間のデータ通信を許可するためのフローは登録されていません。では、いつ登録されるのか?それはデータ通信が発生したタイミングです。
上記のovs-ofctlのコマンド結果、フローのマッチ条件とアクションを読み解くと、以下のような感じです。

  • 受信した全てのパケットは(無条件に)、コントローラーに通知する。
  • なんらかの要因でこのフローが削除された場合は、コントローラーに通知する。

ここから、「各スイッチで受信したパケットはコントローラーで制御をしたい」と、「通信パケットの許可・拒否などの制御はOpenDaylight側(仮想テナント(VTN))で制御したい。」という意図が読み取れます。

■ping実行後 

ホスト2からホスト3に向けてpingを打ち込んだあと、もう一度ovs-ofctlで確認するとフローが登録されていることが分かります。
[補足]MACアドレスは可変です。mininetを起動するごとに変わります。

$ ovs-ofctl dump-flows -OOpenFlow13 s2
OFPST_FLOW reply (OF1.3) (xid=0x2):
cookie=0x7f56000000000001, duration=8.332s, table=0, n_packets=2, n_bytes=140, send_flow_rem priority=10,in_port=3,vlan_tci=0x0000/0x1fff,dl_src=fa:74:37:96:70:a7,dl_dst=02:d7:20:34:14:57 actions=output:1
cookie=0x7f56000000000002, duration=8.328s, table=0, n_packets=2, n_bytes=140, idle_timeout=300, send_flow_rem priority=10,in_port=1,vlan_tci=0x0000/0x1fff,dl_src=02:d7:20:34:14:57,dl_dst=fa:74:37:96:70:a7 actions=output:3
cookie=0x7f57ffffffffffff, duration=246.875s, table=0, n_packets=1967, n_bytes=167928, send_flow_rem priority=0 actions=CONTROLLER:65535

5. さいごに


以上でネットワークの可視化は終わりです。ここまで読んで頂きありがとうございました。

ネットワークの可視化と言えば、トラフィックフローの可視化もあります。Interop 2017では、色々な視点でネットワークを可視化するデモが展示されていました。非常に興味深かったです。

個人的にOpenDaylightを使ってみて感じたのは、カスタマイズ無しだと痒いところに手が届かないケースが多いという点です。「OpenDaylightをカスタマイズしてみたい」、「ユーザビリティーを追求してみたい」、という気持ちでOpenDaylightのアプリケーション開発に挑戦してみました。

次回はOpenDaylightのアプリケーション開発について書きます。

 

うま について

新しいことが大好き。考えるよりまずはやってみろ精神の持ち主。