VMwarePlayer+Ubuntu/KVM/OVSでOpenFlowテスト環境をつくる(3)

はじめに

前々回前回KVM Host 上に domain (KVM Guest) を複数たてて、OVS 経由で接続する、というところまでやりました。
今回は OVS を OpenFlow Controller (Trema) でコントロールしてみます。すぐできます。

Controller のインストール

この辺は参考ドキュメントいろいろあるのでそちらを参照。

いまなら Trema 本もでてるしね!

クラウド時代のネットワーク技術 OpenFlow実践入門 (Software Design plus)

クラウド時代のネットワーク技術 OpenFlow実践入門 (Software Design plus)

ほぼ同時期にもう1冊 OpenFlow の本が出てるけど、こちらも Trema で説明していました。(まだ中身をちゃんと読んでいない…)

OpenFlowネットワーク入門

OpenFlowネットワーク入門

インストールは、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 のインストール等については今や参考資料はたくさんあるのであっさりと。ここまでできれば、あとは実際にコントローラをつくっていろいろ試してみる、というところになります。その辺はまたいずれ書ければ…いいなあ。