2016年6月10日金曜日

[備忘録]Trema & Open vSwitch をOpenFlowを使った実験のためにインストールするためのメモ

これなに?

りとるすです。ご無沙汰してます。OpenFlowのテスト環境のメモが発掘されてきたので、いろいろあったことだしメモしておきます。現在もこれで動くのかどうかは確認してませんが、たぶんバージョンが同じなら大丈夫なんじゃないですかね(適当)

作成する環境


  • Virtualbox
  • Ubuntu Server 14.04 LTS
  • Trema 0.4.7
  • Ruby 2.0.0-p643( with RVM )
  • Open vSwitch 2.0.2



TremaRubyのバージョンについて

ドキュメント量と、Trema側のソースコードが素直(ただしruby.h+C)なのでどうにかなりやすい
Rubyのバージョンは2.0.0-p647が、新しいモノの中でも一番安定して動くらしいため。
また、0.4.7は書籍のコードがまるっとそのまま使える最終版。それ以降はフォルダ構成が変わってるなどが原因でうまく動かない。ちなみに、Google検索に引っかかる一番新しいバージョンの情報は0.6.0。インストールのことだけ。
なお、Open vSwitchVirtual networkingのときも必要(になることがある。)なので、とりあえず同じやつに入れておくことをおすすめする。

Ubuntu Server 14.04VBoxAdditionのインストール

スペースを使ってSSH Serverだけ入るようにしてinstall
ネットワークアダプタの1つをNATにしておき、ポートフォワーディングでお好みのポートに「22(ssh)」を飛ばす
初期は思いっきり文字化けするので、ロケール情報を.bashrcに書いておく。
----
case $TERM in
     linux)LANG=C ;;
     *)LANG=ja_JP.UTF-8 ;;
esac
----

$ sudo apt-get install build-essential module-assistant

$ sudo apt-get install xserver-xorg xserver-xorg-core

ここで、CDドライブにGuest AdditionのディスクをGUI操作で挿入。
その後にマウント。
$ sudo mount /dev/cdrom /mnt

/mntに、VBoxAddition的なフォルダができるので、そのフォルダのlinuxと書かれたスクリプトを実行。
モジュールのコンパイルが始まる。

終了後、仮想マシンを再起動。
これで共有フォルダが使える。

rootはともかく、メインユーザーがマウントしたフォルダにアクセスできないから
$ sudo gpasswd -a takahiro vboxsf
として、権限をメインユーザーに与えておく。

Ruby(RVM)のインストール


$ curl -L https://get.rvm.io | bash -s stable

エラー出て死ぬので、gpgから始まるエラーではかれたコマンドを実行後、再度実行。このときSSHでないと死ぬほど面倒。
SSH設定しないなら、リダイレクトなどで取り出し。

.bashrcに追記。
-----
source $HOME/.rvm/scripts/rvm
-----
その後、
 source ~/.bashrc
で再読込。

$ rvm requirements
すると、必要なモノを勝手にapt-getしてくれる。勝手にsudoする。

$ rvm list known
すると、インストールできるrubyが一覧で出てくる。
2.0.0-p647あることが確認できるので、確認してから、

$ rvm install 2.0.0-p643

すると、rubyが勝手にコンパイル始まって、インストールできる。
もちろんパスも前述のsourceさえ設定していれば勝手に通る。

Trema 0.4.7のインストール


 必要なパッケージをapt-get
$ sudo apt-get install gcc make libpcap-dev libsqlite3-dev git libssl-dev pkg-config glib-2.0
バージョン指定のgemsであっさり入ってしまう。
$ gem install trema -v 0.4.7

以上。
trema内蔵の仮想ネットワークもこの時点で使用できるようになる。


仮想環境上にOpenvswitchを設定

 OpenvSwitch自体は実際あっさり入ってしまう。
$ apt-get install openvswitch-switch
 Ubuntu 14.04であれば、勝手に2.0.1が入る。

今回の環境でのネットワークの接続は次の通り。Virtualbox側で設定。
 advexp_vnet_sw (OpenvswitchTremaが動くマシン)
NIC1:NAT(SSH操作用)
NIC2:Host-only adapter(ホスト-ゲストマシン間)
NIC3:内部ネットワーク[internalA]
NIC4:内部ネットワーク[internalB]

 advexp_vnet_srv (コンテンツを置いているサーバ)
NIC1:NAT(SSH操作用)
NIC2:内部ネットワーク[internalA]

内部ネットワークと名前はついているが、トンネル的な使い方をする。同じ名前をつけた内部ネットワークでマシン同士をつないであげればよい。つまり、マシンを増やすときはinternalBを設定してつないであげれば良い。

両方のマシンとも、
$ sudo vi /etc/network/interfaces
で、NICを認識させる設定を書く。(Ubuntuは自動でNIC認識しない)
とりあえずサーバ(advexp-vnet-srv)に設定していく。

