深夜2時のインフラ危機
時刻は午前2時14分。メインのDNSサーバーがダウンし、ホームラボ全体の内部ルーティングが道連れになりました。点滅するカーソルを眺めながら、セカンダリDNSを 192.168.10.5 に割り当てたか、それとも .15 だったかを必死に思い出そうとしています。「network_notes.txt」というファイルはありますが、それは嘘です。もう94日間も更新されていません。IPレンジにpingを打ってみても、半分のデバイスは沈黙したまま。この瞬間、ホームラボを単なる趣味としてカジュアルに運営し続けるのは、精神衛生上良くないと痛感しました。
ホームラボの拡張は諸刃の剣です。VLANが2つ以上、コンテナが20個を超えると、頭の中のマップだけでは限界が来ます。そこで必要になるのが「信頼できる情報源(Source of Truth)」です。エンタープライズ環境では、NetBoxというツールを頼りにします。これは専用のIPアドレス管理(IPAM)およびデータセンターインフラ管理(DCIM)ツールです。LANケーブルのコネクタを1つ作る前に、まずアーキテクチャを文書化することを強制してくれます。
経験から学んだことは、ドキュメント作成は「未来の自分へのプレゼント」だということです。クローゼットの中の6Uラックを管理していようと、複数リージョンにまたがるクラウド展開をしていようと、正確なポート間のマッピングを知っているかどうかが、5分で解決するか、3時間のダウンタイムになるかの分かれ目になります。
なぜホームラボにNetBoxなのか?
ネットワークスキャナーのことは一旦忘れましょう。NmapやAngry IP Scannerのようなツールは、ネットワーク上の「現在の状態」を教えてくれます。対してNetBoxは、「あるべき姿」を提示します。この違いは極めて重要です。NetBoxがあるIPは空いていると主張しているのに、スキャナーがアクティブだと示した場合、それは「野良」デバイスを見つけたか、ドキュメントの更新漏れがあることを意味します。NetBoxを使用して、具体的に以下の要素を標準化しましょう:
- IPAM: サブネット(プレフィックス)、IPアドレス、VRFの追跡。
- DCIM: 物理ラック、デバイスモデル、配線のマッピング。
- 仮想化: クラスターやVMを物理ハードウェアとは別にグループ化。
- データの整合性: AnsibleやTerraformなどの自動化ツールのためのセントラルAPIを提供。
Docker ComposeによるNetBoxのデプロイ
以前のNetBoxのインストールは、PostgreSQLのチューニングやRedisの依存関係の処理など、非常に骨の折れる作業でした。現在では、コミュニティが維持しているDocker版のおかげで、デプロイは非常に簡単です。データベースやワーカープロセスをホストOSから分離できるため、私はこの方法を好んで使っています。
1. 環境のセットアップ
まず、公式の netbox-docker リポジトリを取得します。私は整理整頓のため、インフラツールを ~/infra/netbox にまとめています。
mkdir -p ~/infra/netbox && cd ~/infra/netbox
git clone -b release https://github.com/netbox-community/netbox-docker.git .
次に、 docker-compose.override.yml ファイルを作成します。これにより、コアファイルとは別にカスタム設定を保持でき、将来のアップデートもコマンド一つで済むようになります。
version: '3'
services:
netbox:
ports:
- 8080:8080
2. 初期設定と起動
NetBoxを動作させるには環境変数が必要です。デフォルト設定は大抵の 192.168.1.0/24 環境で動作しますが、提供されているサンプルファイルを編集して簡単に調整できます。まずはイメージをプルしてスタックを起動しましょう。
# イメージをプルする
docker compose pull
# スタックを起動する
docker compose up -d
初回起動時にはデータベースのマイグレーションが実行されるため、通常45〜90秒ほどかかります。コンテナが正常に起動したら、ログイン用の管理者アカウントを作成する必要があります。
docker compose exec netbox /opt/netbox/netbox/manage.py createsuperuser
プロンプトに従ってユーザー名とパスワードを設定してください。これで、 http://your-server-ip:8080 からダッシュボードにアクセスできるようになります。
「信頼できる情報源」を構築する
むやみにボタンをクリックしたくなる衝動を抑えましょう。空のNetBoxインスタンスは白紙のキャンバスと同じであり、ドキュメント作成には論理的なフローが必要です。私がラボの標準化に使用している正確なワークフローをご紹介します。
物理的および論理的なスペースの定義
NetBoxは厳格です。IPアドレスを単独で存在させることはできません。まずは「組織(Organization)」から始めましょう:
- Sites(サイト): 「自宅」や「アパート」など、物理的な場所を定義します。
- Regions(リージョン): ローカルハードウェアに加えてリモートのVPSなども管理する場合に便利です。
- Racks(ラック): たとえ「ラック」がIKEAのテーブルだったとしても定義してください。後で機材の奥行きやRU(ラックユニット)の使用状況を可視化するのに役立ちます。
ネットワークのマッピング (IPAM)
ここからが本番です。**IPAM > Prefixes** に移動します。プレフィックスとは `10.0.10.0/24` のようなサブネットのことです。機能別のVLANごとにプレフィックスをグループ化することを強くお勧めします:
- VLAN 10 (管理用): 管理スイッチ、PDU、Proxmoxホストなど。
- VLAN 20 (信頼済み): メインのワークステーションやモバイルデバイス。
- VLAN 30 (IoT): インターネットから隔離されたスマート電球やカメラ。
- VLAN 40 (ゲスト用): 信頼できないデバイス用のサンドボックス。
プレフィックスが確定したら、**IP Addresses** を追加していきます。稼働中のデバイスは「Active(アクティブ)」に、来週末にデプロイ予定のものは「Reserved(予約済み)」に設定します。
デバイスの階層構造
NetBoxでは正確さが求められます。単に「サーバー」を追加することはできません。まず**Manufacturer**(メーカー、例:Dell)、次に**Device Type**(デバイスタイプ、例:PowerEdge R730)、そして最後に具体的な**Device**(デバイス)ユニットを定義する必要があります。一見過剰に思えますが、サーバーのどのNICがどのスイッチポートに接続されているかを思い出そうとするとき、この詳細さが真価を発揮します。
検証とメンテナンス
最大の罠は「ドキュメントの腐敗(Documentation Decay)」です。IPを変更したのにNetBoxの更新を忘れると、ツール自体が負債に変わります。正確性を維持するために、私は2つの方法を使っています。
1. ‘Ping’ による検証
NetBoxは自動スキャンを行いませんが、そのギャップを埋めることができます。以下は、 pynetbox を使用して、ステータスが「Active」なのにICMPに応答しないIPを特定し、アラートを表示するPythonスクリプトの断片です。
import pynetbox
import os
nb = pynetbox.api('http://localhost:8080', token='YOUR_API_TOKEN')
for ip in nb.ipam.ip_addresses.filter(status='active'):
address = str(ip).split('/')[0]
response = os.system(f"ping -c 1 -w 1 {address} > /dev/null 2>&1")
if response != 0:
print(f"アラート: {address} ({ip.dns_name}) に到達できません!")
2. 自動化との統合
自動化と連携させることで、NetBoxは単なるデジタルノートから強力なエンジンへと進化します。Ansibleを使用している場合は、NetBoxインベントリプラグインを活用しましょう。 hosts.ini ファイルにIPをハードコードする代わりに、AnsibleがNetBoxに直接問い合わせるようにします。これにより、ドキュメントそのものが構成(コンフィギュレーション)になります。
最後に
NetBoxのセットアップは、最初はデータ入力などの手間がかかります。しかし、次に深夜2時にネットワークループのトラブルシューティングをするとき、推測に頼る必要はなくなります。 `10.0.20.55` がVLAN 20に接続されたノード2上のDebian VMであることを正確に把握できるからです。推測はやめて、文書化を始めましょう。あなたの精神衛生が守られるはずです。

