前回の記事から大きく期間が空いてしまいました。
自分の記事を読んでくれている方、楽しみにしてくれている方、ありがとうございます。そして、遅くなってごめんなさい。こういう記事を書くのに慣れていないため、筆が重くなってしまいました。(汗)
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で構成されるネットワーク構成図を簡単に描きました。
2.2. ODLでトポロジ確認
トポロジを見るには、SDNコントローラーのURLにアクセスします。
http://<SDNコントローラーのIPアドレス>:8181/index.html#/topology
トポロジ-画面には、openflow:1、openflow:2、・・・と表示されます。スイッチのsw1、sw2、・・・に対応しています。
mininetを起動するとOpenvSwitchによってブリッジされ、SDNコントローラー(OpenDaylight)とそれぞれのスイッチと接続されます。簡単な接続関係の図を書きました。
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(拒否)されるようになります。
3. 通信中のホストをブラウザ画面に表示
3.1. hosttrackerをインストール
OpenDaylight側が認識したホストを、ブラウザ画面に表示してみようと思います。別のfeatureをインストールします。
opendaylight-user@root>feature:install odl-l2switch-hosttracker
インストール完了後、OpenDaylightの画面にホストが表示されるようになります。
上記でインストールしたfeatureは、l2switchという名称のプロジェクトで開発されているものです。つまり、L2ネットワークの機能です。
[補足]featureは依存関係があり、依存先のfeatureを自動で取り込んでくれます。
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のアプリケーション開発について書きます。