OpenFlow/OpenFlow Tutorial 1 †OpenFlow の概要を把握するために、以下のチュートリアルのように 仮想ネットワーク環境作成 †mininetを用いて下図のような仮想ネットワーク環境を作成します。
$ sudo mn --topo single,3 --mac --switch ovsk --controller remote *** Creating network *** Adding controller Unable to contact the remote controller at 127.0.0.1:6633 *** Adding hosts: h1 h2 h3 *** Adding switches: s1 *** Adding links: (h1, s1) (h2, s1) (h3, s1) *** Configuring hosts h1 h2 h3 *** Starting controller *** Starting 1 switches s1 *** Starting CLI: mininet> 上記のコマンドにより、 mininet> nodes available nodes are: h2 h3 h1 s1 c0 各ホストとスイッチは以下のようになっています。 mininet> h1 ifconfig h1-eth0 Link encap:イーサネット ハードウェアアドレス 00:00:00:00:00:01 inetアドレス:10.0.0.1 ブロードキャスト:10.255.255.255 マスク:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) lo Link encap:ローカルループバック inetアドレス:127.0.0.1 マスク:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:0 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) h2 mininet> h2 ifconfig h2-eth0 Link encap:イーサネット ハードウェアアドレス 00:00:00:00:00:02 inetアドレス:10.0.0.2 ブロードキャスト:10.255.255.255 マスク:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) lo Link encap:ローカルループバック inetアドレス:127.0.0.1 マスク:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:0 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) h3 mininet> h3 ifconfig h3-eth0 Link encap:イーサネット ハードウェアアドレス 00:00:00:00:00:03 inetアドレス:10.0.0.3 ブロードキャスト:10.255.255.255 マスク:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) lo Link encap:ローカルループバック inetアドレス:127.0.0.1 マスク:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:0 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) s1 mininet> s1 ifconfig eth0 Link encap:イーサネット ハードウェアアドレス 00:23:8b:56:f9:ed inetアドレス:192.168.0.146 ブロードキャスト:192.168.0.255 マスク:255.255.255.0 inet6アドレス: 2001:268:321:8000:223:8bff:fe56:f9ed/64 範囲:グローバル inet6アドレス: fe80::223:8bff:fe56:f9ed/64 範囲:リンク inet6アドレス: 2001:268:321:8000:4c96:18c9:b0b1:bb7a/64 範囲:グローバル UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:4906 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:670 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:589463 (589.4 KB) TXバイト:78711 (78.7 KB) 割り込み:16 lo Link encap:ローカルループバック inetアドレス:127.0.0.1 マスク:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 メトリック:1 RXパケット:876 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:876 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:0 RXバイト:58056 (58.0 KB) TXバイト:58056 (58.0 KB) s1-eth1 Link encap:イーサネット ハードウェアアドレス d6:7e:38:49:0f:3d UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) s1-eth2 Link encap:イーサネット ハードウェアアドレス 9e:62:1c:ea:62:0e UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) s1-eth3 Link encap:イーサネット ハードウェアアドレス da:ab:31:04:07:d6 UP BROADCAST RUNNING MULTICAST MTU:1500 メトリック:1 RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0 TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0 衝突(Collisions):0 TXキュー長:1000 RXバイト:0 (0.0 B) TXバイト:0 (0.0 B) dpctl使用例 †mininet が起動したら別の Shell で dpctl を実行します。 $ dpctl show tcp:127.0.0.1:6634 features_reply (xid=0x77393f77): ver:0x1, dpid:1 n_tables:255, n_buffers:256 features: capabilities:0xc7, actions:0xfff 1(s1-eth1): addr:d6:7e:38:49:0f:3d, config: 0, state:0 current: 10GB-FD COPPER 2(s1-eth2): addr:9e:62:1c:ea:62:0e, config: 0, state:0 current: 10GB-FD COPPER 3(s1-eth3): addr:da:ab:31:04:07:d6, config: 0, state:0 current: 10GB-FD COPPER LOCAL(s1): addr:de:5f:fc:4b:49:4a, config: 0x1, state:0x1 get_config_reply (xid=0x85b71d0d): miss_send_len=0 dump-flows でフローテーブルの状態を表示します。 $ dpctl dump-flows tcp:127.0.0.1:6634 stats_reply (xid=0x265ded5c): flags=none type=1(flow) まだ OpenFlow コントローラーを動かしていないので、当然フローテーブルは空です。 mininet> h1 ping -c3 h2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. From 10.0.0.1 icmp_seq=1 Destination Host Unreachable From 10.0.0.1 icmp_seq=2 Destination Host Unreachable From 10.0.0.1 icmp_seq=3 Destination Host Unreachable --- 10.0.0.2 ping statistics --- 3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 1999ms pipe 3 まだスイッチのフローテーブルが空で、コントローラーもスイッチに接続していないので、 $ dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2 $ dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1 フローテーブルを確認します。 $ dpctl dump-flows tcp:127.0.0.1:6634 stats_reply (xid=0x2fbc71b7): flags=none type=1(flow) cookie=0, duration_sec=14s, duration_nsec=964000000s, 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=8s, duration_nsec=934000000s, table_id=0, priority=32768, n_packets=0, n_bytes=0, idle_timeout=60,hard_timeout=0,in_port=2,actions=output:1 再度 ping を打ってみます。 mininet> h1 ping -c3 h2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_req=1 ttl=64 time=1.39 ms 64 bytes from 10.0.0.2: icmp_req=2 ttl=64 time=0.132 ms 64 bytes from 10.0.0.2: icmp_req=3 ttl=64 time=0.140 ms --- 10.0.0.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2001ms rtt min/avg/max/mdev = 0.132/0.557/1.399/0.595 ms add-flow で port1 から port2 とその反対方向のパケット転送を設定したので ping が通るようになりました。 mininet> h2 ping -c3 h1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_req=1 ttl=64 time=0.711 ms 64 bytes from 10.0.0.1: icmp_req=2 ttl=64 time=0.128 ms 64 bytes from 10.0.0.1: icmp_req=3 ttl=64 time=0.135 ms --- 10.0.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1998ms rtt min/avg/max/mdev = 0.128/0.324/0.711/0.273 ms ping の後にフローテーブルの状況を確認すると $ dpctl dump-flows tcp:127.0.0.1:6634 stats_reply (xid=0x35d81496): flags=none type=1(flow) cookie=0, duration_sec=21s, duration_nsec=123000000s, table_id=0, priority=32768, n_packets=8, n_bytes=672, idle_timeout=60,hard_timeout=0,in_port=1,actions=output:2 cookie=0, duration_sec=19s, duration_nsec=312000000s, table_id=0, priority=32768, n_packets=8, n_bytes=672, idle_timeout=60,hard_timeout=0,in_port=2,actions=output:1 持続時間、通過パケット、通過バイト数、が増えているのがわかります。 |