Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

話題のOpenFlowをフル活用! OpenVNetで仮想ネットワークを実現しよう!

2,260 views

Published on

Published in: Technology
  • Be the first to comment

話題のOpenFlowをフル活用! OpenVNetで仮想ネットワークを実現しよう!

  1. 1. 話題のOpenFlowをフル活用! OpenVNetで仮想ネットワークを! 実現しよう! 株式会社あくしゅ 横川晃 !1
  2. 2. 自己紹介 • 名前: 横川 晃(よこかわ あきら) • 株式会社あくしゅ • 好きなこと: スポーツ、旅行、語学 • Twitter: @_akira_ @oO_akira_Oo • Facebook: akira.yokokawa !2
  3. 3. もくてき • OpenFlowってどんなものかわかるようになる • フローがよめるようになる • OpenVNetの仕組みが大体わかるようになる !3
  4. 4. ・L2とL3の簡単なおさらい ・OpenFlowってなに?  * OpenFlowのしくみについて  * 周辺技術の紹介 ・OpenVNet開発について  - 経緯  - 設計・実装 ・OpenVNetテストについて ・OpenVNet今後の計画 Agenda !4
  5. 5. OSI参照モデル 物理層 データリンク層 ネットワーク層 トランスポート層 セッション層 プレゼンテーション層 アプリケーション層 IPなど TCP, UDP Ethernet, PPPなど !5
  6. 6. OSI参照モデル データリンク層 ネットワーク層 IPなど Ethernet, PPPなど 第2層、第3層に関して 実際のネットワーク機器上ではどんな動きをするのか 軽くおさらいします のちに説明する、OpenVNetの仕組みを理解する上でも役立ちます !6
  7. 7. 第2層:データリンク層 • Ethernet frameと呼ばれる下記のデータを扱う Payload FCSEthertype MAC (source) MAC (destination) 46∼1500バイト 4バイト2バイト6バイト6バイト !7
  8. 8. L2スイッチの挙動 • MACアドレスとポートの一覧を保持する • 初めはからっぽ 1 2 3 4 IP = X MAC = A A B MACアドレス ポート番号 IP = Y MAC = B !8
  9. 9. L2スイッチの挙動 1 2 3 4 A B MACアドレス ポート番号 IP = X MAC = A パケットが届くとMACアドレスとポート番号のペアを 記憶する !9 A 1
  10. 10. L2スイッチの挙動 1 2 3 4 A B MACアドレス ポート番号 A 1 IP = Y MAC = B 他のマシンがスイッチにつながった場合も 同様にしてMACアドレスとポート番号を記憶 B 3 !10
  11. 11. L2スイッチの挙動 1 2 3 4 A B MACアドレス ポート番号 A 1 MACアドレステーブルの情報に従い フレームを送信するポートを決定する B 3 !11 Bへパケットを送信
  12. 12. 第3層:ネットワーク層 Payload FCSEthertype MAC (source) MAC (destination) 46∼1500バイト 4バイト2バイト6バイト6バイト PayloadTCP ヘッダ IP ヘッダ 20バイト 20バイト 40∼1460バイト !12
  13. 13. L3ルータの挙動 1 2 3 4 A B 192.168.1.0/24 192.168.2.0/24 宛先 ルータ ホップ ポート 192.168.1.0 - 0 1 192.168.2.0 - 0 4 • 宛先IPアドレスを読み宛先ネットワークを決定 • ルーティングテーブルを参照し送信先を決定 !13
  14. 14. 複数ルータ間の挙動 1 2 3 4 A B 192.168.1.0/24 192.168.2.0/24 宛先 ルータ ホップ ポート 192.168.1.0 - 0 1 192.168.2.0 210.99.47.1 1 4 1 2 3 4 130.82.12.1 210.99.47.1 宛先 ルータ ホップ ポート 192.168.2.0 - 0 4 192.168.1.0 130.82.12.1 1 1 ダイナミックルーティングの場合 EGP等で経路情報を交換 !14
  15. 15. まとめ • L2:スイッチではMACアドレスを基に制御 • MACアドレスとポートのペアをキャッシュ • L3:ルータではIPアドレスを基に制御 • ルーティングテーブルを参照して送信先決定 つづいてOpenFlowの説明に移ります !15
  16. 16. What is OpenFlow? • 2009年スタンフォード大での研究が発端 • http://archive.openflow.org/wp/2009/12/openflow-1-0-released/ • ONF(Open Networking Foundation)が管理 • OpenFlowスイッチをプログラムするプロトコル • 今まで中のソフトウェアは非公開 • ソフトウェアが外出しになってプログラムできる !16
  17. 17. OpenFlow Versioning History • 1.0 - 2009年12月31日 • 1.1 - 2011年2月28日 • 1.2 - 2011年12月5日 • 1.3 - 2012年6月25日 • 1.4 - 2013年10月15日 OpenVNetは1.3に対応 !17
  18. 18. OpenFlow: プロトコルの説明 OpenFlowスイッチに対してOpenFlowプロトコル でやりとりしスイッチの挙動をプログラム • セキュアチャンネルでコントローラとスイッチを接続 • OpenFlowバージョンの確認 • スイッチの情報の確認 • パケットの受信 • フローの更新 !18
  19. 19. セキュアチャンネルでコントローラとスイッチを接続 抜粋 The switch must be able to establish communication with a controller at a user-configurable (but otherwise fixed) IP address, using a user- specified port. If the switch knows the IP address of the controller, the switch initiates a standard TLS or TCP connection to the controller. 出典:OpenFlow Switch Specification version 1.3.0 1 2 3 OpenFlow コントローラ tcp://192.168.2.102:6379 !19
  20. 20. セキュアチャンネルでコントローラとスイッチを接続 A typical OpenFlow controller manages multiple OpenFlow channels, each one to a different OpenFlow switch. An OpenFlow switch may have one OpenFlow channel to a single controller, or multiple channels for reliability, each to a different controller. 1 2 3 OpenFlow コントローラ2 OpenFlow コントローラ1 1 2 3 出典:OpenFlow Switch Specification version 1.3.0 複数コントローラ、スイッチの構成も可能 !20
  21. 21. OpenFlowバージョンの確認 When an OpenFlow connection is first established, each side of the connection must immediately send an OFPT_HELLO message with the version field set to the highest OpenFlow protocol version supported by the sender. 出典:OpenFlow Switch Specification version 1.3.0 1 2 3 OpenFlow コントローラ バージョン 1.3 バージョン 1.3 サポートしてる最新のバージョンを教えあう !21
  22. 22. スイッチの情報の確認 Features: The controller may request the capabilities of a switch by sending a features request; the switch must respond with a features reply that specifies the capabilities of the switch. This is commonly performed upon establishment of the OpenFlow channel. 出典:OpenFlow Switch Specification version 1.3.0 1 2 3 OpenFlow コントローラ FEATURE_REQUEST FEATURE_REPLY • Datapath ID • ポートの一覧など Datapath? スイッチとかブリッジと同じと思ってください !22
  23. 23. パケットの受信 When packets are received by the datapath and sent to the controller, they use the OFPT_PACKET_IN message: 出典:OpenFlow Switch Specification version 1.3.0 1 2 3 OpenFlow コントローラ PACKET_IN • data … パケットの中身 • reason … なんでpacket_inしたか • match … どのポートから入ったのかなど • cookie … フロー毎につけられるIDのようなもの !23
  24. 24. フローの更新 1 2 3 OpenFlow コントローラ FLOW_MOD PACKET_OUT フローの更新はFLOW_MODメッセージでやりとり PACKET_OUTで受け取ったパケットを戻す フローってどんな感じになってるのか? !24
  25. 25. [root@itest1 ~]# ovs-ofctl dump-flows br0 NXST_FLOW reply (xid=0x4): cookie=0x900000000000000, duration=11102.212s, table=0, n_packets=5551, n_bytes=288652, idle_age=1, priority=1,tun_id=0 actions=drop cookie=0x900000000000000, duration=11102.211s, table=0, n_packets=0, n_bytes=0, idle_age=11102, priority=2,in_port=CONTROLLER actions=write_metadata: 0x4040000000000/0x40c0000000000 cookie=0x500000000000003, duration=11101.919s, table=0, n_packets=0, n_bytes=0, idle_age=11101, priority=2,in_port=3 actions=write_metadata: 0x700040000000007/0xff000c007fffffff cookie=0x5000000fffffffe, duration=11101.919s, table=0, n_packets=0, n_bytes=0, idle_age=11101, priority=2,in_port=LOCAL actions=write_metadata:0x40000000000/0xc0000000000 cookie=0x900000000000000, duration=11102.211s, table=0, n_packets=0, n_bytes=0, idle_age=11102, priority=0 actions=write_metadata:0x80000000000/0xc0000000000 cookie=0x500000000000296, duration=11102.049s, table=3, n_packets=0, n_bytes=0, idle_age=11102, priority=30,in_port=662 actions=drop cookie=0x900000000000000, duration=11102.212s, table=3, n_packets=0, n_bytes=0, idle_age=11102, priority=0 actions=drop cookie=0x900000000000000, duration=11102.212s, table=4, n_packets=0, n_bytes=0, idle_age=11102, priority=0 actions=drop cookie=0xc00001300000001, duration=11101.729s, table=6, n_packets=0, n_bytes=0, idle_age=11101, priority=30,dl_src=02:01:00:00:00:01 actions=write_metadata: 0x700000000000001/0xff0000007fffffff cookie=0x900000000000000, duration=11102.212s, table=6, n_packets=0, n_bytes=0, idle_age=11102, priority=0 actions=drop cookie=0x900000000000000, duration=11102.212s, table=7, n_packets=0, n_bytes=0, idle_age=11102, priority=0 actions=drop cookie=0x900000000000000, duration=11102.212s, table=8, n_packets=0, n_bytes=0, idle_age=11102, priority=0 actions=drop cookie=0x900000000000000, duration=11102.212s, table=9, n_packets=0, n_bytes=0, idle_age=11102, priority=0 actions=drop !25
  26. 26. cookie=0x500000000000296, duration=11102.049s, table=3, n_packets=0, n_bytes=0, idle_age=11102, priority=30,in_port=662 actions=drop match action matchの条件に該当したパケットに対して、 actionで指定されている処理を適用する このフローの場合はパケットを破棄する !26 フローの例:その1
  27. 27. cookie=0x900000000000000, duration=85917.793s, table=0, n_packets=0, n_bytes=0, priority=2,in_port=2 actions=goto_table:7 match in_port=2 action actions=goto_table:7 2番ポートからパケットが入ってきたら、 7番テーブルへ処理を移す OpenVNetではテーブルごとに処理したい内容を分けてる !27 フローの例:その2
  28. 28. cookie=0xc00001200000001, duration=85916.453s, table=10, n_packets=42960, n_bytes=2233920, priority=10,metadata=0x700000000000001/0xff0000007fffffff actions=drop match metadata=0x700000000000001/0xff0000007fffffff action actions=drop value mask !28 フローの例:その3
  29. 29. metadata=0x700000000000001/0xff0000007fffffff value mask 64ビットのレジスタ metadata & mask == value Pipeline processing instructions allow packets to be sent to subsequent tables for further processing and allow information, in the form of metadata, to be communicated between tables. !29 metadata 出典:OpenFlow Switch Specification version 1.3.0
  30. 30. OpenFlow Switches • いろんなOpenFlowスイッチ • ソフトウェア実装 • Open vSwitch • OpenVNetではこれつかってる !30
  31. 31. OpenFlow Controller • OpenFlowをしゃべるプログラム • OpenVNetでもコントローラを定義 • Tremaというフレームワークをつかっている !31
  32. 32. Trema • C言語で開発 • Rubyから利用できるフレームワーク • 開発元:NEC • GitHub上で管理 • https://github.com/trema/trema !32
  33. 33. # -*- coding: utf-8 -*- ! require 'racket' require 'trema/actions' require 'trema/instructions' require 'trema/messages' ! module Vnet::Openflow ! class Controller < Trema::Controller include TremaTasks include Celluloid::Logger include Vnet::Constants::Openflow ! def features_reply(dpid, message) info "features_reply from %#x." % dpid ! datapath = datapath(dpid) || raise("No datapath found.") datapath.switch.async.features_reply(message) end ! ! def port_status(dpid, message) debug "port_status from %#x." % dpid ! datapath = datapath(dpid) datapath.switch.async.port_status(message) if datapath && datapath.switch end ! def packet_in(dpid, message) dp_info = dp_info(dpid) return unless dp_info ! case message.cookie >> COOKIE_PREFIX_SHIFT when COOKIE_PREFIX_INTERFACE dp_info.interface_manager.async.packet_in(message) when COOKIE_PREFIX_TRANSLATION dp_info.translation_manager.async.packet_in(message) when COOKIE_PREFIX_ROUTE_LINK dp_info.router_manager.async.packet_in(message) when COOKIE_PREFIX_SERVICE dp_info.service_manager.async.packet_in(message) when COOKIE_PREFIX_CONNECTION dp_info.connection_manager.async.packet_in(message) end end !33
  34. 34. OpenVNetの設計・実装 !34
  35. 35. What is OpenVNet? • Spin-off project from Wakame-vdc • 5 developers • 2279 commits • Written in Ruby • 16512 LOCs (5257 LOCs test codes) • Started March 2013

×