ネットワーク設計と自動化

Batfish ばっとふぃっしゅ

ネットワーク検証コンフィグ解析Infrastructure as Codeネットワーク自動化静的解析Intent-Based Networking
Batfishについて教えて

簡単に言うとこんな感じ!

Batfishは、ネットワーク機器の設定ファイルを「実際につなげる前に」コンピューターの中で仮想的に動かして、「このルーター設定、本当に正しいかな?」を事前チェックできるツールだよ。本番環境を壊さずに”設定ミス”を見つけられる、ネットワーク版のテスト自動化ツールってこと!


Batfishとは

Batfishは、ルーターやスイッチなどのネットワーク機器に投入する**設定ファイル(コンフィグ)を解析し、実際の機器に触れることなくネットワーク全体の動作を静的に検証(シミュレーション)**するオープンソースツールです。「ネットワーク構成をコードとして管理・テストする」という考え方(Infrastructure as Code)を、ネットワーク運用に持ち込んだ代表的なプロジェクトとして知られています。

具体的には、Cisco・Juniper・Arista・PAN-OSなど多様なベンダーの設定ファイルを読み込み、ルーティングテーブルACL(アクセス制御リスト)ファイアウォールルールなどを仮想的に再現します。「このIPアドレスへの通信は通るか?」「このACL変更後にセキュリティホールが生まれないか?」といった問いに、実機ゼロで答えを出せるのが最大の特徴です。

もともとはMicrosoft Researchで研究されたネットワーク検証技術が起源で、現在はIntentionet社が中心となってOSSコミュニティで開発が続いています。ネットワーク変更のたびに深夜メンテナンスで「祈りながら投入」するスタイルから脱却するための、強力な武器として注目されています。


Batfishの主な機能と使いどころ

Batfishが「何を」「どうやって」検証するのかを整理すると、以下のようになります。

検証カテゴリ具体的にできること
到達性検証特定のIPアドレス間で通信が通る/ブロックされるかを確認
ACL・ファイアウォール解析アクセス制御リストのルールが意図通りか、抜け漏れがないかを確認
ルーティング検証BGPOSPFなどの経路が正しく広報・選択されているかを確認
差分比較(Differential Analysis)設定変更の前後でネットワーク動作に違いが出ないかを比較
設定バリデーションベストプラクティスへの準拠、設定の記述ミスを自動チェック

Batfishの検証フロー

Batfishを使った一般的なワークフローは次の通りです。

① 設定ファイルを収集(機器から吸い上げ or CI/CDパイプラインから取得)

② Batfishサーバーに読み込む(Dockerで起動するのが一般的)

③ Pythonライブラリ「pybatfish」でクエリを投げる

④ 結果をもとに「通過・ブロック・ルーティング経路」などを確認

⑤ NGなら設定を修正 → 再検証(ループ)

⑥ OKなら本番機器へ投入

覚え方

「Batfish(コウモリウオ)は暗闇でも安全を確認できる」 — 実際にネットワーク通信を流さなくても(暗闇の中でも)、反響定位のように論理的に経路を探知するイメージで覚えてみてください。


歴史と背景

  • 2013年頃 — Microsoft Researchにてネットワーク設定の形式的検証技術の研究が始まる。ネットワークの「バグ」を事前に数学的に検出するアプローチとして注目される
  • 2015年 — 学術論文「A General Approach to Network Configuration Verification」が発表され、技術的基盤が確立される
  • 2016年 — OSSとしてGitHubで公開(batfish/batfishリポジトリ)
  • 2018年 — 商用サポート・エンタープライズ向けサービスを提供するIntentionet社が設立される
  • 2019年〜Pythonライブラリ pybatfish の整備が進み、Jupyter Notebookでの対話的な検証が普及。NetDevOpsムーブメントの中で急速に認知度が向上
  • 2020年〜現在GitHub Actions・GitLab CIなどとの統合が進み、「ネットワーク変更のPull Requestにテストを仕込む」運用スタイルが浸透しつつある

従来の検証方法との比較・Batfishの位置づけ

ネットワーク変更を本番投入する前の検証手段は、大きく3つのアプローチがあります。

目視・手動確認 (従来型) 人間がコンフィグを 目で読んでチェック スキルへの依存度大 見落としリスクあり スケールしない (台数が増えると限界) コスト:低 精度:△ 自動化:✗ 物理テストベッド (検証環境構築) 実機と同等の検証環境を 別途用意して検証 精度は高いが コストが膨大 環境維持・同期が 大きな運用負荷に コスト:高 精度:◎ 自動化:△ Batfish (静的解析・自動検証) 設定ファイルだけで 論理動作をシミュレート CI/CDに組み込んで 完全自動化が可能 実機・物理環境が 不要でスケール容易 コスト:低〜中 精度:○〜◎ 自動化:◎

対応ベンダー・プラットフォーム

Batfishは以下のような主要ネットワークベンダーの設定ファイルをサポートしています(代表的なもの)。

ベンダー対応OS・プラットフォーム
CiscoIOS / IOS-XE / IOS-XR / NX-OS
JuniperJunOS
AristaEOS
Palo Alto NetworksPAN-OS
FortinetFortiOS
AWSVPC・Security Group・Route Table(クラウドNW)
AzureVirtual Network 設定

pybatfishの使い方(イメージ)

from pybatfish.client.session import Session
from pybatfish.datamodel.flow import HeaderConstraints

# Batfishサーバーに接続
bf = Session(host="localhost")

# ネットワークと設定スナップショットを読み込む
bf.set_network("my-network")
bf.init_snapshot("./configs/", name="pre-change")

# 到達性チェック: 10.0.0.1 → 10.0.0.2 の通信が通るか?
result = bf.q.reachability(
    pathConstraints=None,
    headers=HeaderConstraints(srcIps="10.0.0.1", dstIps="10.0.0.2")
).answer()

print(result.frame())

関連する規格・RFC

※ BatfishはOSSツールであり特定のRFCを定義するものではありませんが、解析対象のプロトコルに関連するRFCが存在します。

規格・RFC番号内容
RFC 4271BGP-4(Batfishが解析対象とする主要ルーティングプロトコル)
RFC 2328OSPFv2(Batfishがサポートするルーティングプロトコル)
RFC 3168ECN(ネットワーク到達性検証の基礎となるIP仕様)
RFC 791IPv4(Batfishが解析するパケットヘッダーの基盤仕様)

関連用語

  • Infrastructure as Code — インフラ構成をコードとして管理・バージョン管理する考え方
  • ネットワーク自動化 — ネットワーク機器の設定・運用作業をスクリプトやツールで自動化すること
  • CI/CD — コードの変更を自動でテスト・デプロイするパイプラインの仕組み
  • ACL(アクセス制御リスト) — ネットワーク上の通信を許可・拒否するためのルールリスト
  • BGP — インターネット上でAS間の経路情報を交換するルーティングプロトコル
  • OSPF — 組織内ネットワークで使われるリンクステート型ルーティングプロトコル
  • Intent-Based Networking — 「何をしたいか(意図)」を定義するとネットワークが自動設定される次世代NW管理概念
  • NetDevOps — ネットワーク運用にDevOpsの考え方(自動化・CI/CD)を適用するアプローチ