Kathará で実現する軽量ネットワークエミュレーション環境の構築
はじめに
ネットワークプロトコルの開発や検証を行う際、物理的なネットワーク機器を用意するのはコストも時間もかかります。また、クラウド環境を使う場合も、複雑なネットワーク構成を再現するのは容易ではありません。
本記事では、Kathará (カタラ) という Docker ベースの軽量ネットワークエミュレーターを使って、複雑なネットワーク環境を簡単に構築・検証する方法を紹介します。
Kathará とは
Kathará(ギリシャ語で「ネット」という意味)は、Docker コンテナを基盤とした軽量なネットワークエミュレーターです。NetKit の後継として開発されており、以下のような用途で活用できます:
- インタラクティブなデモ環境の構築
- 本番ネットワークのサンドボックス環境でのテスト
- 新しいネットワークプロトコルの開発・検証
Kathará の特徴
- 軽量: Docker コンテナベースで、物理機器や VM よりも軽量
- 再現性: 設定ファイルでネットワーク構成を定義し、環境を再現可能
- 拡張性: カスタム Docker イメージを使用可能
- 統合性: Wireshark などのツールと統合可能
環境構築
前提条件
- Docker がインストールされていること
Kathará のインストール
Ubuntu/Debian の場合:
# GPG キーの追加
wget -qO - "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x21805a48e6cbba6b991abe76646193862b759810" | \
gpg --dearmor -o /usr/share/keyrings/ppa-kathara-archive-keyring.gpg
# リポジトリの追加
echo "deb [ signed-by=/usr/share/keyrings/ppa-kathara-archive-keyring.gpg ] \
http://ppa.launchpad.net/katharaframework/kathara/ubuntu jammy main" | \
tee /etc/apt/sources.list.d/kathara.list
# インストール
apt update
apt install -y kathara
その他の OS については、公式ドキュメントを参照してください。
基本的な使い方
lab.conf によるネットワーク定義
Kathará では、lab.conf という設定ファイルでネットワーク構成を定義します。
[ ] 内は Docker に指定できるものは割と使える印象ですが、詳細は、lab.conf man page に書かれています。
以下は、4 ノードのシンプルなルーティング環境の例です:
# lab.conf
LAB_NAME="4 Node Network Test"
LAB_DESCRIPTION="4 Node Network Test Description"
# クライアントノード(リンク A に接続)
client[0]="A"
client[image]="kathara/base"
# ルーター1(リンク A と B に接続)
router1[0]="A"
router1[1]="B"
router1[image]="kathara/base"
# ルーター2(リンク B と C に接続)※ image 未指定の場合は、後述する kathara.conf の image が使われる
router2[0]="C"
router2[1]="B"
# サーバーノード(リンク C に接続)
server[0]="C"
server[image]="kathara/base"
# Wireshark コンテナ(オプション)
wireshark[bridged]=true
wireshark[image]="lscr.io/linuxserver/wireshark"
wireshark[port]="3000:3000"
環境の起動と停止
# 環境の起動
kathara lstart
# 環境の状態確認
kathara linfo
# 環境の停止・削除
kathara lclean
実践例:シンプルなルーティング環境の構築
ここでは、4 ノードのシンプルなルーティング環境を例に、Kathará の活用方法を説明します。
チュートリアル も色々あるので、簡単に試せます。
ノードの初期化スクリプト
各ノードの起動時に実行されるスクリプト(*.startup)で、ネットワーク設定やアプリケーションの起動を行います。
例:client.startup(クライアントの設定)
#!/usr/bin/env bash
_hostname=$(uname -n)
# ネットワーク設定
ip addr add 10.0.0.1/24 dev eth0
ip route add default via 10.0.0.2 dev eth0
# パケットキャプチャの開始
(tcpdump -i eth0 -w - > /shared/${_hostname}-eth0.pcap)&
例:router1.startup(ルーター 1 の設定)
#!/usr/bin/env bash
ip addr add 10.0.0.2/24 dev eth0
ip addr add 10.0.1.2/24 dev eth1
ip route add default via 10.0.1.3 dev eth1
例:router2.startup(ルーター 2 の設定)
#!/usr/bin/env bash
ip addr add 10.0.2.3/24 dev eth0
ip addr add 10.0.1.3/24 dev eth1
ip route add default via 10.0.1.2 dev eth1
例:server.startup(サーバーの設定)
#!/usr/bin/env bash
_hostname=$(uname -n)
ip addr add 10.0.2.4/24 dev eth0
ip route add default via 10.0.2.3 dev eth0
カスタム Docker イメージの使用(オプション)
標準の kathara/base イメージ(Ubuntu ベース)で十分な場合が多いですが、Ubuntu 以外の OS ベースで検証したい場合は、 kathara/base を参考に独自の Docker イメージを作成して使用できます。
独自イメージをビルドして、lab.conf で指定することで使えるようになります:
router1[image]="my/custom-image"
ボリュームマウント
Kathará では、ホストとコンテナ間でファイルを共有するために、以下の 3 つの方法でボリュームをマウントできます。
1. 自動マウント(ノード名と同じディレクトリ)
ノード名と同じ名前のディレクトリをラボのルートディレクトリに作成すると、そのディレクトリが自動的にコンテナのルート(/)にマウントされます。
例:server ノードにファイルを配置する場合
# ディレクトリ構造
4_nodes_test/
├── lab.conf
├── server/
│ └── var/
│ └── www/
│ └── html/
│ └── index.html
└── server.startup
この場合、server/ ディレクトリの内容が server コンテナの / にマウントされるため、server/var/www/html/index.html はコンテナ内では /var/www/html/index.html としてアクセスできます。
2. lab.conf での明示的な指定
lab.conf で [volume] オプションを使用して、ホストの任意のディレクトリをコンテナ内の任意のパスにマウントできます。
# lab.conf
router1[volume]="/home/user/myconfig|/etc/myapp/config|rw"
構文:device[volume]="HOST|GUEST|[MODE]"
-
HOST: ホストマシン上のディレクトリパス -
GUEST: コンテナ内のマウントポイント -
MODE(オプション): アクセスモード-
ro: 読み取り専用 -
rw: 読み書き可能(デフォルト) -
rx: 読み取り・実行可能
-
例:
# 設定ファイルを読み取り専用でマウント
router1[volume]="/home/user/configs|/etc/router/config|ro"
# ログディレクトリを読み書き可能でマウント
router1[volume]="/home/user/logs|/var/log/myapp|rw"
3. 共有ディレクトリ(/shared)
ラボのルートディレクトリに shared ディレクトリを作成すると、そのディレクトリが全ノードで /shared として共有されます。これは、複数のノード間でファイルを共有する場合に便利です。
# ディレクトリ構造
4_nodes_test/
├── lab.conf
├── shared/ # このディレクトリが全ノードで /shared として共有される
└── ...
使用例(startup スクリプト内):
# パケットキャプチャファイルを shared に保存
(tcpdump -i eth0 -w - > /shared/router1-eth0.pcap)&
# ログファイルを shared に保存
(/usr/local/bin/myapp 2>&1 | tee /shared/router1-myapp.log)&
shared ディレクトリの内容は、ホストマシンからもアクセスできるため、パケットキャプチャファイルやログファイルの取得に便利です。
ノードへのアクセス
# 特定のノードでコマンドを実行
kathara exec router1 -- ip addr show
# ノードにシェルでアクセス
kathara connect router1
Wireshark との統合
Kathará では、Wireshark コンテナをネットワークリンクに接続して、パケットキャプチャを行うことができます。
Wireshark の追加
# リンク A に Wireshark を追加
kathara lconfig -n wireshark --add A
# ブラウザで http://localhost:3000 にアクセス
Wireshark の削除
# リンク A から Wireshark を削除
kathara lconfig -n wireshark --rm A
設定ファイルの管理
kathara.conf の設定
Kathará のデフォルト動作をカスタマイズするには、~/.config/kathara.conf を編集することも可能です。
{
"image": "kathara/base", // 例えば、ここでデフォルトイメージを変えられる
"manager_type": "docker",
"terminal": "TMUX",
"open_terminals": false,
"device_shell": "/bin/bash",
"net_prefix": "kathara",
"device_prefix": "kathara",
"debug_level": "INFO",
"print_startup_log": true,
"enable_ipv6": false,
"shared_mount": true,
"image_update_policy": "Always"
}
まとめ
Kathará を使うことで、以下のようなメリットが得られます:
- 軽量: Docker コンテナベースで、物理機器よりも軽量
- 再現性: 設定ファイルで環境を定義し、いつでも同じ環境を再現可能
- 柔軟性: カスタムイメージやトラフィック制御で、様々なネットワーク条件をエミュレーション可能
- 統合性: Wireshark などのツールと簡単に統合可能
ネットワークプロトコルの開発や検証を行う際は、ぜひ Kathará を活用してみてください。