2011年10月9日日曜日

openflow tutorial

openflow tutorial(英語)

やっている人がいた

英語のやつそのままやってみよう。


Set up Virtual Machine

Virtualマシンをインストールして、
ホストマシンのターミナルから接続するまで。

① 以下をDLする。
・VirtualBox VM image (viretualBoxでできるじゃん!)
・Virtualization software (午前中に入れました)
・X Server Xming (vnc viewer的な?)
・Terminal Putty (ポデロサじゃダメなのかな?)

② ソフトのインストール
・xming
これ入れたら、Puttyも一緒に入ったっぽい。
xmingの使い方
使ってみた。これ、ポデロサだけで十分じゃん。

③ VMのインストール
isoファイルからLinuxをインストールしたら、以下のフォルダに入る。
C:\Documents and Settings\karino\VirtualBox VMs\OpenFlowTutorial
単純にここにコピーしたが、「オープンに失敗しました」的なエラーが出た。
vdiはvirtualboxのコマンドでコピーしないといけないらしい
C:\Program Files\Oracle\VirtualBox\VBoxManage clonehd [コピー元の.vmdk] [コピー先の.vmdk]
まったく。
そして長い。

④ NICの設定
ネットワークのアダプタ2を
ホストオンリーアダプタとして有効化。

⑤ VM起動
ログインは、以下のIDPW。
user : openflow
pw : openflow

⑥ キーボードの設定
ここで気がついた。
キーボードの配置がおかしい。
「:」が出ない。vimからしたら致命傷。

/etc/default/console-setupを変更。
sudo /etc/init.d/keyboard-setup startでリスタート。

$ sudo loadkeys jpだけでOK?
電源落とすと、元に戻っていた。調べなきゃ。

⑦ ネットワークの設定
$ ifconfig
eth0 : 10.0.2.15
eth1 : 192.168.56.101
が、わり当たっていた。

$ dhclient
でアドレスを再取得しても、
同じ。

~ ちょっと脱線 ~ 

なぜ、このIPがわり当たるのかな?。
割り振っているDHCP鯖はどこにいるのか?。

プロセスを見てみる。
$ ps -ax | grep dhcp
518 ? Ss 0:00 dhclient3 -e IF_METRIC=100 -pf /var/run/dhclient.eth1.pid -lf /var/lib/dhcp3/dhclient.eth1.leases eth1
538 ? Ss 0:00 dhclient3 -e IF_METRIC=100 -pf /var/run/dhclient.eth0.pid -lf /var/lib/dhcp3/dhclient.eth0.leases eth0
1650 pts/0 S+ 0:00 grep --color=auto dhcp

う~ん。
/var/lib/dhcp3/dhclient.eth1.leasesを見てみると、
192.168.56.101と書いてある。
書きなおして、dhclientやっても変わらんかった。


⑧ ホストマシンから接続
IP:192.168.56.101
ID:openflow
PW:openflow
接続できた。


Learn Development Tools

① 用語まとめ
OpenFlow Controller:コントローラ。
OpenFlow Switch :スイッチ。
dpctl :openflowにメッセージを送るとか・・・。
Wireshark :言わずと知れたwireshark
iperf :TCP connectionの速度を計るコマンド
Mininet :ネットワークエミュレーター
cbench :flow のテスト・・。

使ってみれば、分かるはず!w。


② miniネットワークを開始
$ sudo mn --topo single,3 --mac --switch ovsk --controller remote
間違えるかもしれないからコピペしろって、
書いてあったけど、あえて打とう。


③ mininetの使い方。
起動すると、mininetのプロンプトが開く。

mininet> nodes
mininetで起動しているホスト、スイッチ、コントローラを表示する。

mininet> help
ヘルプの表示

mininet> h2 ifconfig
対象のホスト上でコマンドを実行する方法。
ls, cd, ifconfigを試してみた。

mininet> xterm h2 h3
xtermが開くはずだが、開かない・・・。

mininetを停止するには、
Ctrl + D

mininetをリセットするには、
$ sudo mn -C


xtermが開かない原因を調べる。
Warning: This program is an suid-root program or is being run by the root user.
The full text of the error or warning message cannot be safely formatted
in this environment. You may get a more descriptive message by running the
program as a non-root user or by removing the suid bit on the executable.
xterm Xt error: Can't open display: %s
xterm: DISPLAY is not set
と出ている。

分かりやすそうなこいつ「DISPLAY is not set」を調べてみると、
これが出てきた。
微妙。。後日再挑戦。


④ dpctlの使い方
$ dpctl show tcp:127.0.0.1:6634
openflowスイッチの、状態を確認

$ dpctl dump-flows tcp:127.0.0.1:6634
openflowスイッチの、ルーティングテーブルの表示?


⑤ ping test
まず、flow tableにルールを書きこまなければならない。
$ dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
$ dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1
$ dpctl dump-flows tcp:127.0.0.1:6634

その後、下記で通る。
mininet> h2 ping -c3 h3

※ しばらくして、もう一度dpctl dump-flowsで
見てみるとルールが消えていた。。
予想:このコマンドはスイッチに直接ルールを書き込むもので、
本来はスイッチにパケットが来た時点で
コントローラに問合せ、ルールを取得するのかな。

Start Wireshark
wiresharkをGUIから使うにあたり、
やはりRealVNCとかで接続したくなる。

① xwindowのインストール(鯖側)
VINEだけど似たようなもの
$ sudo apt-get update
$ sudo apt-get install xinit
$ startx
VirtualBoxの画面からstartxすれば、
普通にwireshark使えた。
ま、VNC入れてみよう。

② vncserverのインストール(鯖側)
こんな雰囲気でVNC-SERVERをインストール・設定
$ sudo apt-get install vnc4server
$ vnc4server
(パスワードを打ち込む)

③ realVNCを入れて接続(こっち側)
IP:192.168.56.101:1
パスワード適当にいれる。
つながる。

④ ターミナルでwiresharkを起動
$ sudo wireshark &
プロミスキャスモードで使う為,sudo?

⑤ openflowのパケットを取得するには、
interfaceを「lo」にして、
filterに「of」と入れればいいらしい。


Start Controller and view Startup messages in Wireshark
コントローラを起動して、
openflowのパケットを見てみる。
$ controller ptcp:

①取得したぱけっとを見てみる。
1,127.0.0.1同士、異なるポートでTCPコネクションだとか、
OpenFlowProtocolだとかがやり取りされている。
コントローラとスイッチの通信。NATみたいな感じか。

2,mininetでpingを飛ばすと、
wireshark上に表示された(時々表示された・・)
プロトコル名は、「OFP+ICMP」
パケット内を見ると、OFPの中に更にイーサネットフレームがあり、
その中にICMPが入っている。
これが、いわいるIPトンネリングというやつか。

3,「OFP+ICMP」の他にも「OFP+ARP」,「OFP」があった。

4,「OFP」には以下の7種類が確認できた。
「Hello」,「Features Request」,「Features Reply」,「Set Config」
「Echo Request」,「Echo Reply」,「Flow Mod」,「Packet Out」
「Echo Request」,「Echo Reply」はコントローラからスイッチの死活監視?
「Flow Mod」,「Packet Out」はどちらも、「OFP+ICMP」の前後に見られるが、
なんだろう。。

※ wiresharkのファイルをローカルに持ってきて開いてみたが、
OpenFlowプロトコルを認識できていなかった。
(全部タダのTCPにデータくっついてる感じ)
OpenFlowプロトコルを認識するにはそれなりに準備が必要と。


View OpenFlow Messages for Ping
1, wiresharkのfilterに以下を入力
of && (of.type != 3) && (of.type != 2)
of : openflowプロトコル
of.type != 3 : どういう意味だろう?
of.type != 2 : どういう意味だろう?

2, pingを打ってみる。
mininet> h2 ping -c1 h3

3, 確認できたパケットは、
Packet In、Flow Mod。
Packet OutとFlow Expireが見つからない。

これらのパケットは、スイッチとコントローラ間の
やり取りを示すもの。
mininet再起動してやったらちゃんと見えた。
おそらく、スイッチにルールが割り当てられていたのだろう。

h2からh3にpingを飛ばしたときに、
まず、switchとcontroller間でルールのやり取りが行われる。
(packet in, packet out,flow mod)
その後、h3にpingが届けられ、h3からh2にecho replyが送信される。


Benchmark Controller w/iperf

1,iperfでベンチマークを取る。
mininet> iperf
で2点間の速度が取れる。

2,異なるネットワークを構築し、iperfしてみる。
$ sudo mn --topo single,3 --mac --controller remote --switch ovsk (今まで)
$ sudo mn --topo single,3 --mac --controller remote --switch user(これから)

switch が「ovsk」「user」の違い。
ovsk : kernel-space switch
user : user-space switch

※ iperfしてもエラーが出る用になってしまった。。
1,2つmininetを立ち上げていたから?
2,controllerを起動していなかったから?
なんにせよ、チュートリアル通り、一度exitしてから、
やったらできた。

結果
ovsk : 1.73 Gbits/sec
user : 295 Mbits/sec
チュートリアルでは、ovskはカーネル内で完結するのに対して、
userではカーネルスペースからユーザスペースへの移動が発生するために
これほど速度差が出てくる的なことが書いてあった。
まだ、十分な理解ではない。


Create Learning Switch 

Controller Choice A: NOX w/Python

Pythonでやる場合とJAVAでやる場合があるのか?

ここではネットワークアプリケーションとして、
L2 learning switchを作成する。

1、controllerが動いていることを確認
ps -a | grep controller

2、controllerとswitch間にコネクションがあるか確認
netstat -lanput
tcp        0      0 0.0.0.0:6633            0.0.0.0:*               LISTEN      1125/controller
tcp        0      0 127.0.0.1:6633          127.0.0.1:59210         ESTABLISHED 1125/controller
tcp        0      0 127.0.0.1:59210         127.0.0.1:6633          ESTABLISHED -

mininetからexitすれば、ESTABLISHEDになっているやつは消え、
mn -c を実行すれば、LISTENになっているやつも消える。

3、mininetを起動
sudo mn --topo single,3 --mac --switch ovsk --controller remote
 
4、openflowコントローラをデバッグモードで開始する
$ cd nox/build/src
$ ./nox_core -v -i ptcp: pytutorial 
※ このとき、ポート6633を使うので、
controllerが起動していてはだめ。

5、mininetからpingが通るか確認する
mininet> xterm h3
mininet> h3 ping h2

# tcpdump -XX -n -i h3-eth0

※ xtermを開くには、VNCで接続していないとできなかった。
そのうち、X11フォワーディングつかって、
ぽでろさのみで完結できるようにしたい。

6、もっと確認
mininet> pingall
 *** Ping: testing ping reachability
h2 -> h3 h4
h3 -> h2 h4
h4 -> h2 h3
*** Results: 0% dropped (0/6 lost)

mininet> iperf
*** Iperf: testing TCP bandwidth between h2 and h4
*** Results: ['27.0 Mbits/sec', '27.0 Mbits/sec']

前iperfで確認したときと比べて、
めっちゃ低い。。

7、Pythonのコードを修正して、Learning switchを作成する。





つづく。。。

0 件のコメント:

コメントを投稿