@advexp-vnet-srv
-----
(追記する)
 auto eth1
 iface eth0 inet static
 address 192.168.56.11
 network 192.168.56.0
 netmask 255.255.255.0
-----

設定し終えたら、
$ sudo /etc/init.d/networking restart
するか、
$ sudo shutdown -r now
で再起動。

$ ifconfig -a
で、NICの状態を確認可能。GUIで設定されているMACアドレスと対応がとれてるか確認しておしまい。

ハマるポイント

もし、host-only networkを使いたいときに、gatewayを書いてしまうとうまく動かない可能性がubuntu debianでは非常に多い。CentOSは大丈夫らしい。
また、後述のIPアドレスの範囲もhost-only networkを含む場合は要注意。

Host-only networkが動かないとき

Kaspersky Internet Securityが動いている時も動かない。
この手順をやってからVirtualboxを再インストールするとうまくいった。

OpenVswitchにポートを設定

openvswitchにポートなどを設定する。
/etc/network/interfacesにも設定値を書いておく。
ただし、設定値が反映されないので、ポートの追加は別途行う。IPアドレスは振ってしまうとわけがわからなくなる上、動作しなくなる。

@advexp_vnet_sw
----
(追記)
allow-ovs br0
iface br0 inet manual
ovs_type OVSBridge
ovs_ports eth1 eth2 eth3

allow-br0 eth1
iface eth1 inet manual
ovs_bridge br0
ovd_type OVSPort

allow-br0 eth2
iface eth2 inet manual
ovs_bridge br0
ovd_type OVSPort

allow-br0 eth3
iface eth3 inet manual
ovs_bridge br0
ovd_type OVSPort
----
これは、Virtualboxで設定したNIC14に、eth0eth3という名前が振られているから。
基本的にLinuxのネットワークは0 origin記述。

追記後、networkingを再起動。
再起動して、(マシン自体の方が望ましい)
$ sudo ovs-vsctl show
したときに、eth1-eth3までが見えない場合はうまく動かないので、
$ sudo ovs-vsctl add-port br0 eth1
$ sudo ovs-vsctl add-port br0 eth2
$ sudo ovs-vsctl add-port br0 eth3
して、再度確認を行う。
$ sudo ovs-vsctl show
すると、追加されたポートとブリッジが見れる。
controllerのところにis_connectedとあれば接続ができている。

また、
$ sudo ovs-ofctl show br0
とするとそれぞれのNICの稼働状況が見れる。
DOWN_LINKは動いていないので、
$ sudo ifup ethx
などして起こす。
(なお、/etc/network/interfacesbr0のポートについての記述がある場合は、sudo ifup br0としてもリンクアップできる)

 tremaは推奨ポートではなくTCP:6653で動作するので、それについて設定を追加。
$ sudo ovs-vsctl set-controller br0

:127.0.0.1:6653
ちなみに、tremaが起動してopenvswitchとの疎通がとれているかどうかは、sudo ovs-vsctl showでコントローラーの設定値としてis_connectedが出ればOK。少々反映に時間がかかる。30秒くらい。
$ trema run xxxxxx.rb
ただし、tremaでコンソールが一つつぶれるので、SSHなどをしてバックで動かせるように工夫するべき。
リアルタイムログがとれるので、末尾に&で別起動するのはあまり得策ではない。

 tremaを起動して、別端末にて、
$ sudo ovs-ofctl show br0
を実行すると、フローエントリの一覧が見える。


自動化したほうがいいけどやってないこと

NICの自動起動
UbuntuなどのDebianの場合は、結構NICの自動起動に失敗するとのこと。
このことから、基本動作前にNICifupしなければならない手間があるので、省けるなら省くべき。
海外では、/etc/network/interfacesの中身を読み込んでNICをひたすらifupするだけのスクリプトがあるらしい。

ハマるポイント

Host-only adapterを持つネットワークで設定できるIPの範囲
192.168.56.1host-only adapterなら、192.168.56.2~99までが無難。それ以上だと、サブネットマスクに収まっていても危ない。
また、スイッチのポートとなるNICIPアドレスを絶対に振らないこと。

下はPORT_DOWNしている構成。この状態では動かないので、eth0-eth3まで sudo ifup ethxしないといけない。
/etc/network/interfaceに何か書けばなんとかなるらしい?)


ちなみに

Controllerconnectedすると、設定されているflow-tableはすべてリセット。disconnectしただけではリセットされない模様。

OpenVswitchがなんかおかしいなと思ったら

/var/log/openvswichの中身を眺める
/var/run/openvswitchの中身のpidkillしまくってから、
$ /etc/init.d/openvswitch-switch stop
$ /etc/init.d/openvsiwtch-switch start

これで解決しなければ、明らかにシステムおかしいのでOSから入れ直した方が話が早い。

0 件のコメント:

コメントを投稿