MininetによるSDNシミュレーション:ノートPC上で100ノードのトポロジを構築する

Network tutorial - IT technology blog
Network tutorial - IT technology blog

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を使用して接続する。この方法により、ネットワーク構造によるエラーなのか、プログラミングロジックによるエラーなのかを切り分けることができ、デバッグの苦労が大幅に軽減されます。

Share: