VMwarePlayer+Ubuntu/KVM/OVSでOpenFlowテスト環境をつくる(3)
はじめに
前々回、前回で KVM Host 上に domain (KVM Guest) を複数たてて、OVS 経由で接続する、というところまでやりました。
今回は OVS を OpenFlow Controller (Trema) でコントロールしてみます。すぐできます。
Controller のインストール
この辺は参考ドキュメントいろいろあるのでそちらを参照。
いまなら Trema 本もでてるしね!
クラウド時代のネットワーク技術 OpenFlow実践入門 (Software Design plus)
- 作者: 高宮安仁,鈴木一哉
- 出版社/メーカー: 技術評論社
- 発売日: 2013/01/09
- メディア: 単行本(ソフトカバー)
- 購入: 7人 クリック: 51回
- この商品を含むブログ (10件) を見る
ほぼ同時期にもう1冊 OpenFlow の本が出てるけど、こちらも Trema で説明していました。(まだ中身をちゃんと読んでいない…)
- 作者: 平野浩太郎,藤田将,澤友規
- 出版社/メーカー: コロナ社
- 発売日: 2012/12/10
- メディア: 単行本
- 購入: 2人 クリック: 11回
- この商品を含むブログ (4件) を見る
インストールは、git clone
して build.rb
してもいいし、ruby gem でインストールしてしまってもいいし。ruby gem でインストールしてしまうのがお手軽かな…。
下図の通り、コントローラは今回別なホストにたてました。
最初は KVM Host 上でやろうとしたんだけど上手く動かなかったんだよね…(ちゃんとトラブルシュートしていない)。というのと、まあなんでもかんでもひとつにするというのも使いにくいかな、というのがあって。Controller とプログラム開発環境というので別にホストをたてています。……まあ正直に言えばそんなに深い意図はないです。
動作確認(LearningSwitch)
まずはサンプルアプリの中からお手軽なところで LearningSwitch をためしてみます。
KVM ホスト側の準備
OVSの状態確認。dump-flows
すると actions=NORMAL
でルールが入っています。
stereocat@oftest01:~$ sudo ovs-vsctl show 73ffb051-5d54-4226-bebf-d180b32debda Bridge "br0" Port "eth1" Interface "eth1" Port "br0" Interface "br0" type: internal ovs_version: "1.4.0+build0" stereocat@oftest01:~$ stereocat@oftest01:~$ sudo ovs-ofctl dump-flows br0 NXST_FLOW reply (xid=0x4): cookie=0x0, duration=8.927s, table=0, n_packets=0, n_bytes=0, priority=0 actions=NORMAL stereocat@oftest01:~$
KVM Guest の起動
stereocat@oftest01:~$ sudo virsh list --all Id Name State ---------------------------------- - ofvm01 shut off - ofvm02 shut off - ofvm03 shut off - ofvm04 shut off stereocat@oftest01:~$ stereocat@oftest01:~$ sudo virsh start ofvm01 Domain ofvm01 started stereocat@oftest01:~$ sudo virsh start ofvm02 Domain ofvm02 started stereocat@oftest01:~$ sudo virsh list --all Id Name State ---------------------------------- 1 ofvm01 running 2 ofvm02 running - ofvm03 shut off - ofvm04 shut off stereocat@oftest01:~$
OVS をコントローラに接続。
stereocat@oftest01:~$ sudo ovs-vsctl set-controller br0 tcp:192.168.124.119 stereocat@oftest01:~$ sudo ovs-vsctl show 73ffb051-5d54-4226-bebf-d180b32debda Bridge "br0" Controller "tcp:192.168.124.119" Port "eth1" Interface "eth1" Port "br0" Interface "br0" type: internal Port "vnet1" Interface "vnet1" Port "vnet0" Interface "vnet0" ovs_version: "1.4.0+build0" stereocat@oftest01:~$
Bridge に Controller
が設定されます。まだコントローラが起動していないので、この状態で dump-flows
すると先ほどはいっていた actions=NORMAL
なルールはなくなっています(通信できない状態になります)。
stereocat@oftest01:~$ sudo ovs-ofctl dump-flows br0 NXST_FLOW reply (xid=0x4): stereocat@oftest01:~$
Controller の起動
コントローラの起動。デフォルトでは tcp/6633 です。ここではソースからビルドした物を使っていますが、ruby gem でインストールした場合 /var/lib/gems/1.8/gems/trema-0.2.5/
とかの下に src/examples
があります。
stereocat@oftest02:~/trema$ ./trema run src/examples/learning_switch/learning-switch.rb stereocat@oftest02:~$ sudo netstat -an --tcp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:6633 0.0.0.0:* LISTEN tcp 0 0 192.168.124.126:32941 192.168.124.127:22 ESTABLISHED tcp 0 52 192.168.124.126:22 192.168.124.1:49308 ESTABLISHED tcp6 0 0 :::22 :::* LISTEN stereocat@oftest02:~$
KVM Guest 間で icmp とか撃って通信できていれば以下のようにフローテーブルが表示されます。
stereocat@oftest01:~$ sudo ovs-ofctl dump-flows br0 NXST_FLOW reply (xid=0x4): cookie=0x1, duration=20.852s, table=0, n_packets=20, n_bytes=1960, priority=65535,icmp,in_port=2,vlan_tci=0x0000,dl_src=52:54:00:00:00:01,dl_dst=52:54:00:00:00:02,nw_src=192.168.72.126,nw_dst=192.168.72.125,nw_tos=0,icmp_type=0,icmp_code=0 actions=output:3 cookie=0x3, duration=20.838s, table=0, n_packets=20, n_bytes=1960, priority=65535,icmp,in_port=3,vlan_tci=0x0000,dl_src=52:54:00:00:00:02,dl_dst=52:54:00:00:00:01,nw_src=192.168.72.125,nw_dst=192.168.72.126,nw_tos=0,icmp_type=0,icmp_code=0 actions=output:2 cookie=0x4, duration=19.849s, table=0, n_packets=19, n_bytes=1862, priority=65535,icmp,in_port=3,vlan_tci=0x0000,dl_src=52:54:00:00:00:02,dl_dst=52:54:00:00:00:01,nw_src=192.168.72.125,nw_dst=192.168.72.126,nw_tos=0,icmp_type=8,icmp_code=0 actions=output:2 cookie=0x2, duration=20.844s, table=0, n_packets=20, n_bytes=1960, priority=65535,icmp,in_port=2,vlan_tci=0x0000,dl_src=52:54:00:00:00:01,dl_dst=52:54:00:00:00:02,nw_src=192.168.72.126,nw_dst=192.168.72.125,nw_tos=0,icmp_type=8,icmp_code=0 actions=output:3 stereocat@oftest01:~$
OVSのデータパスID(DPID)とかはコンフィグ(データベース)を表示すると確認できます。
stereocat@oftest01:~$ sudo ovs-vsctl list Bridge _uuid : 49d54a8b-46db-4ed3-9036-af11309d9866 controller : [366b3642-0c3f-4e64-8f1e-b66ea3705ef2] datapath_id : "0000000c297fff94" datapath_type : "" external_ids : {} fail_mode : [] flood_vlans : [] mirrors : [] name : "br0" netflow : [] other_config : {} ports : [9b067d9f-3ff2-49a0-b75a-a68933f631fc, a0d3fa5f-3217-4a35-b078-923c32599da5, ba147763-b4a7-4c86-8527-c902cb69bb0b, d226aafe-f9f8-4b6b-bf5b-ba9e6f9ac9da] sflow : [] status : {} stp_enable : false stereocat@oftest01:~$
OVS のデータ構造については Open vSwitch Manual (PDF) を参照。
Tremasharkのインストールと実行
ついでなのでデバッグ用の環境も用意してしまおう。Trema本とか以前の記事を参照。
まえ使ってみたときはヘッダがないとか出てたりしてたみたいだけど、今回やってみたら特に何も問題は起きなかった。
おわりに
Trema のインストール等については今や参考資料はたくさんあるのであっさりと。ここまでできれば、あとは実際にコントローラをつくっていろいろ試してみる、というところになります。その辺はまたいずれ書ければ…いいなあ。