これは Batfish Advent Calendar 2018 の2日目の記事です。
■ はじめに
ネットワークコンフィグ解析ツール Batfish は、ネットワーク機器のコンフィグファイルなどを読み込んで、 ACL や経路などの妥当性をチェックできます。
読み込みの際に、ネットワーク名とスナップショット名という単位が利用されます。1つのネットワークに対して、複数のスナップショットを作成できるという関係です。
一つのネットワーク、一つのスナップショットだけを解析する場合は、あまり意識しなくても良いかもしれませんが、2つのスナップショット間の差分を検出したい等の場合は意識する必要があります。(例:ACLを変更する前後のスナップショットで差分を検出するsearchFilters
)
この記事では、ネットワーク名のスナップショット名の関係についてもう少し詳しくご紹介します。
なお、Batfish の概要については以下の記事を参照してください。 https://tekunabe.hatenablog.jp/entry/2018/10/25/batfish
※ docker イメージ batfish/allinone のイメージID 1aa82919f0ae を利用して動作確認しています。
■ 「ネットワーク」は論理的なグループ名
ネットワークとは、ルーターやリンク情報をまとめた論理的なグループです。
Batfish の Python クライアントである pybatfish では、bf_set_network
にネットワーク名(任意)を指定します。
■ 「スナップショット」は一次的な状態の保存
スナップショットとは、以下の情報を読み込んで、一次的な状態として保存したものです。
- コンフィグファイル
- ネットワーク機器のコンフィグファイル
- Cisco IOS であれば
show running-config
で取得したような内容 config
ディレクトリに格納しておく- 例: https://github.com/batfish/pybatfish/tree/master/jupyter_notebooks/networks/example/configs
- ホスト定義
- 仮想的なホストのホスト名、IPアドレスなどの定義
hosts
ディレクトリに格納しておく- 例: https://github.com/batfish/pybatfish/tree/master/jupyter_notebooks/networks/example/hosts
- iptables 定義
- 各ホストに適用する iptables の定義
iptables
ディレクトリに格納しておく- 例: https://github.com/batfish/pybatfish/tree/master/jupyter_notebooks/networks/example/iptables
pybatfish では、bf_init_snapshot
に、上記の3情報をとまとめたディレクトリ(または ZIP ファイル)、スナップショット名(任意)を指定します。
■ 「ネットワーク」と「スナップショット」の関係をディレクトリ構造から探る
前述したように「ネットワーク」と「スナップショット」は、1つのネットワークに対して、複数のスナップショットを作成できるという関係です。
この関係は、pybatfish で、bf_set_network
や、bf_init_snapshot
を実行した時に Batfish 本体のコンテナ側に作成されるディレクトリやファイルから、詳細を探ることができます。
なお、コンテナ側に作成される各ディレクトリは、以下のようにホストにマウントしておくと、永続的に扱うことができます。
docker run -it --privileged -v $(pwd)/data:/data -p 8888:8888 batfish/allinone
ネットワーク単位のディレクトリ
bf_set_network
を実行すると、コンテナ側の /data/containers
ディレクトリ配下に、ネットワーク単位のディレクトリが作成されます。
このネットワーク単位のディレクトリ名(ネットワークID)は、/data/containers/network_ids
ディレクトリ配下の、 <ネットワーク名>.id
というファイル名のテキストファイルの中に記載されています。
たとえば、ネットワーク名が example_network
であれば、以下のようになります。
/data/containers/network_ids/example_network.id
ファイル内に、ネットワークIDが記載される/data/containers/<ネットワークID>
ディレクトリがネットワーク単位のディレクトリ
スナップショット単位のディレクトリ
スナップショット単位のディレクトリは、ネットワーク単位のディレクトリの下に作成されます。
このスナップショット単位のディレクトリ名(スナップショットID)は、/data/containers/<ネットットワークID>/snapshot_ids
ディレクトリ配下の、<スナップショット名>.id
というファイル名のテキストファイルの中に記載されています。
たとえば、スナップショット名が example_spapshot1
であれば、以下のようになります。
/data/containers/<ネットワークID>/snapshot_ids/example_spapshot1.id
ファイル内に、スナップショットIDが記載される/data/containers/<ネットワークID>/snapshots/<スナップショットID>
ディレクトリがスナップショット単位のディレクトリ
それぞれの関係まとめ
ネットワーク単位、スナップショット単位のディレクトリの関係をまとめると、以下のようになります。
※以下の条件でスナップショットをとった例です。
- ネットワーク名: example_network
- スナップショット名: example_snapshot1、example_snapshot2
■ 名前を省略すると自動で名前がつけられる
リファレンスを見ると分かるように、bf_set_network
のパラメーター name
や、bf_init_snapshot
のパラメーター name
は必須ではありません。つまり、ネットワーク名やスナップショット名の指定は任意です。
たとえば、ネットワーク名の指定を省略して bf_set_network()
のように実行すると、実行するたびに pcp5d5578e1-8289-4089-95ae-3ead1de3581e
や pcp358f3dd4-e5db-452a-84f7-7d60ce62ad68
のようなネットワーク名が自動で付けられ、ネットワーク単位のディレクトリが作成されます。
スナップショット名も、省略して bf_init_snapshot("networks/example")
のように実行すると、実行するたびに ss_d30ce36c-7829-4884-a7a3-575ccf0db272
や ss_22f03c3f-0cf3-41ff-90ef-8504baa445a4
のようなスナップショット名が自動で付けられ、スナップショット単位のディレクトリが作成されます。
■ まとめ
ネットワーク名とスナップショット名の関係を、ディレクトリ視点で確認してみました。 ディレクトリの構造を知っておくと、デバッグに役に立つかもしれませんので、何かのときに思い出していただければと思います。
参考
入門的なチュートリアル Notebook https://github.com/batfish/pybatfish/blob/master/jupyter_notebooks/Getting%20started%20with%20Batfish.ipynb