[[labs.beatcraft.com]]
[[OpenFlow]]

#contents

* OpenFlow/Open vSwitch_x86 [#e0be3733]
PC(x86マシン)を2台使用し、それぞれをOpenFlow ControllerとOpenFlow Switchに ~
設定してOpenFlowTutorial 1,2の動作確認手順について記載します。~
~
OpenFlow ControllerとOpenFlow Switchとして使用するPCは共に ~
mininetの環境を設定している前提で記載をします。 ~
使用するOSはUbuntu 12.04(32bit版)です。~

mininetの設定については[[こちら>http://labs.beatcraft.com/ja/index.php?OpenFlow%2Fmininet]]を参照してください。~

ホストに使用するマシンはLinux OSをインストールしたマシンを使用します。~
本稿ではUbuntu 12.04(32bit版)をインストールしたx86 PCとbc10を使用しています。~

インストール完了後、各機器のIPアドレスは下図のような固定設定にしています。~
動作確認環境の概要は以下の図のとおりです。~

#ref(SwithEnv.png,,60%);~
#ref(SwithEnv.png,,80%);~

* OpenFlow Switchの起動 [#u65ef6fc]
PC(Switch)上でOpen vSwitchを使用しOpenFlow Switchを設定、起動します。~

PC起動後ovsdb-server,ovs-vswitchdが起動しているか確認します。~
起動していない場合は、/etc/init.d/openvswitch-swtich startを実行します。~

 $ sudo /etc/init.d/openvswitch-switch start

以下はopenvswitch-switch start実行後の「ps axu | grep ovs」の結果です。~

 $ ps axu | grep ovs
 root      1360  0.0  0.0   4780   416 ?        S<   16:12   0:03 ovsdb-server: monitoring pid 1361 (healthy)                                                                                                                         
 root      1361  0.0  0.1   4904  1652 ?        S<s  16:12   0:01 ovsdb-server /etc/openvswitch/conf.db -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO --remote=punix:/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,manager_options --private-key=db:SSL,private_key --certificate=db:SSL,certificate --bootstrap-ca-cert=db:SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach --monitor
 root      1388  0.0  0.0   5464   692 ?        S<   16:12   0:03 ovs-vswitchd: monitoring pid 1389 (healthy)                                                                                                                        
 root      1389  0.0  0.1   5468  1692 ?        S<s  16:12   0:01 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vANY:CONSOLE:EMER -vANY:SYSLOG:ERR -vANY:FILE:INFO --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor
 beat      3713  0.0  0.0   5364   840 pts/3    S+   17:14   0:00 grep --color=auto ovs

必要のないブリッジデバイスが存在していないか確認をします。~
~
注:前回起動時にOpen vSwitchのブリッジデバイスを作成し削除せずに終了させた場合、~
そのブリッジデバイスは作成されたままになります。 ~

 # ovs-vsctl show

もし必要のないブリッジデバイスが存在している場合はそのブリッジデバイスを削除します。 ~
ここではブリッジデバイスはbr0とします。 ~

 # ovs-vsctl del-br br0

新規にブリッジデバイス(br0)を作成し、eth2,eth3をbr0に含めます。~

 # ovs-vsctl add-br br0
 # ovs-vsctl add-port br0 eth2
 # ovs-vsctl add-port br0 eth3

各デバイスを起動します。~

 # ifconfig eth2 up
 # ifconfig eth3 up
 # ifconfig br0 up

ブリッジデバイスにOpenFlow Controllerの設定を追加します。~
ここではコントローラはtcp接続でアドレスは192.168.1.10、ポートは6633、 ~
スイッチはtcp 6634ポートを設定します。 ~

 # ovs-vsctl set-controller br0 tcp:192.168.1.10:6633 ptcp:6634

fail-modeをsecureに設定し、無設定時のhost間の通信を遮断します。 ~

 # ovs-vsctl set-fail-mode br0 secure

上記までの設定が以下のように反映されているか確認します。~

 # ovs-vsctl show
 b8c00762-8c74-455b-9c96-3a9e9c8cf275
     Bridge "br0"
         Controller "ptcp:6634"
         Controller "tcp:192.168.1.10:6633"
         fail_mode: secure
         Port "eth2"
             Interface "eth2"
         Port "eth3"
             Interface "eth3"
         Port "br0"
             Interface "br0"
                 type: internal
     ovs_version: "1.4.0+build0"


これでSwitchの設定は完了です。

* OpenFlow Switchの動作確認 [#qd9b7778]
OpenFlow Switchの動作確認を行います。~

** OpenFlow Tutorial 1 [#n9f035d9]
[[OpenFlow/OpenFlow Turorial 1]]で行った動作確認と同様の手順でOpenFlow Switchの動作確認を行います。~
[[OpenFlow/OpenFlow Turorial 1>http://labs.beatcraft.com/ja/index.php?OpenFlow%2FOpenFlow%20Tutorial%201]]で行った動作確認と同様の手順でOpenFlow Switchの動作確認を行います。~
~
PC(Controller)からdpctlコマンドでスイッチの状態を確認します。~
port1,2に各ethが割り当てられていることが解ります。~

 $ dpctl show tcp:192.168.1.1:6634
 features_reply (xid=0x23ede000): ver:0x1, dpid:d0b6a5b34
 n_tables:255, n_buffers:256
 features: capabilities:0xc7, actions:0xfff
 1(eth3): addr:00:0d:0b:6a:5b:34, config: 0, state:0x1
      current:    10MB-HD AUTO_NEG
      advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-FD COPPER AUTO_NEG AUTO_PAUSE
      supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD 1GB-HD 1GB-FD COPPER AUTO_NEG
 2(eth2): addr:00:1d:73:2e:91:94, config: 0, state:0x1
      current:    10MB-HD AUTO_NEG
      advertised: 10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG AUTO_PAUSE
      supported:  10MB-HD 10MB-FD 100MB-HD 100MB-FD COPPER AUTO_NEG
 LOCAL(br0): addr:00:0d:0b:6a:5b:34, config: 0, state:0
 get_config_reply (xid=0x272fb894): miss_send_len=0

スイッチにflowテーブルが存在しないことを確認します。~

 $ dpctl dump-flows tcp:192.168.1.1:6634
 stats_reply (xid=0x3c4353aa): flags=none type=1(flow)

Host1、Host2間でpingを実行しそれぞれのホストへ到達しないことを確認します。~

 $ ping -c3 192.168.11.1
 PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
 From 192.168.11.2 icmp_seq=1 Destination Host Unreachable
 From 192.168.11.2 icmp_seq=2 Destination Host Unreachable
 From 192.168.11.2 icmp_seq=3 Destination Host Unreachable

PC(Controller)からport1,2間のパケットを通すflowテーブルを追加します。~

 $ dpctl add-flow tcp:192.168.1.1:6634 in_port=1,actions=output:2
 $ dpctl add-flow tcp:192.168.1.1:6634 in_port=2,actions=output:1

flowテーブルが追加されていることを確認します。~

 $ dpctl dump-flows tcp:192.168.1.1:6634stats_reply (xid=0x52955575): flags=none type=1(flow)
   cookie=0, duration_sec=9s, duration_nsec=443000000s, table_id=0, priority=32768, n_packets=0, n_bytes=0, idle_timeout=60,hard_timeout=0,in_port=1,actions=output:2
   cookie=0, duration_sec=2s, duration_nsec=309000000s, table_id=0, priority=32768, n_packets=0, n_bytes=0, idle_timeout=60,hard_timeout=0,in_port=2,actions=output:1

再度Host1、Host2間でpingを実行しそれぞれのホストへ到達することを確認します。~
 $ ping -c3 192.168.11.1
 PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
 64 bytes from 192.168.11.1: icmp_req=1 ttl=64 time=6.89 ms
 64 bytes from 192.168.11.1: icmp_req=2 ttl=64 time=2.07 ms
 64 bytes from 192.168.11.1: icmp_req=3 ttl=64 time=1.74 ms
 
 --- 192.168.11.1 ping statistics ---
 3 packets transmitted, 3 received, 0% packet loss, time 2001ms
 rtt min/avg/max/mdev = 1.740/3.570/6.897/2.357 ms

一定時間経過後追加したflowテーブルが消えていることを確認します。~

 $ dpctl dump-flows tcp:192.168.1.1:6634
 stats_reply (xid=0x68565278): flags=none type=1(flow)

** OpenFlow Tutorial 2 [#w84bde3f]
[[OpenFlow/OpenFlow Turorial 2]]で行った動作確認と同様の手順でOpenFlow Switchの動作確認を行います。~
[[OpenFlow/OpenFlow Turorial 2>http://labs.beatcraft.com/ja/index.php?OpenFlow%2FOpenFlow%20Tutorial%202]]で行った動作確認と同様の手順でOpenFlow Switchの動作確認を行います。~
~
PC(Switch)上の別ターミナルでWiresharkを起動しFilterに「of」を設定します。~

 $ sudo wireshark

PC(Controller)上の別ターミナルでcontrollerコマンドを実行します。 ~

 $ controller ptcp:

その際PC(Switch)上のWireshark上でOpenFlow Packetがキャプチャされていることを確認します。~

#ref(OVS.png,,60%);~
#ref(OVS.png,,80%);~

Host1、Host2間でpingを実行しそれぞれのホストへ到達することを確認します。~

 $ ping -c3 192.168.11.1
 PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
 64 bytes from 192.168.11.1: icmp_req=1 ttl=64 time=11.3 ms
 64 bytes from 192.168.11.1: icmp_req=2 ttl=64 time=2.86 ms
 64 bytes from 192.168.11.1: icmp_req=3 ttl=64 time=2.41 ms
 
 --- 192.168.11.1 ping statistics ---
 3 packets transmitted, 3 received, 0% packet loss, time 2002ms
 rtt min/avg/max/mdev = 2.410/5.534/11.323/4.097 ms

またPC(Controller)上からPC(Switch)のフローテーブルが増加していることを確認します。~

 $ dpctl dump-flows tcp:192.168.1.1:6634
 stats_reply (xid=0xac113424): flags=none type=1(flow)
  cookie=0, duration_sec=11s, duration_nsec=597000000s, table_id=0, priority=65535, n_packets=3, n_bytes=294,idle_timeout=60,hard_timeout=0,icmp,in_port=1,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=4c:e6:76:55:44:d0,dl_dst=00:0f:b0:f7:28:07,nw_src=192.168.11.2,nw_dst=192.168.11.1,nw_tos=0x00,icmp_type=8,icmp_code=0,actions=output:2
   cookie=0, duration_sec=11s, duration_nsec=594000000s, table_id=0, priority=65535, n_packets=3, n_bytes=294,idle_timeout=60,hard_timeout=0,icmp,in_port=2,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:0f:b0:f7:28:07,dl_dst=4c:e6:76:55:44:d0,nw_src=192.168.11.1,nw_dst=192.168.11.2,nw_tos=0x00,icmp_type=0,icmp_code=0,actions=output:1
   cookie=0, duration_sec=6s, duration_nsec=592000000s, table_id=0, priority=65535, n_packets=1, n_bytes=60,idle_timeout=60,hard_timeout=0,arp,in_port=2,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:0f:b0:f7:28:07,dl_dst=4c:e6:76:55:44:d0,nw_src=192.168.11.1,nw_dst=192.168.11.2,nw_proto=1,actions=output:1
   cookie=0, duration_sec=6s, duration_nsec=588000000s, table_id=0, priority=65535, n_packets=1, n_bytes=60,idle_timeout=60,hard_timeout=0,arp,in_port=1,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=4c:e6:76:55:44:d0,dl_dst=00:0f:b0:f7:28:07,nw_src=192.168.11.2,nw_dst=192.168.11.1,nw_proto=2,actions=output:2
   cookie=0, duration_sec=11s, duration_nsec=599000000s, table_id=0, priority=65535, n_packets=1, n_bytes=60,idle_timeout=60,hard_timeout=0,arp,in_port=2,dl_vlan=0xffff,dl_vlan_pcp=0x00,dl_src=00:0f:b0:f7:28:07,dl_dst=4c:e6:76:55:44:d0,nw_src=192.168.11.1,nw_dst=192.168.11.2,nw_proto=2,actions=output:1

以上でOpenFlow Tutorial1,2と同様の動作確認は完了です。 ~
(性能差については本稿では省略しています) ~

*** Topic: OpenFlow Reference実装との差異 [#y3e1b690]
本稿のOpenFlowの動作確認バージョンは1.0で、既に更新されていない ~
OpenFlow ReferenceをControllerとして使用しています。~

OpenFlow Reference実装を使用したOpenFlow Switchを作成した際、~
Open vSwitchと異なる点があります。~

Open vSwitchを使用したOpenFlow SwitchではActionsが0x00000fffとなりますが、~
OpenFlow Reference実装を使用したOpenFlow SwitchではActionsが0x00000effとなります。~
これはOpenFlow Reference実装を使用したOpenFlow SwitchではSet IP TOS bitがNoになるためです。~

Open vSwitchではこの修正、改良が含まれているためSet IP TOS bitがYesになっています。 ~

OpenFlow Reference実装を使用したOpenFlow Switchの作成は以下の ~
コマンドにて確認しています。(Controller側は上記と同じコマンドで確認しています)~

 # ofdatapath punix:/var/run/dp0.sock -i eth2,eth3 --local-port=tap:tap0 -D
 # ofprotocol unix:/var/run/dp0.sock tcp:192.168.1.10:6633 --out-of-band --fail=closed --listen=ptcp:6634

#ref(OpenVswitch.png,,60%) ~
#ref(OpenVswitch.png,,80%) ~
図1. Open vSwitchを使用したOpenFlow SwtichのActions ~
~
#ref(OpenFlow.png,,60%) ~
#ref(OpenFlow.png,,80%) ~
図2. OpenFlow Referenceを使用したOpenFlow SwitchのActions ~

BC::labsへの質問は、bc9-dev @ googlegroups.com までお願い致します。
トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS