RouterBOARD with OpenFlow

11,140 views

Published on

RouterBOARD (RB750GL)で OpenFlow動作を確認してみました

RouterBOARD with OpenFlow

  1. 1. RouterBOARD (RB750GL)で OpenFlow動作を確認してみました 2013.11.16 @ttsubo
  2. 2. 自己紹介 @ttsubo ・通信事業者向けネットワークエンジニアをやってます。 ・最近は、データセンタ系ネットワーク技術動向に興味があり、   OpenStack等のIaaS管理基盤技術を勉強中。 ・さらに、「これからの時代、ネットワーク屋も、プログラミ  ング必要だよね。」という風潮に感化されて、OpenFlow  プログラミングも勉強中。 2
  3. 3. RouterBOARDとは 自宅ラック勉強会 #15.0 RouterBoard勉強会Vol.1の 資料あたりをご確認ください。 http://connpass.com/event/3208/?disp_content=presentation#tabs http://en.wikipedia.org/wiki/MikroTik 豊富なネットワーク制御機能を有するRouterOSを搭載して おり、最近、OpenFlow対応したそうです。 ! CCR1036-12G-4S ¥115,500 ! ! RB2011L-IN 最新RouterOSの バージョンは、 6.6 MMM MMM MMMM MMMM MMM MMMM MMM MMM MM MMM MMM MMM MMM MMM III III III III KKK KKK KKK KKK KKKKK KKK KKK KKK KKK RRRRRR RRR RRR RRRRRR RRR RRR MikroTik RouterOS 6.6 (c) 1999-2013 TTTTTTTTTTT TTTTTTTTTTT OOOOOO TTT OOO OOO TTT OOO OOO TTT OOOOOO TTT III III III III KKK KKK KKK KKK KKKKK KKK KKK KKK KKK http://www.mikrotik.com/ RB750GL [?] command [?] Gives the list of available commands Gives help on the command and list of arguments [Tab] ¥13,650 Completes the command/word. If the input is ambigous, a second [Tab] gives possible options ! ! ¥9,450 http://routerboard.jp / .. /command Move up to base level Move up one level Use command at the base level 3
  4. 4. RouterOSでのOpenFlow対応 あくまで、実験用途とのことですが、個人の出費レベル でOpenFlowスイッチが手に入るのは魅力ですよね。 Currently RouterOS implements OpenFlow version 1.0.0 required features. Support for newer versions, optional features and switching hardware acceleration are to be added. Current implementation should be considered experimental - NOT production ready and is available for evaluation purposes. Please contact support with feature requests and bug reports. OpenFlow support is available as standalone openflow package. OpenFlow feature overrides regular packet processing functionality packets that are received on interfaces that are OpenFlow switch ports, will not pass through the regular networking stack unless OpenFlow controller sets up flows that enable this. Due to this care must be taken to not disable access to the device when configuring OpenFlow. Currently only unencrypted TCP is available as the communications channel between RouterOS OpenFlow switch and controller. http://wiki.mikrotik.com/wiki/Manual:OpenFlow 4
  5. 5. ということで、 どの程度、OpenFlow機能が使えるのかを 試してみました 目標感: OpenFlow化したRB750GLで SimpleRouterを実現してみる。 5
  6. 6. OpenFlowの動作確認シナリオ PC-AとPC-B間でのL3通信を実現するために、 IPルーティングな挙動をOpenFlowで動作させてみる OFS PC-A OFC PC-B Secure Channel 192.168.0.1 ARP Request ARP Reply ICMP_Echo Request 192.168.1.1 Packet-in Packet-out Packet-in Packet-out Drop!! ARP Request ARP Reply FlowMod ICMP_Echo Request ICMP (Echo Reply ICMP_Echo Request ICMP (Echo Reply 6
  7. 7. ファーストチャレンジ: NGでした 残念ながら OFS側でのPacket-in処理が実施されなかった OFS PC-A OFC PC-B Secure Channel 192.168.0.1 192.168.1.1 ARP Request ARP Reply ICMP_Echo Request ICMP_Echo Request ICMP (Echo Reply Packet-out Drop!! ARP Requestを 受信しても ARP Request ARP Reply Packet-inされない FlowMod Packet-in Packet-out ICMP_Echo Request ICMP (Echo Reply 7
  8. 8. Features Replyを確認してみると... OFS側でPacket-inが実施されない原因解析として Secure Channel開設フェーズを確認してみた OFS OFC Secure Channel Max packets bufferedが 0 となっている!! Hello Hello Features Request Features Reply Set Config Echo Request Echo Reply 8
  9. 9. Max packets buffered /* Switch features. */ struct ofp_switch_features { struct ofp_header header; }; OpenFlow Switch Specification Version 1.3.2 7.3 Controller-to-Switch Messages uint64_t datapath_id; uint32_t n_buffers; uint8_t n_tables; uint8_t auxiliary_id; uint8_t pad[2]; /* Datapath unique ID. The lower 48-bits are for a MAC address, while the upper 16-bits are implementer-defined. */ /* Max packets buffered at once. */ /* Number of tables supported by datapath. */ /* Identify auxiliary connections */ /* Align to 64-bits. */ /* Features. */ uint32_t capabilities; /* Bitmap of support "ofp_capabilities". */ uint32_t reserved; }; OFP_ASSERT(sizeof(struct ofp_switch_features) == 32); The datapath_id field uniquely identifies a datapath. The lower 48 bits are intended for the switch MAC address, while the top 16 bits are up to the implementer. An example use of the top 16 bits would be a VLAN ID to distinguish multiple virtual switch instances on a single physical switch. This field should be treated as an opaque bit string by controllers. The n_buffers field specifies the maximum number of packets the switch can buffer when sending packets to the controller using packet-in messages (see 6.1.2). RouterBoard (RB750GL)によるOpenFlow環境では、 Packet-in処理は対応していないみたい... 9
  10. 10. ちょっと、動作確認シナリオを改良してみる Packet-in処理を排除した検証シナリオにて、引き続き、 IPルーティングな挙動をOpenFlowで動作させてみる OFS PC-A OFC PC-B Secure Channel 192.168.0.1 ARP Request 192.168.1.1 Packet-in Packet-out 事前に、PC-A, PC-B側でARP学習 ARP Reply させた上で、OFS側で適切なFlowエントリ ICMP_Echo Request Drop!! を登録しておく。 Packet-in ARP Reply Packet-out Packet-out Packet-out ARP Request ARP Reply ARP Reply FlowMod ICMP_Echo Request ICMP (Echo Reply ICMP_Echo Request ICMP (Echo Reply 10
  11. 11. セカンドチャレンジ: NGでした 惜しくも PC-Aでのping疎通が失敗してしまった OFS PC-A OFC PC-B Secure Channel 192.168.0.1 ARP Reply 192.168.1.1 Packet-out Packet-out ARP Reply FlowMod ICMP_Echo Request ICMP (Echo Reply ICMP_Echo Request ICMP (Echo Reply ICMP_Echo_Reply が受信されない 11
  12. 12. 動作結果を解析してみると... OFS PC-A OFC PC-B Secure Channel 192.168.0.1 ARP Reply 192.168.1.1 Packet-out Packet-out ARP Reply FlowMod ICMP_Echo Request [admin@MikroTik] > openflow flow print detail Flags: I - inactive 0 switch=oflow1 version=1 match="inport:1 dlsrc:7C:C3:A1:87:8F:65 dldst:00:00:00:00:00:01 dltype:0x800 ICMP_Echo Request Flowエントリは、 正しく設定されていた nwdst:192.168.1.1/32" actions="set_dl_src:00:00:00:00:00:02, set_dl_dst:00:1A:80:0A:9E:D4, output:2" info="priority 255, idletimeout 0, hardtimeout 0, cookie 0, removenotify 1" ! 1 switch=oflow1 version=1 match="inport:2 dlsrc:00:1A:80:0A:9E:D4 dldst:00:00:00:00:00:02 dltype:0x800 nwdst:192.168.0.1/32" actions="set_dl_src:00:00:00:00:00:01, set_dl_dst:7C:C3:A1:87:8F:65, output:1" info="priority 255, idletimeout 0, hardtimeout 0, cookie 0, removenotify 1" 12
  13. 13. 動作結果を解析してみると... OFS PC-A OFC PC-B Secure Channel 192.168.0.1 192.168.1.1 Packet-out ARP Reply Packet-out ARP Reply FlowMod ICMP_Echo Request ICMP_Echo Request Flowエントリの統計情報が、 カウントアップされていない !! [admin@MikroTik] > openflow flow print stats Flags: I - inactive # SWITCH MATCH BYTES 0 oflow1 1 oflow1 0 0 inpor... inpor... PACKETS DURATION 0 3m38s830ms 0 3m38s830ms 13
  14. 14. 動作結果を解析してみると... OFS PC-A OFC PC-B Secure Channel 192.168.0.1 ARP Reply 192.168.1.1 Packet-out Packet-out ARP Reply FlowMod ICMP_Echo Request ICMP_Echo Request PC-B側でパケット キャプチャしてみたところ、 ICMP_Echo_Requestを 受信しているにも関わらず、 ICMP_Echo_Replyを 送信していない 14
  15. 15. ICMP_Echo_Requestを確認してみると… PC-Aが送信したICMP_Echo_Request がそのままPC-Bに到着していた 192.168.0.1 (7C:C3:A1:87:8F:65) OFS PC-A 192.168.0.10 (00:00:00:00:00:01) 192.168.1.1 (00:1A:80:0A:9E:D4) Flowエントリ に従った転送制御 が行われていない !! PC-B ICMP_Echo Request 15
  16. 16. Features Replyを確認してみると... OFS側でFlowエントリに従った転送制御が実施されない原因解析 として、Secure Channel開設フェーズを再度、確認してみた OFS OFC Secure Channel RouterBOARD (RB750GL)では、 L2/L3ヘッダを更新する処理に対応 していないみたい… Hello Hello Features Request Features Reply Set Config Echo Request Echo Reply 16
  17. 17. 目標を変更して、どの程度、OpenFlow機能が 使えるのかを試してみました 目標感: OpenFlow化したRB750GLで SimpleRouterを実現してみる。 SimpleSwitch 17
  18. 18. OpenFlowの動作確認シナリオ L2/L3ヘッダの更新処理を排除した検証シナリオにて、 L2転送(ダムHUB)な挙動をOpenFlowで動作させてみる OFS PC-A OFC PC-B Secure Channel 192.168.0.1 ARP Request ARP Reply ICMP_Echo Request 192.168.0.2 Packet-in Packet-out Packet-in Packet-out Drop!! OFS側で適切なFlowエントリ ARP Request ARP Reply を登録しておく。 FlowMod ICMP_Echo Request ICMP (Echo Reply ICMP_Echo Request ICMP (Echo Reply 18
  19. 19. サードチャレンジ: NGでした やっぱり PC-Aでのping疎通は成功するが... PC-A OFS OFC PC-B Secure Channel 192.168.0.1 192.168.0.2 FlowMod ICMP_Echo Request ICMP_Echo Request ICMP (Echo Reply ICMP (Echo Reply tsubois-MacBook-Air:~ t_tsubo2000$ ping 192.168.0.2 PING 192.168.0.2 (192.168.0.2): 56 data bytes 64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=0.691 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.462 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.563 64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.460 64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.461 ms ms ms ms ms Flowエントリ に従った転送制御 が行われていない?? 19
  20. 20. 動作結果を解析してみると... PC-A OFS 192.168.0.1 OFC PC-B Secure Channel 192.168.0.2 FlowMod ICMP_Echo Request [admin@MikroTik] > openflow flow print detail Flags: I - inactive 0 switch=oflow1 version=1 match="inport:1" actions="output:2" ICMP_Echo Request Flowエントリは、 正しく設定されていた info="priority 255, idletimeout 0, hardtimeout 0, cookie 0, removenotify 1" ! 1 switch=oflow1 version=1 match="inport:2" actions="output:1" info="priority 255, idletimeout 0, hardtimeout 0, cookie 0, removenotify 1" 20
  21. 21. 動作結果を解析してみると... OFS PC-A 192.168.0.1 OFC PC-B Secure Channel 192.168.0.2 FlowMod ICMP_Echo Request ICMP (Echo Reply ICMP_Echo Request ICMP (Echo Reply Flowエントリの統計情報が、 カウントアップされていない !! [admin@MikroTik] > openflow flow print stats Flags: I - inactive # SWITCH MATCH BYTES PACKETS DURATION 0 oflow1 inport:1 0 0 4m2s430ms 1 oflow1 inport:2 0 0 21
  22. 22. OpenFlow動作まとめ OpenFlowプロトコルの挙動を、ひととおり確認してみたが、 OpenFlowスイッチ本来のパケット転送が正しく動作しなかった。 まだ実験レベルなので、今後の製品版の出荷に期待したい。 OFC FlowMod SecureChannel を用いたFlowエントリ 書き込み処理は正しく動作した は正しく開設できた Packet-out Flowエントリにマッチしない を用いたパケット送出処理は正 しく動作した 未知パケットのPacket-in 処理は動作しなかった PC-A PC-B Flow テーブル Flowエントリに従った OFS Forwarding 処理は動作しなかった 22
  23. 23. 参考) Buffaloルータの場合 ちなみに、Buffalo WHR-G301Nで、L3ルーティング な挙動をOpenFlowで動作させてみたら、一発OKでした!! OFS PC-A OFC PC-B Secure Channel 192.168.0.1 ARP Request ARP Reply ICMP_Echo Request Flowエントリ に従った転送制御 が行われていた !! ICMP_Echo Request ICMP (Echo Reply 192.168.1.1 Packet-in Packet-out Packet-in Packet-out Drop!! ARP Request ARP Reply FlowMod ICMP_Echo Request ICMP (Echo Reply 23
  24. 24. 参考) Buffaloルータの場合 BusyBox v1.19.3 (2012-03-24 08:32:17 JST) built-in shell (ash) Enter 'help' for a list of built-in commands. ! _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ATTITUDE ADJUSTMENT (bleeding edge, r30406) ---------* 1/4 oz Vodka Pour all ingredients into mixing * 1/4 oz Gin tin with ice, strain into glass. * 1/4 oz Amaretto * 1/4 oz Triple sec * 1/4 oz Peach schnapps * 1/4 oz Sour mix * 1 splash Cranberry juice ----------------------------------------------------root@OpenWrt1:~# dpctl dump-flows unix:/var/run/dp0.sock stats_reply (xid=0x430268b9): flags=none type=1(flow) cookie=0, duration_sec=16s, duration_nsec=17000000s, table_id=1, priority=255, n_packets=16, n_bytes=1568, idle_timeout=0,hard_timeout=0,ip,in_port=1,dl_src=7c:c3:a1:87:8f: 65,dl_dst=00:00:00:00:00:01,nw_dst=192.168.1.1,actions=mod_dl_src: 00:00:00:00:00:02,mod_dl_dst:00:1a:80:0a:9e:d4,output:2 cookie=0, duration_sec=16s, duration_nsec=17000000s, table_id=1, priority=255, n_packets=16, n_bytes=1568, idle_timeout=0,hard_timeout=0,ip,in_port=2,dl_src=00:1a:80:0a: 9e:d4,dl_dst=00:00:00:00:00:02,nw_dst=192.168.0.1,actions=mod_dl_src: 00:00:00:00:00:01,mod_dl_dst:7c:c3:a1:87:8f:65,output:1 root@OpenWrt1:~# Flowエントリ に従った転送制御 が行われている !! OpenFlow化されたBuffalo WHR-G301NでのFlowTable 24

×