2012幎9æã幞éãªããšã«ã
ã³ã³ãã¥ãŒã¿ãããã¯ãŒã¯ã®å¿çšç 究ã»ã³ã¿ãŒã®ãœãããŠã§ã¢æ§æãããã¯ãŒã¯ã«é¢ãã
ç§ã®åŠæ ¡ã«åå ããŸããã SDNãããã¯ãŒã¯ãç¹ã«OpenFlowã®åµèšè
ããã³ã€ããªãã®ãŒã®ã€ã³ã¹ãã€ã¢ã®1人ã§ããNick McKeonãäž»èŠãªãã®ã«æåŸ
ãããŸããã
æ©åšã«é¢ããã¯ãŒã¯ã·ã§ããã®åºç€ã¯ããã·ã¢ã®æªç¥ã®ã¢ãã«ã®ãªãã©ãã·ã¥NECã¹ã€ãããšãããããé©çšãããOpenWrtãåããããã€ãã®éåžžã®tp-link 1043ã«ãŒã¿ãŒïŒå®éã«ã¯åæ§ç¯ãããïŒã§ããã èªå®
ã§ãåæ§ã®ã¢ãã«ã®ã«ãŒã¿ãŒãçºèŠãããã®ã§ãå®äžçã§å®éã«OpenFlowãè©ŠããŠã¿ãããšã«ããŸããã ããããæåã«ç§ã®åŠæ ¡èªäœã«ã€ããŠã
2ã€ã³ã¹ãã¬ãŒã·ã§ã³ãšçè«
è¬çŸ©ã¯ãOpenFlowãããžã§ã¯ãã®ã¹ã¿ã³ãã©ãŒãã®ãµã€ãã§å©çšå¯èœãªåããã¬ãŒã³ããŒã·ã§ã³ã®åçããå§ãŸããŸããã ãã ããNickã«ãã£ãŠè¿œå ãããã»ãã³ãã£ãã¯ããŒãã¯ãåçŽãªãã¬ãŒã³ããŒã·ã§ã³ã°ã©ãã£ãã¯ã¹ãå®è³ªçã«æ確ã«ããè£è¶³ããŸããã ãã®åŸãããã¯ã¯æ°ãããããžã§ã¯ããç¹ã«SDNã®èªåæ€èšŒãè«çããããžå
ã®ãªã³ã°ã®æ€çŽ¢ãã«ãŒã«ã®é©çšæ§ã®ç¢ºèªãªã©ã«ã€ããŠè©±ããŸããã
è¬çŸ©äžã«å®æçã«äŒæ©ãçºçããåŠçãšå€§åŠé¢çãããã¯ã«è³ªåãæããããŸããã ããã¯ã¯ãé¢é£ããåé¡ã«è§Šããããã«åŸ¹åºçãã€åºç¯å²ã«çããããšã奜ããªã®ã§ãããã¯ãå€ãã®è³ªåãããããšã¯å°é£ã§ããã è¬çŸ©ã®æåŸã«ãè¬çŸ©äžããã³è¬çŸ©äžã«çããç·æ¥ã®è³ªåã«å¯ŸããåçãåŸãããšãè©Šã¿ãŸããã ç¹ã«èå³æ·±ãã®ã¯ãã©ããããããæã£ãäžäººããŽã«ãã«ãŒãã§ã¹ã¿ã³ãã©ãŒã倧åŠã®ãã£ã³ãã¹ãèµ°ãåãããŠã§ãã«ã¡ã©ãããããªããããŒããã£ã¹ããããšãããã¯ã€ã€ã¬ã¹ãããŒããã£ã¹ããšã¢ã¯ã»ã¹ãã€ã³ãã®äžŠåèšå®ã䜿ã£ããããªã®ãããŒããã£ã¹ããæå°éã«æãã
å®éšã§ãã Nickã¯ãOpenFlowãšå¯Ÿè©±ããããã®èªå·±èšè¿°åã¢ããªã±ãŒã·ã§ã³ïŒçŸåšã¯
ããã±ãŒãžãšããŠå
¥æå¯èœïŒãåããOpenWRTãã£ã¹ããªãã¥ãŒã·ã§ã³ãã¢ã¯ã»ã¹ãã€ã³ãã§ãã©ãã·ã¥ããããšèª¬æããŸããã
ããã§ããã®å®éšãç¬èªã«å®è£
ããããšããã¢ã€ãã¢ãçãŸããŸããã
3æåã®ç·Žç¿
åŠæ ¡ã®2æ¥ç®ã ä»®æ³ãã¹ãäžã®ããããžã·ãã¥ã¬ãŒã¿ãŒã§ããMininetä»®æ³ç°å¢ïŒ
OpenFlowãã¥ãŒããªã¢ã« ïŒãè©ŠããŸããã å€éšOpenFlowã³ã³ãããŒã©ãŒãä»®æ³ãããã¯ãŒã¯ã«æ¥ç¶ãããŠããŸãã ãããæ¬åœã®æ¥œãã¿ã®å§ãŸãã§ãã
POXã³ã³ãããŒã©ãŒã¯pythonã§æžãããŠãããå€ãã®äººã«ãšã£ãŠæ¢ã«å€§ããªåé¡ã«ãªã£ãŠããŸãã ãŸããç§ã¯pythonãšã€ã³ã¿ãŒãããã«é¢ããæ¬ãæã£ãŠããŸããïŒä»¥åã¯äœãæžããŠããŸããã§ãããphpãperlãcppãcïŒãªã©ã ãã§ãïŒã æãèå³æ·±ãã®ã¯ãç«ãPOXã³ã³ãããŒã©ãŒã«é¢ããããã¥ã¡ã³ããæ±ããŠå«ãã ããšã§ããããã«å°ãªãäŸããããŸãã POXãªããžã§ã¯ãã¢ãã«ã¯ãåŠçã空ãæéã«äœæãããã®ã§ãã ããšãã°ãsrc-MACã¢ãã¬ã¹ã¯
packet.in.dl_srcãªããžã§ã¯ãã®ããããã£ã«ãããããèªäœã¯
event.parseã¡ãœããã®çµæã§ãããsrc-IPã¢ãã¬ã¹ãååŸããã«ã¯ããããã³ã«ã®ãã±ããã¿ã€ããã²ã©ãæ¹æ³ã§ãã§ãã¯ããå¿
èŠããããŸãïŒã¿ã€ããã§ãã¯ã®æãšããã€ãã®ããããã£å·Šã®ãªããžã§ã¯ãïŒã次ã®ããããŒïŒ
ip_hdr = packet_in.next ïŒã«ãã±ããã
åå²ã ããããã
ip_hdr.nw_srcïŒnetwork_ layer srcïŒãªããžã§ã¯ããååŸããŸãã ã芧ã®ãšãããPOXãšã¢ããªã±ãŒã·ã§ã³ã®çžäºäœçšã®ãªããžã§ã¯ãã¢ãã«ã¯ããããã¯ãŒã¯æ
åœè
ã§ã¯ãªããçŽç²ãªããã°ã©ããŒã«ãã£ãŠäœæãããŸããã ã¡ãœããããããã³ã«ããªããžã§ã¯ãã®ããããã£ã®ååã«çµ±äžæ§ã¯ãããŸããããªããžã§ã¯ããŸãã¯ããããã£ã®ååãçªç¶ééããå ŽåãPythonèšèªã¯ãŸã£ããç¡é¢å¿ã§ããæ°ããèšèªãäœæã§ããŸãã
ããã«ãã£ãšã ãã®ããã¥ã¡ã³ãã¯æããã«éçºçãªæ§è³ªã®ãã®ã§ãããæçµçšéãæå³ãããã®ã§ã¯ãããŸããã åäžã®ããã¥ã¢ã«ãããŠããªãããŸãã£ãåŸãç®çã®ããããã£ãšäŸã«ã€ããŠPOXãœãŒã¹ãã¡ã€ã«ãæãäžãããšãã«ãæ£ãã決å®ãèŠã€ãããŸããã å
¬å¹³ã«èšãã°ããã£ãã«ã€ãŒãµãããã¬ãã«ã®æäœãšåºæ¬çãªOpenFlowã«ãŒã«ã®ã¹ã€ãããžã®éä¿¡ã«ã€ããŠãããã¥ã¢ã«ã«ããªã蚱容ã§ããäŸãããããšã«æ³šç®ãã䟡å€ããããŸãã ã¡ãªã¿ã«ãäœæ¥äžïŒçŽ5æéïŒã«ãPOXã¯2åãããããèœã¡ãŸããã ããã¯ãPythonã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ã«é¢ãã質åã§ãã 圌ã®NOX芪ïŒC ++ã§èšè¿°ïŒããã¹ããããšããããã¯èŠ³å¯ãããŸããã§ããã
å°ããªäŸã ãã£ãã«ã¹ã€ããã³ã°ã«ãŒã«ãèšå®ããããã®ã³ãŒãïŒã€ãŒãµãããã¹ã€ããã§ã¯å®éã«ã§ããªãïŒã¯ã次ã®ããã«ãªããŸãã
fm = of.ofp_flow_mod() fm.match.in_port = 3 // . fm.actions.append(of.ofp_action_output(port = 4)) // , match
ããã§ã¯æ確ã«èšè¿°ãããŠããŸã-ããŒã3ã«èœã¡ããã®ã¯ãã¹ãŠ4çªç®ã«ãªããŸãã ãªãã·ã§ã³ãªãã
å®éããã®ãã¥ãŒããªã¢ã«ã¯SDNãšãã®åäœãç解ããäžã§æã圹ç«ã¡ãŸãã æ®å¿µãªãããªãã£ã¹ã§ã ãã¥ãŒããªã¢ã«ãµã€ãã«ã¯æ®µéçãªäŸã¯ãããŸããããããã¯åŠæ ¡ã®ã¹ããŒã«ãŒã«ãã£ãŠããŸãçºå£°ãããçºæãããŸããã ãããããªããã°ã人ã
ã®ååã¯åã«ãããã©ã®ããã«æ©èœããã®ãç解ããŠããªãããã§ãã
4æ©åš
3æ¥ç®ã¯æ¬ç©ã®éã«æ§ããããŸããã 1ã€ã®Nec ProgrammableFlowã¹ã€ããã¯è€æ°ã®VLANã«åå²ããããã®ãã¡4ã€ã¯OpenFlowã®å¶åŸ¡äžã«ããã4ã€ã®TP-Link 1043ã«ãŒã¿ãŒã¯ãOpenWRTã®äžã§OpenFlowããããé©çšããŠãã©ãã·ã¥ãããã³ã³ãããŒã©ãŒãåããä»®æ³ãã¹ãã16ã®ä»®æ³ãã¹ããããããã¯ãŒã¯ãçµã¿ç«ãŠãããŸããã ãã¹ãŠã®ãã¹ãã«ã¯2ã€ã®ãããã¯ãŒã¯ããããŸããã1ã€ã¯ç§ãã¡ïŒsshã®å Žåã¯å€éšãããã¯ãŒã¯ïŒã管çãããã1ã€ã¯openflowãã¹ããããã¯ãŒã¯çšã§ãã 誰ãã4ã€ã®ã°ã«ãŒãã«åããããããããžã¯æ¬¡ã®ãšããã§ãããåã°ã«ãŒãã§ã¯ã3ã€ã®ãã¹ããç®çã®VLANã®ã¹ã€ããã«æ¥ç¶ããã4çªç®ã¯æç·ããŒããžã®ã«ãŒã¿ãŒã«æ¥ç¶ãããŠããŸãïŒãšããã§ãç¡ç·ããŒãã¯ã³ã³ãããŒã©ãŒãšæç·ã®èŠ³ç¹ããèŠãŠããŸãïŒã
詳现ãªããããžïŒããŒãçªå·ãªã©ãé€ãïŒïŒ

