概要
OpenFlowの勉強用にTremaの環境を構築する。
環境
- OS : osx multipass上で動作するUbuntu 16.04
- Ruby 2.3
- OpenVSwich 2.5.9
手順
(1) Ubutnu16.04を起動する。
$ multipass launch -n openflow 16.04
$ multipass shell openflow
Ubuntu 16.04を指定するのがポイント。
デフォルトだとUbuntu18.04が起動する。Ubuntu18.04だとopensslのバージョンが1.1以上となり、Ruby2.3と互換性がなく環境構築にハマる。。
(2) Rubyをインストール
$ 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]
(3) Bundlerをインストール
sudo gem install bundler -v 1.11.2
(4) OpenVswitchをインストール
$ 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
(5) サンプルの動作確認
$ 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!
(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)
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
参考