OpenFlow@Treamの環境構築

## 概要
OpenFlowの勉強用にTremaの環境を構築する。

## 環境
* OS : osx multipass上で動作するUbuntu 16.04
* Ruby 2.3
* OpenVSwich 2.5.9

## 手順
(1) Ubutnu16.04を起動する。
<pre>$ multipass launch -n openflow 16.04
$ multipass shell openflow
</pre>

Ubuntu 16.04を指定するのがポイント。
デフォルトだとUbuntu18.04が起動する。Ubuntu18.04だとopensslのバージョンが1.1以上となり、Ruby2.3と互換性がなく環境構築にハマる。。

(2) Rubyをインストール
<pre>$ sudo apt-get update
$ sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev  libffi-dev
$ tar -xzvf ruby-2.3.1.tar.gz
$ cd ruby-2.3.1/ 
$ ./configure 
$ mak
$ sudo make install
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]</pre>

(3) Bundlerをインストール
<pre>sudo gem install bundler -v 1.11.2</pre>

(4) OpenVswitchをインストール
<pre>$ sudo apt-get install -y openvswitch-switch
$ sudo service openvswitch-switch start
$ ovs-vswitchd --version
ovs-vswitchd (Open vSwitch) 2.5.9
Compiled Jan 28 2021 19:49:45
</pre>

(5) サンプルの動作確認
<pre>$ git clone https://github.com/trema/hello_trema
$ cd hello_trema
$ bundle _1.11.2_ install --binstubs
$ ./bin/trema run lib/hello_trema.rb -c trema.conf[sudo] password for ubuntu: 
Trema started.
Hello 0xabc!
</pre>

(6) パケット確認
(5)実施時のパケットをキャプチャ。
ループバックアドレスのコントローラ（ポート6653）とスイッチ（ポート50444）間でOpenflowのパケットが送受信していることが確認できる。

コントローラ（ポート6653）→ Hello →　スイッチ（ポート50444）
コントローラ（ポート6653）← Hello ←　スイッチ（ポート50444）
コントローラ（ポート6653）→ ECHO Request →　スイッチ（ポート50444）
コントローラ（ポート6653）← ECHO Response ←　スイッチ（ポート50444）
コントローラ（ポート6653）→ Feature Request →　スイッチ（ポート50444）
コントローラ（ポート6653）← Feature Response ←　スイッチ（ポート50444）

<pre> 15 3.258849   127.0.0.1  127.0.0.1 TCP  76 50442 → 6653 [SYN] Seq=0 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=22881 TSecr=0 WS=128
 16 3.258855   127.0.0.1 127.0.0.1 TCP  56 6653 → 50442 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
 21 3.780455   127.0.0.1 127.0.0.1 TCP  76 50444 → 6653 [SYN] Seq=0 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=23013 TSecr=0 WS=128
 22 3.780471   127.0.0.1 127.0.0.1 TCP  76 6653 → 50444 [SYN, ACK] Seq=0 Ack=1 Win=43690 Len=0 MSS=65495 SACK_PERM=1 TSval=23013 TSecr=23013 WS=128
 23 3.780483   127.0.0.1 127.0.0.1 TCP  68 50444 → 6653 [ACK] Seq=1 Ack=1 Win=43776 Len=0 TSval=23013 TSecr=23013
 24 3.780517   127.0.0.1 127.0.0.1 OpenFlow 76 Type: OFPT_HELLO
 25 3.780522   127.0.0.1 127.0.0.1 TCP  68 6653 → 50444 [ACK] Seq=1 Ack=9 Win=43776 Len=0 TSval=23013 TSecr=23013
 26 3.782109   127.0.0.1 127.0.0.1 OpenFlow 76 Type: OFPT_HELLO
 27 3.782121   127.0.0.1 127.0.0.1 TCP  68 50444 → 6653 [ACK] Seq=9 Ack=9 Win=43776 Len=0 TSval=23013 TSecr=23013
 28 3.784120   127.0.0.1 127.0.0.1 OpenFlow 76 Type: OFPT_ECHO_REQUEST
 29 3.784127   127.0.0.1 127.0.0.1 TCP  68 50444 → 6653 [ACK] Seq=9 Ack=17 Win=43776 Len=0 TSval=23013 TSecr=23013
 30 3.784171   127.0.0.1 127.0.0.1 OpenFlow 76 Type: OFPT_ECHO_REPLY
 31 3.785372   127.0.0.1 127.0.0.1 OpenFlow 76 Type: OFPT_FEATURES_REQUEST
 32 3.785542   127.0.0.1 127.0.0.1 OpenFlow 148Type: OFPT_FEATURES_REPLY
 37 3.822649   127.0.0.1 127.0.0.1 TCP  68 6653 → 50444 [ACK] Seq=25 Ack=97 Win=43776 Len=0 TSval=23023 TSecr=23013
 50 8.790217   127.0.0.1 127.0.0.1 OpenFlow 76 Type: OFPT_ECHO_REQUEST
 51 8.790255   127.0.0.1 127.0.0.1 TCP  68 6653 → 50444 [ACK] Seq=25 Ack=105 Win=43776 Len=0 TSval=24265 TSecr=24265
 52 8.793534   127.0.0.1 127.0.0.1 OpenFlow 76 Type: OFPT_ECHO_REPLY
 53 8.839841   127.0.0.1 127.0.0.1 TCP  68 50444 → 6653 [ACK] Seq=105 Ack=33 Win=43776 Len=0 TSval=24278 TSecr=24266
 58 11.547035  127.0.0.1 127.0.0.1 TCP  68 50444 → 6653 [FIN, ACK] Seq=105 Ack=33 Win=43776 Len=0 TSval=24954 TSecr=24266
 59 11.558029  127.0.0.1 127.0.0.1 TCP  68 6653 → 50444 [FIN, ACK] Seq=33 Ack=106 Win=43776 Len=0 TSval=24957 TSecr=24954
 60 11.558043  127.0.0.1 127.0.0.1 TCP  68 50444 → 6653 [ACK] Seq=106 Ack=34 Win=43776 Len=0 TSval=24957 TSecr=24957
</pre>

## 参考
https://qiita.com/shin-ch13/items/2e270a3a46b6a785d2ab