SDNラボ構築の苦労:予算が情熱に追いつかない時
Software-Defined Networking (SDN)を学び始めた頃、ルーティングアルゴリズムをテストするために本物のOpenFlowスイッチを揃えたいと夢見ていました。しかし現実は厳しく、予算は限られ、中古のデバイスは電力を浪費する上に、耕運機のように騒がしいものでした。
最大の課題は、50〜100ノード規模のFat-TreeやSpine-Leafアーキテクチャを試したい時です。個人で物理ハードウェアを購入するのは現実的ではありません。従来の仮想マシン(VM)を使用しても、1台あたり少なくとも1〜2GBのRAMを消費します。10ノード起動しただけで、Core i7搭載のPCはすぐにフリーズしてしまうでしょう。
なぜGNS3やCisco Modeling Labsは「重すぎる」のか?
GNS3やCMLのようなツールは、デバイスのOS(IOS, NX-OS)をそのまま動かすため、Ciscoの資格取得には非常に有用です。しかし、その代償として膨大なリソースを必要とします。
SDNの世界では、Control Plane and Data Planeを分離する必要があります。従来のツールはこれらを混同しがちで、制御プログラムの開発を煩雑にします。さらに、GUIでのトポロジ作成は再現性が低く、コードによる完全な自動化も困難です。
Mininet – 超軽量ネットワークシミュレーションのゴールドスタンダード
Mininetはよりスマートなアプローチでこの問題を解決します。重い仮想マシンの代わりに、Linux Network Namespacesを活用します。これはLinuxカーネル内の非常に軽量なテクノロジーで、数百のホストやスイッチをわずか数秒で作成できます。
最大の利点は何でしょうか?Mininetのホストは、VMのように数GBではなく、わずか15〜20MB程度のRAMしか消費しません。一般的なノートPC上で巨大なネットワークを構築し、Ryu、ONOS、OpenDaylightなどのControllerとOpenFlowを介してスムーズに連携させることができます。
30秒でMininetをインストール
安定性を考慮し、Ubuntu Serverを推奨します。以下のコマンド1つで開始できます。
sudo apt update && sudo apt install mininet -y
システムが正常に動作するか確認するために、このコマンドを実行してみてください。
sudo mn --test pingall
システムが自動的に2つのホストと1つのスイッチを構築し、pingテストを実行した後、環境を自動でクリーンアップします。すべてが一瞬で完了します。
Pythonでネットワーク全体を「コード」化する
CLIコマンドはあくまで入門用です。本格的なデータセンターネットワークを構築するには、Pythonスクリプトを書くべきです。これにより、Gitでトポロジを管理でき、変数を1つ変えるだけでネットワーク規模を調整できるようになります。
以下は、カスタムツリートポロジ(Tree Topology)を作成する際によく使うスクリプトです。
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.cli import CLI
from mininet.log import setLogLevel
class CustomTreeTopo(Topo):
def build(self, depth=2, fanout=2):
# depth: 深さ, fanout: 各ノードの子ノード数
self.addTree(depth, fanout)
def run_network():
topo = CustomTreeTopo(depth=2, fanout=4) # 16個のホストを持つネットワークを作成
# 外部コントローラーに接続 (例: ポート6633で動作するRyu)
net = Mininet(topo=topo, controller=RemoteController)
# ヒント:大規模なネットワークを設計する際、IPアドレスの計算ミスが起こりやすいです。
# toolcraft.app/ja/tools/developer/ip-subnet-calculator を使用して
# サブネットを素早く分割し、数百のノードに割り当てる際のIP重複を避けましょう。
net.start()
print("*** ネットワークの準備が整いました。'nodes' と入力してデバイス一覧を表示します。")
CLI(net)
net.stop()
if __name__ == '__main__':
setLogLevel('info')
run_network()
パフォーマンス計測:見るだけでなく、測定せよ!
構築が終わったら、ネットワークの速度を確認する必要があります。MininetのCLIで以下の「強力な」コマンドを活用しましょう。
iperf h1 h2: 実際の帯域幅を測定します。CPUの性能によりますが、10〜20Gbpsに達することもあります。ovs-ofctl dump-flows s1: スイッチs1のフローテーブル(flow table)を確認します。OpenFlowのロジックをデバッグする最良の方法です。wireshark &: Wiresharkを起動し、ループバックインターフェース(lo)上のOpenFlowパケットをキャプチャします。
実践的なアドバイス:「肉体」と「魂」を切り離す
初心者が陥りがちな間違いは、すべてをMininet内で設定しようとすることです。覚えておいてください。Mininetはあくまで「肉体」(Data Plane)です。SDNをマスターするには、「魂」(Control Plane)となる本物のControllerが必要です。
私がプロジェクトで採用している標準的なワークフローは次の通りです:Pythonでトポロジを記述する -> 別のターミナルでRyu Controllerを実行する -> RemoteControllerを使用して接続する。この方法により、ネットワーク構造によるエラーなのか、プログラミングロジックによるエラーなのかを切り分けることができ、デバッグの苦労が大幅に軽減されます。