ããã€ãã®ã¿ã¹ã¯ããããŸããã
- ç®çã®ããŒãïŒ6633ïŒããã³ã€ã³ã¿ãŒãã§ã€ã¹ã§ããã©ã«ãã¢ããªã±ãŒã·ã§ã³ïŒL2_learningïŒã䜿çšããŠPOXã³ã³ãããŒã©ãŒãäžããŸãã åé¡ã¯ãããŸããã§ããã
root@openflowtutorial:/home/openflow/pox
ç¢æ
INFO:openflow.of_01:[Con 1/1] Connected to 00-00-00-00-00-01
ã³ã³ãããŒã©ãŒã®æ¥ç¶ãæåããããšã瀺ããŸãã
- ãã¹ããå®è¡ããŸãïŒãã¢ã¯ã€ãºpingïŒã æ®å¿µãªãããiperfã¯ã€ã³ã¹ããŒã«ãããŠããªããããããã©ãŒãã³ã¹ã®ãã¹ãã«å€±æããŸããã pingã¯äºæ³ã©ããã«åäœããŸãã-ãã¬ãŒãã³ã°äžãéåžžã¢ãŒã0.1ã10 msã§çŽ100ã200ããªç§ïŒçµå±ãä»®æ³ãã·ã³ã§çºçããŸããïŒã
- FlowVisorãããã¯ãŒã¯ä»®æ³åã·ã¹ãã ãäžããŠãç©çãããã¯ãŒã¯ããOpenFlowã€ã³ã¹ã¿ã³ã¹ãæœè±¡åããŸãã æåã誰ãããããã©ã®ããã«æ©èœããããç解ããããšããŸããã FlowVisorã¯åæ¹åç䌌NATãµãŒããŒïŒã¢ãã¬ã¹ã¹ããŒãã£ã³ã°ãµãŒããŒïŒã§ãããã¹ã€ããã®èŠ³ç¹ããã¯æ¬æ Œçãªã³ã³ãããŒã©ãŒã§ãããã³ã³ãããŒã©ãŒã®èŠ³ç¹ããã¯ã¹ã€ããã§ãã FlowVisorã«ã¯ããã€ãã®ã¹ã€ãããæ¥ç¶ãããŠããŸãã ãã£ã«ã¿ãªã³ã°ã·ã¹ãã ããããã¹ã€ããããã®ãã±ããã¯ç®¡çè
ãèšå®ããã³ã³ãããŒã©ã«ã®ã¿éãããŸãã FlowVisorããããŒããŸãã¯ã¹ã€ããå
šäœããããã¯ããŠã代æ¿ã®è«çãããã¯ãŒã¯æ§é ãæ§ç¯ã§ããŸãã
åããŒã ã¯ããŒã6633ã§FlowVizorãäžãããããã¯ãŒã¯å
šäœã4ã€ã®ã»ã°ã¡ã³ãã«åå²ãããã®ã»ã°ã¡ã³ããšé£æ¥ã³ã³ãããŒã©ãŒãžã®ãªã³ã¯ãèšå®ããŸããã ã³ã³ãããŒã©ã¯å¥ã®ããŒãïŒ6634ïŒã§èµ·åãããã¹ãŠã®ã¹ã€ãããããŒã«ã«ãã¹ãïŒnatilisïŒãšããŠèªèããŸããã

