技術入門

ネットワーク検証自動化の取組みの紹介

NIC 光トランスポートシステムプロジェクト

#ネットワーク検証自動化#ネットワークOS#Beluganos

2025/1/31

はじめに

NICのBeluganos開発では、検証を効率化するためにネットワーク検証の自動化に取り組んでいます。
本記事では、ネットワーク装置の検証の自動化をしたいが何から始めれば良いかわからない読者を想定して、シンプルな系での検証自動化の実例を紹介します。

背景

通信キャリアにおいてネットワークサービスを提供するために、ルータやスイッチなどの装置の動作確認検証や、設計したネットワークが適切に動作するかを確認するネットワーク検証を行う必要があります。検証においては、多岐にわたるネットワーク構成パターンや、膨大なパラメータの組み合わせを実機で動作確認する必要があり、莫大な時間及び稼働が必要です。

検証を効率化し、時間及び稼働を削減するために、スクリプト等を活用した検証の自動化(ネットワーク検証自動化)が行われています。
ネットワーク検証自動化の実現方法としては、対象とする検証および対象とする機器に応じて様々なパターンが存在します。
本記事では、検証内容としてはL2/L3のネットワークの検証、検証対象装置としては以前の記事で紹介したホワイトボックススイッチを対象としたネットワーク検証の自動化について紹介します。本記事で紹介するネットワーク検証自動化においては、netmiko*1で検証対象装置に接続してコマンドを実行するスクリプトとT-Rex*2でトラフィックを生成して検証対象装置に印加するスクリプトを作成し、Robot Framework*3からそれらを実行することで、ネットワークの性能や安定性の検証の自動化を実現しています。

必要な物理環境とソフトウェアの設定

物理環境の設定

