私は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
まずはこちらのチュートリアルをなぞります。
install
VM版がありましたのでお手軽にこちらで試します。
ubuntuのKVM上に作ります。
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の世界に踏み込みたいと思います。