FlowVisorã¯å¥ã®æ²ã§ãã ãã®è€åäœã®ãœãããŠã§ã¢å®è£
ã¯ãc ++ãpythonãjavaã®å°çã®æ··åç©ã§è¡ãããjavaã¯æ§æã«äœ¿çšãããŸãã ã³ãã³ããå
¥åããŸã-java-machineå
šäœãç«ã¡äžãããæ§æãè¡ãããããã ãã§ã-javaã¯å¿
èŠãªããªããŸããã 1ã€ã®ã³ãã³ãã2ç§å®è¡ãããŸãã ããããå€ãã®ã³ãã³ãããããåã³ãã³ãã«ã¯ãã¹ã¯ãŒããå
¥åãããããã¹ã¯ãŒãïŒã¯ãªã¢ããã¹ãïŒã§ãã¡ã€ã«ãæå®ããå¿
èŠããããŸãã ãŸããã¹ã©ã€ã¹ãäœæããå¿
èŠããããŸããããã¯ãç¹å®ã®ã³ã³ãããŒã©ãŒã«å²ãåœãŠããããããã¯ãŒã¯ã®è«ççã«åé¢ãããéšåã§ãã 次ã«ãåã¹ã©ã€ã¹ã§ãã¹ã©ã€ã¹ã«å«ãŸãããã®ãšå«ãŸããªããã®ã«ãã£ã«ã¿ãŒã«ãŒã«ãè¿œå ããå¿
èŠããããŸãã ãã¹ãŠã®æªåé¡ã®ãã©ãã£ãã¯ã移åããããã©ã«ãã®ã¹ã©ã€ã¹ã1ã€äœæã§ããŸãã
5家ã§ãã
Tplink 741ãèŠã€ãããŸããOpenWrtãµã€ãã調ã¹ããšããOpenWrtãç§ã®ãªããžã§ã³ïŒv2.1ïŒã«ã€ã³ã¹ããŒã«ãããŠããªãããšãå€æããŸããã ãã ãããã©ãŒã ã¯æ©èœãããšèšãããŠããŸãã Ubuntuãä»®æ³ãã·ã³ãšã©ã€ãã©ãªã«é
眮ãïŒopenwrt Webãµã€ããåç
§ïŒããœãŒã¹ã³ãŒãã泚ããŸã
svn co svn://svn.openwrt.org/openwrt/branches/backfire
次ã«ãOpenFlowæ©èœãããã±ãŒãžãšããŠåå¥ã«å
¥åããŸãã å°ããªäœè«-åºæ¬ããŒãžã§ã³ãWebãªãã§ã³ã³ãã€ã«ããã«ã¯6 GBããã£ãã®ã§ã泚æããŠãã ããã
cd backfire/package git clone git://gitosis.stanford.edu/openflow-openwrt
ãããŠãæãéèŠãªããšã¯ãã¢ãŒããã¯ãã£ã«é©ãããã©ã³ããéžæããããšã§ãã ç§ã®tplinkã¯Atheros 71xxã§ã
cd openflow-openwrt git checkout -b openflow-1.0/ar71 origin/openflow-1.0/tplink
ãã®åŸãopenwrtããŒããã£ãŒããæŽæ°ããããšã匷ããå§ãããŸãã backfireãã£ã¬ã¯ããªã«ç§»åãã
./scripts/feeds update -a ./scripts/feeds install -a make menuconfig
ã¡ãã¥ãŒã§ãAtheros AR71xxãTP-Link WR741ND v1ïŒå€æãããšãããv1ãåäœããïŒãéžæããããã±ãŒãžã§kmod-tunïŒã«ãŒãã«ã¢ãžã¥ãŒã«->ãããã¯ãŒã¯ãµããŒãïŒãtcããã³OpenFlowïŒãããã¯ãŒã¯ïŒãéžæããŸãã ä¿åããŠçµäºããŸãã