検証自動化を実行する際、物理環境として、検証対象装置に加えて、物理サーバもしくは仮想マシン(以下、VMと呼びます)でのサーバ構築が必要になります。具体的には以下の装置とサーバの設定を行います。


  • 検証対象装置 : 検証対象のスイッチです。実機を使用します。
  • 検証自動化シナリオ実行環境 : 検証自動化シナリオを実行する環境です。物理サーバでもVMでもどちらでも使用可能です。本記事ではVMを使用しました。
  • トラフィックジェネレータ用サーバ : トラフィック生成とトラフィック印加を行います。物理サーバでもVMでもどちらでも使用可能です。本記事ではVMを使用しました。
  • 01.jpg
    図1 : 検証自動化シナリオ実行環境

    ここで、検証対象装置、検証自動化シナリオ実行環境、トラフィックジェネレータ用サーバは、同一のネットワークに所属している物とします。
    物理環境設定は以下の手順で行います。


    1. 検証対象装置と検証自動化シナリオ実行環境、トラフィックジェネレータ用サーバの配線作業を行います。

    2. 検証対象装置に検証対象となるNetwork OSをインストールします。

    3. 検証自動化シナリオ実行環境、トラフィックジェネレータ用サーバにLinux をインストールします。本記事で紹介する検証自動化シナリオで動作確認が取れているのがUbuntu 22.04にデフォルトでインストールされているpython 3.10.4であるため、Ubuntu 22.04 LTSをインストールします。

    ソフトウェアのインストール

    検証自動化シナリオ実行環境に以下のソフトウェアのインストールが必要になります。


  • netmiko
  • Robot Framework
  • Trex Stateless Python API

  • また、トラフィックジェネレータ用サーバにT-Rexのインストールが必要になります。

    netmikoのインストール

    検証自動化シナリオ実行環境にログインして、ターミナルを開き、以下のコマンドでpythonのパッケージマネージャのpip3(以下、pip3と呼びます)をインストールします。

    sudo apt install python3-pip

    その後、検証自動化シナリオ実行環境のターミナルで、pip3をつかって必要なpythonパッケージをインストールします。

    pip3 install netmiko

    Robot Frameworkのインストール

    検証自動化シナリオ実行環境のターミナルで、pip3を使ってRobot Frameworkをインストールします。

    pip3 install robotframework

    動作確認時のバージョンは以下になります。

    robot --version
    Robot Framework 7.0.1 (Python 3.10.12 on linux)
    

    T-Rexのインストール

    トラフィックジェネレータ用サーバにT-Rexをインストールします。T-Rexは公式サイトからダウンロードしてインストールします。 具体的なインストール手順はT-rexのマニュアルを参照してください。本記事ではv3.06を使用しました。
    インストールした後、トラフィックジェネレータ用サーバでターミナルを開いて以下のコマンドを実行し、T-Rexの実行ファイルを実行状態にしておきます。

    cd <T-Rexのインストール先のフォルダ>
    sudo ./t-rex-64 -i --cfg <設定ファイル> --no-scapy-server
    

    これ以降、T-Rexをインストールして環境設定したトラフィックジェネレータ用サーバのことを「トラフィックジェネレータ」と呼びます。
    そして、検証自動化シナリオ実行環境にTrex Stateless Python APIをインストールします。Trex Stateless Python APIは、トラフィックジェネレータのT-Rexのインストールフォルダ内にあるtrex_client_v3.06.tar.gzを展開することでインストールします。具体的には、シナリオ実行環境でターミナルを開いて、以下のコマンドを実行します。

    tar zxfv trex_client_v3.06.tar.gz 

    検証自動化シナリオ

    検証自動化シナリオの全体像

    今回紹介する検証自動化シナリオは、トラフィックジェネレータでトラフィックを生成して、検証対象装置にトラフィックを印加し、その前後で検証対象装置の状態を確認します。
    具体的には、まず図1での検証自動化シナリオ実行環境の装置にsshもしくはコンソールからログインします。そして、検証自動化シナリオ実行環境から検証対象装置にnetmikoでsshログインし、検証対象装置でコマンドを実行します。その後、検証対象装置からTrex Stateless Python APIを使ってトラフィックジェネレータ用サーバにログインし、トラフィックジェネレータ用サーバでトラフィックを生成してから検証対象装置へトラフィックを印加します。最後にもう一度シナリオ実行環境から検証対象装置にnetmikoでsshログインし、検証対象装置でコマンドを実行します。

    netmikoで検証対象装置を操作するスクリプトの作成

    netmikoを使って検証対象装置に接続し、装置状態を確認するコマンドを実行するpythonスクリプトを作成します。 pythonスクリプトのファイル名はNetworkTest.pyとします。
    ここで、<デバイス名>は検証対象装置に合わせて選択します。詳細はこちらを参照してください。 また、<IPアドレス>、<ユーザー名>、<パスワード>については検証対象装置に設定されたIPアドレス、ユーザー名、パスワードの文字列を設定します。


    NetworkTest.py

    from netmiko import ConnectHandler
    
    class NetworkTest(object):
    
        def __init__(self):
            None
    
        def ExecuteNetWorkTest(self):
            # ネットワーク機器の情報
            device = {
                'device_type': '<デバイス名>',
                'host': '<IPアドレス>',
                'username': '<ユーザー名>',
                'password': '<パスワード>'
            }
    
            # デバイスに接続
            net_connect = ConnectHandler(**device)
            net_connect.enable()
    
            # コマンドを送信して出力を取得
            command = 'show interface <インターフェイス名> counters summary'
            output = net_connect.send_command(command)
            print(output)
    
            # 接続を閉じる
            net_connect.disconnect()
    

    NetworkTest.pyを実行すると、検証対象装置にSSHで接続し、show interface <インターフェイス名> counters summary コマンドを実行します。<インターフェイス名>には、トラフィック印加を行うインターフェイス名を設定します。コマンド実行により、検証対象装置のトラフィック印加を行うインターフェイスのカウンタを表示します。

    T-Rexでトラフィック生成と印加を行うスクリプトの作成

    次に、トラフィックジェネレータでトラフィックを生成して、検証対象装置にトラフィックを印加するpythonスクリプトを作成します。作成するpythonスクリプトのファイル名はTrafficTest.pyとします。TrafficTest.pyでは、Trex Stateless Python APIを使ってトラフィックを生成し、検証対象装置にトラフィックを印加します。


    TrafficTest.py

    import sys
    sys.path.append('Trex Stateless Python APIのインストール先のパス')
    from trex_stl_lib.api import *
    from trex.stl.trex_stl_hltapi import *
    
    
    class TrafficTest(object):
    
        def __init__(self):
            self.fsize=1500
    
        def ExecuteTrafficTest(self):
            # Trexクライアントを作成して接続
            client = STLClient(server='<トラフィックジェネレータのIPアドレス>')
            client.connect()
            client.acquire(ports=[0])
    
            # トラフィックストリームを定義
            base_pkt = Ether(dst='<トラフィック印加対象インターフェイスのMACアドレス>')/IP()/UDP()
            size = self.fsize - 4
            pad = max(0, size - len(base_pkt)) * 'x'
            pkt = STLPktBuilder(pkt=base_pkt/pad)
            stream = STLStream(packet=pkt, mode=STLTXCont(pps=10))
    
            # ストリームをロード
            client.add_streams(stream, ports=[0])
    
            # トラフィックを送信
            client.start(ports=[0], duration=10)
    
            # トラフィック送信完了を待つ
            client.wait_on_traffic(ports=[0])
    
            # 結果の取得と表示
            stats = client.get_stats()
            s = 'packets: {}, bytes: {}'.format(stats['total']['opackets'], stats['total']['obytes'])
            print(s)
    
            # 接続を閉じる
            client.disconnect()
    

    TrafficTest.pyを実行すると、指定したトラフィックの条件(フレームサイズ1500Byte、10pps)でトラフィックを生成し、指定した検証対象装置のインターフェイスに対して、トラフィックを10秒間印加します。
    本記事のようにT-rex(トラフィックジェネレータ)をVM上で動作させる場合、仮想スイッチの設定誤りにより適切なインターフェイスからの負荷印加ができないことがしばしば起こりますので、仮想スイッチのポートと物理ポートの関連付けが適切かを確認しながら進めることをおすすめします。

    Robot Frameworkでの検証自動化シナリオ作成

    最後に、Robot Frameworkでrobotファイルを作成します。robotファイルでは前節までで作成した2つのpythonスクリプトを呼び出します。今後、この作成したrobotファイルのことを「検証自動化シナリオ」と呼びます。検証自動化シナリオのファイル名はnetwork_test.robotとします。robotファイル内で使用可能なキーワードの詳細はこちらを参照してください。


    network_test.robot

    *** Settings ***
    Library    ./NetworkTest.py
    Library    ./TrafficTest.py
    
    *** Test Cases ***
    装置状態確認
        [Documentation]    検証対象装置にトラフィックを印加します。その前後でパケットカウントを確認します。
        ExecuteNetworkTest
        ExecuteTrafficTest
        ExecuteNetworkTest
    

    検証自動化シナリオでは、まず、NetworkTest.pyのExecuteNetworkTest関数を実行して、トラフィック印加前の検証対象装置のトラフィック印加対象のインターフェイスのカウンタの状態を確認します。そして、TrafficTest.pyのExecuteTrafficTest関数を実行して検証対象装置にトラフィックを印加します。 最後に、NetworkTest.pyのExecuteNetworkTest関数をもう一度実行して、トラフィック印加後の検証対象装置のトラフィック印加対象のインターフェイスのカウンタの状態を確認します。

    検証自動化シナリオ実行

    Robot Frameworkの実行ファイルにより検証自動化シナリオを実行します。 必要なファイルの設定やスクリプトを整えたら、シナリオ実行環境でターミナルを開いて、以下のように検証自動化シナリオを実行します。

    robot network_test.robot

    検証自動化シナリオの実行結果の出力を以下に示します。検証自動化シナリオを実行したフォルダ直下にoutput.xml、log.html、report.htmlの3つのファイルが出力されます。

    ==============================================================================
    Network Test                                                                  
    ==============================================================================
    装置状態確認 :: 検証対象装置にトラフィックを印加します。その前後でパケットカウントを確認します。      | PASS |
    ------------------------------------------------------------------------------
    Network Test                                                     | PASS |
    1 test, 1 passed, 0 failed
    ==============================================================================
    Output:  <実行したフォルダ>/output.xml
    Log:     <実行したフォルダ>/log.html
    Report:  <実行したフォルダ>/report.html
    

    出力されたreport.html(以下、レポート画面と呼びます)とlog.html(以下でログ画面と呼ぶ)を図2と図3に示します。

    02.jpg
    図2: レポート画面
    03.jpg
    図3: ログ画面

    レポート画面(図2)では、検証自動化シナリオの実行結果のまとめの情報が表示されます。「Summary Information」では実行した検証自動化シナリオの結果のまとめが表示されます。「Test Statistics」では、検証自動化シナリオの中で実行された各テストケースについてのPass/Failの情報が表示されます。「Test Details」では、検証自動化シナリオの中で実行された各テストケースの詳細の確認と検索ができます。レポート画面の「Summary Information」内の「Log File:」 のリンクをクリックすると、ログ画面(図3)に画面遷移します。
    ログ画面(図3)では、検証自動化シナリオの実行時に呼び出されたpythonスクリプトの各結果が表示されています。
    最初のExecute Net Work Testのところでトラフィック印加前のトラフィック印加対象のインターフェイスのカウンタを表示しています。Rx packetsとRx bytesがどちらも0になっています。
    次のExecute Traffic Testのところでトラフィックの生成と印加を行っています。トラフィックの条件が「フレームサイズ1500Byte、10pps」なので、パケット数100の150000 Byte のトラフィックが作成されています。
    そして、最後のExecute Net Work Testのところでトラフィック印加後のトラフィック印加対象のインターフェイスのカウンタを表示しています。Rx packetsが100増加していて、Rx bytesが150000 Byte 増加していることがわかります。
    このように、検証自動化シナリオを実行することで、検証対象装置へのトラフィックの印加の確認とトラフィック印加前後での検証対象装置のインターフェイスのカウンタの変化を確認することができました。

    おわりに

    NIC では、本記事で紹介した検証自動化シナリオ拡充や高度化により、検証の効率化の取組みを進めています。例えば、参考文献 [1]で紹介したように、検証自動化シナリオの実行に時間がかかるという課題に対して、装置状況をフィードバックして検証自動化シナリオの実行にかかる時間を短縮する方法を検討しています。
    本記事が、これから検証自動化を始める方の一助になれば幸いです。
    今後も、高信頼なネットワークの提供に向け、着実に検証を行うとともに、検証自動化の拡大による検証の効率化に取り組んでいきます。

        

    脚注(用語解説)

        
           

    *1 netmiko: ネットワークデバイスの操作と管理を自動化するためのPythonライブラリです。SSH接続を簡素化し、多数のネットワークデバイスをサポートします。

           

    *2 T-Rex: 高スループット環境でのネットワークパフォーマンステストを行うためのトラフィックジェネレータのソフトウェアです。汎用サーバーもしくはVirtual Machineにインストールすることでトラフィックジェネレータとして機能します。

           

    *3 Robot Framework: キーワード駆動型のテスト自動化フレームワークです。Pythonライブラリの形で提供されます。

        
        

    参考文献

        
            

    (1) 狩野累 横井俊宏 西尾 弦一 目野栄幸 望月このみ 松岡 康行
    「[B-6-59] 装置状況に依存する検証に対応可能なネットワーク検証自動化方式」
    電子情報通信学会 ソサイエティ大会 2024         

        

    関連するプロジェクト

    プロジェクト一覧へ

    採用情報

    採用情報