Mininet(OVS + Ryu)でOpenFlowを体験してみる
mininet(OVS) + ryu
Mininetと呼ばれるVM上でOpenFlowを体験できるすごい仮想環境があるので試してみた
ホスト | VM |
---|---|
Mac OS X | Ubuntu14.04 |
準備
$ sudo apt-get update $ sudo apt-get install build-essential $ sudo apt-get install git
Mininetインストール
$ git clone https://github.com/mininet/mininet.git $ cd mininet $ git tag #利用できるバージョンが表示されます $ git checkout -b 2.2.1 2.2.1 # $ cd ../ $ mininet/util/install.sh -nfv $ mn --version 2.2.1 Cloning into openflowで止まった場合以下を変更すると直りました $ /mininet/util/install.sh (変更前) git:// (変更後) https://
ryuのインストール
$ sudo apt-get -y install python-pip python-dev libxml2-dev libxslt-dev zlib1g-dev $ sudo pip install ryu $ ryu-manager --version ryu-manager 4.15 versioncollisionのエラーが出た場合 $ sudo pip install --upgrade six
Mininetの起動
sudo mn --controller remote ↓ (起動が成功すると) mininet>
ryuの起動
実行を簡単にするためシンボリックリンクを作成 ln -s /usr/local/lib/python2.7/dist-packages/ryu /home/username/ryu sampleの中から適当に起動 ryu-manager ryu/app/simple_switch.py
Mininetのコンソールからpingを送ってみる
mininet> pingall (タブを押すとどんなコマンドがあるか見られる) ryuを実行しているターミナルにいろいろ流れていればOK
Mininetでopenflow1.3を使う
$ ovs-vsctl set Bridge switch_name protocols=OpenFlow13 ↓ pythonコード内で自動化 def ofp_version(switch,protocols): protocols_str = ','.join(protocols) command = 'ovs-vsctl set Bridge %s protocols=%s' % (switch,protocols_str) switch.cmd(command) 関数呼び出し ofp_version(switch_name,['OpenFlow13'])
スペース開けるとエラーになりました
◯ protocols=%s
☓ protocols = %s
※複数のOVSを使っている場合はすべて同じバージョンじゃないとパケットが転送されない
Mininetで独自のトポロジをpythonで書く
1 Mininetインスタンスの作成
from mininet.net import Mininet net = Mininet()
2 Hostの作成
h = net.addHost('h',mac='xx:xx:xx:xx:xx:xx',ip='x.x.x.x/x')
3 Switchの作成
s = net.addSwitch('s',mac='xx:xx:xx:xx:xx:xx')
4 Linkの作成
from mininet.link import Link net.addLink(h,s)
5 Controllerの作成
from mininet.node import RemoteController net.addController('c0',controller=RemoteController,ip='x.x.x.x,port=xxxx)
6 CLI表示
from mininet.cli import CLI CLI(net)
Open vSwitch(コマンド操作可能)
1 vSwitchのフロー確認
sudo ovs-ofctl -O OpenFlow13 dump-flows s1
2 vSwitchのフロー削除
sudo ovs-ofctl -O OpenFlow13 del-flows s1
3 vSwitchのフロー登録
sudo ovs-ofctl -O OpenFlow13 add-flow s1 'priority=100,in_port=1,actions=output:2'
4 DatapathID(SWの識別ID)の設定
DatapathIDの設定 sudo ovs-vsctl set bridge s1 other-config:datapath-id=0000000000000001 DatapathIDの確認 sudo ovs-vsctl set bridge s1 other-config
5 接続先のOpenFlow ControllerのIPアドレスの設定
sudo ovs-vsctl set-controller s1 tcp:127.0.0.1:6633
6 vSwitchの情報確認
sudo ovs-vsctl show