paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

mininetでopenflowの勉強 準備編

私はNWエンジニアとして働いているのですが現場がお客さんのDCということもあり主に物理NW機器の構築ばかりです。
(設計秘匿の規約かつレガシーな構成ばかりなので本ブログでは仕事に絡んだNW系の記事はほとんどありません)

今どき仮想化やらPaaSやらが主流でこのままだといつかオマンマ食い上げになってしまうかもしれません。

なのでちょっと仮想化+NWを交えてSDN周りを勉強しておこうと思います。

Software Defined Network

SDNという言葉が出てきて随分立ちますが、私は未だに使っている場面に出会ってません。

定義としては

  • ソフトウェアベースのNW環境構築
  • 環境の一元管理
  • NWレイヤの抽象化

というのが挙げられ、SDNの実装として未だにopenflowが主流となっていると思います。

ちなみにopenflowでは無いですがVMware NSXは業務で設計に関わったことがあります。
これもManagerからポチポチっとやればNW環境構築できるのでSDNという意味では合ってますよね。

SDNっぽいパッケージいろいろ

自宅にSDN環境を作りたいなと考えているのですが、低コストで行きたいのでなるべくOSSで作りたいです。
ちょっと調べただけでもパッケージが色々出てきます。

  • SDNに関連するパッケージ
    • ovn
    • ragopos router
    • mininet
  • SDNコントローラ系
    • opendaylight
    • trema
    • ryu

SDNに関連するワードして分散ルータやVxLAN等色々出てきますが、あれもこれも追うと収集つかないのでまずは基本に立ち返りopenflowから触っていきたいと思います。
この中ですとmininetというパッケージがopenflowシミュレータとして動作するようで、まずはお手軽に試せるこの環境を作りたいと思います。

mininet

まずはこちらのチュートリアルをなぞります。

mininet.org

install

VM版がありましたのでお手軽にこちらで試します。
ubuntuKVM上に作ります。 ovaで提供されていますが、KVMでもすんなりインポートできました。 KVMのバージョンは4.2.3です。

start

mnコマンドでデフォルトの構成で環境が作られます。

mininet@mininet-vm:~$ sudo mn
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) (h2, s1) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet> 

スイッチ1台にホスト2台がつながっているというシンプルな構成です。
このスイッチにコントローラがopenflowで支持を出すということですね。

各詳細を確認できます。

現在のノード。

mininet> nodes
available nodes are: 
c0 h1 h2 s1

接続構成。

mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
s1 lo:  s1-eth1:h1-eth0 s1-eth2:h2-eth0
c0

ノードの詳細といったところ。

mininet> dump
<Host h1: h1-eth0:10.0.0.1 pid=4130> 
<Host h2: h2-eth0:10.0.0.2 pid=4133> 
<OVSSwitch s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None pid=4138> 
<Controller c0: 127.0.0.1:6653 pid=4123> 

ノードへのコマンド。

mininet> h1 ifconfig -a
h1-eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.1  netmask 255.0.0.0  broadcast 10.255.255.255
        ether be:5e:1e:33:ba:15  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
test

ーーtestオプションでmininetプロンプトには入らずにコマンドをシミュレーションできます。

mininet@mininet-vm:~$ sudo mn --test pingpair
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
s1 
*** Adding links:
(h1, s1) (h2, s1) 
*** Configuring hosts
h1 h2 
*** Starting controller
c0 
*** Starting 1 switches
s1 ...
*** Waiting for switches to connect
s1 
h1 -> h2 
h2 -> h1 
*** Results: 0% dropped (2/2 received)
*** Stopping 1 controllers
c0 
*** Stopping 2 links
..
*** Stopping 1 switches
s1 
*** Stopping 2 hosts
h1 h2 
*** Done
completed in 5.873 seconds
X11

sudo mn -xで各ホストのX11Forwardingが使えます。

各ノードをホスト側のxtermで操作できます。
特に個別インストール不要でホストがLinuxなのでできる技ですね。

wireshark

同じ方法でmininet vm内のパケットをwiresharkで確認できます。

1つ設定が必要で、mininetのwiresharkはrootユーザで動かしているのでrootユーザのディスプレイを転送できるようにxauthにディスプレイを追加します。
(どこかのヘルプを見たのですが参照元を忘れてしまいました)

mininet@mininet-vm:~$ xauth list $DISPLAY
mininet-vm/unix:10  MIT-MAGIC-COOKIE-1  f347f93a9a9a4f16bf7acb251527826c
mininet@mininet-vm:~$ sudo -s
root@mininet-vm:/home/mininet# xauth list
xauth:  file /root/.Xauthority does not exist
root@mininet-vm:/home/mininet# xauth add mininet-vm/unix:10  MIT-MAGIC-COOKIE-1  f347f93a9a9a4f16bf7acb251527826c
xauth:  file /root/.Xauthority does not exist
root@mininet-vm:/home/mininet# xauth list
mininet-vm/unix:10  MIT-MAGIC-COOKIE-1  f347f93a9a9a4f16bf7acb251527826c

というわけでopenflow v1のパケットが取得できました。
X11Forwardingは今回初めて使ったのですがこういうのできるとわざわざファイル共有をしなくてもいいので便利ですね。

トポロジのカスタム

構成のカスタムも可能でpythonファイルを設定してオプションで読み込めば独自の構成で検証できます。
でも標準のオプションでも色々変更できそうなのでこれを使うのは当分先になりそうです。

mininet@mininet-vm:~$ head -20 mininet/custom/topo-2sw-2host.py
"""Custom topology example

Two directly connected switches plus a host for each switch:

   host --- switch --- switch --- host

Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""

from mininet.topo import Topo

class MyTopo( Topo ):
    "Simple topology example."

    def build( self ):
        "Create custom topo."

        # Add hosts and switches
        leftHost = self.addHost( 'h1' )

まとめ

今回はここまででmininetを軽く触ってみました。
構築はVMのインポートで終わってしまったので非常にお手軽です。
これを使ってもう少しopenflowの世界に踏み込みたいと思います。