åŸã§å€æããããã«ãQoS HTBãã«ãŒãã«ã«è¿œå ããå¿
èŠããããŸããããããªããšããã¹ãŠãéåžžã«é
ããªããŸãã
make kernel_menuconfig
éå±€ããŒã¯ã³ãã±ããïŒHTBïŒãæå¹ã«ããŸãïŒãããã¯ãŒã¯ãµããŒã->ãããã¯ãŒã¯ãªãã·ã§ã³-> QoSããã³/ãŸãã¯å
¬å¹³ãã¥ãŒã€ã³ã°ïŒ
ã¢ã»ã³ããªã¯éåžžã®makeã§è¡ãããçŽ1æéãš6 GBã®ã¹ããŒã¹ãå¿
èŠã§ããã
bin / ar71xxãã©ã«ããŒã«ã¯ãç¹ã«ãã¡ã€ã«
openwrt-ar71xx-tl-wr741nd-v1-squashfs-sysupgrade.binããã
ãŸã ïŒ-factory.binããããŸããããã¯åæopenwrtãã¡ãŒã ãŠã§ã¢çšã§ãïŒ
ããã€ã¹ãžã®å
¥åã¯ããã§ã«ãã©ãã·ã¥ãããopenwrtïŒv1ãªã©ïŒããscpïŒssh cpïŒã䜿çšããŠè¡ãã®ãæé©ã§ãã OpenWrtã§sshãå®è¡ãã
scp root@ip_:/__/openwrt-ar71xx-tl-wr741nd-v1-squashfs-sysupgrade.bin /tmp sysupgrade -v /tmp/openwrt-ar71xx-tl-wr741nd-v1-squashfs-sysupgrade.bin
å¥åŠãªããšã«ããã¹ãŠãåããŠæ©èœããŸããã
ps aux | grep ofprotocol 976 root 1040 S ofprotocol tcp:127.0.0.1:6634 tcp:192.168.1.10:6633
OpenFlowèªäœã®ã»ããã¢ããã«ã¯å°ãæéãããããŸã
cd /etc/config vi openflow config 'ofswitch' option 'dp' 'dp0' option 'ofports' 'eth0.0 eth0.1 eth0.2 eth0.3 ' option 'ofctl' 'tcp:192.168.1.102:6633' option 'mode' 'outband'
ãããã¯ãŒã¯ã³ã³ãããŒã©ãŒãèµ·åããŸãïŒPOXãæãåçŽãªãã®ãšããŠäœ¿çšããŸããïŒ-
root@openflowtutorial:/home/openflow/pox
ãã¹ãŠãæ¥ç¶ãããŠããã®ã§ã䜿çšã§ããŸãã æ°ã«ãªã£ãã®ã¯ããœã±ãããšã©ãŒïŒBroken pipeã ãã§ããã ã³ã³ãããŒã©ãŒã¯å®æçã«è±èœãå§ããŸããïŒãã®ãã圌ãšPOXïŒã
æçš¿ã®äœææã«äœ¿çšããããã®
- å¿çšã³ã³ãã¥ãŒã¿ãŒãããã¯ãŒã¯ç 究ã»ã³ã¿ãŒ -PKSã¹ã¯ãŒã«èªäœ
- OpenFlowãµã€ã-Wikiãšãã¥ãŒããªã¢ã«ã®äž¡æ¹ããããŸã
- Wiki openwrt-ãããªãã«ã¯æ¹æ³ã¯ãããŸãã