ニートのMEMO

ニート生活をしたかった社会人がネットワークやサーバ、プログラミングなどについて勉強したことをメモとして残しているブログです。

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