BatfishのQuestion一覧と概要説明


# はじめに

Batfishは、ネットワーク機器のスナップショット(Config等)に対し、**Question**を使って様々な問い合わせを行います。
Questionの例として、[Advent Calender 3日目](https://qiita.com/tech_kitara/private/5bca73ee40124d6eabab)で紹介したnodePropertiesや、[Advent Calender 4日目](https://qiita.com/tech_kitara/private/89712bd086a623260464)で紹介したinterfacePropertiesがあります。他にも、2018年11月末時点で、42種類のQuestionが提供されています。
本記事では、各Questionでできることの概要をまとめたいと思います。


# Questionの仕組み

以下URLの情報をもとに、イメージを図で表してみました。
https://github.com/batfish/batfish/tree/master/questions

まずPybatfish(クライアント)でJSON形式のQuestionテンプレートをロードします。次に、ユーザが定義したノード名やプロパティ等の変数をテンプレート内に埋め込みます。このテンプレートを使ってBatfishサービス(コーディネーター)にREST APIリクエストをかけ、内容に従ったスナップショットの解析を行い、結果をPybatfishに返すという流れになります。

![4-2.png](https://qiita-image-store.s3.amazonaws.com/0/310082/d033e4a2-06fd-54cb-840a-78052f5d6d36.png)


# Batfishで使用可能なQuestion

- 一覧は以下URLに掲載されています。

　[Web版]　https://pybatfish.readthedocs.io/en/latest/questions.html#module-pybatfish.question.bfq
　[PDF版]　https://media.readthedocs.org/pdf/pybatfish/latest/pybatfish.pdf

- QestionテンプレートのJSONファイルを見たい方は以下を参照願います。

　https://github.com/batfish/batfish/tree/master/questions

- 現在も活発に開発が行われており、StableとExperimentalの2つのカテゴリーが存在します。

　**Stable：** 恒久的なもので、今のところ今後もサポートしていく予定。
　**Experimental：** 現在はサポートされているが、今後リプレイスや廃止の可能性あり。Stableに移行する可能性もある。

- 原文をそのまま日本語にすると分かりづらいのもあるので、実際に実行してみた結果をもとに、具体例を交えて記載しています。気になるQuestionがあれば、原文やチュートリアルを見てみて下さい。

- 参考情報として、Stable(S)/Experimental(E)の区分や、公式チュートリアルがあるか(★)も記載しました。

- 一部Questionの実行結果、解析対象のConfigファイルをGistに保管してありますので、見比べながら表を見て頂くと分かりやすいかもしれません。

https://gist.github.com/Tachashi/f63afb5693140687007756f16517fb37


####Question一覧

| No. | Question           | 内容                  | 区分 |
|:---:|:-----------------|:------------------|:----------:|
| 1   | aaaAuthenticationLogin          | AAA認証が適用されていないline(aux、con、vty)を出力 | S |
| 2   | bgpPeerConfiguration          | BGPピア設定情報を出力 | E |
| 3   | bgpProcessConfiguration          | BGPプロセス設定情報を出力 | E |
| 4   | bgpSessionCompatibility          | 設定したBGPセッションのステータスを出力(対向機器の設定は考慮しない) | E |
| 5   | bgpSessionStatus          | 設定したBGPセッションのステータスを出力 | E |
| 6   | definedStructures          | ネットワーク内で定義された構造をリストアップ。具体的には、インターフェース、クラスマップ、ポリシーマップ、ACL名等を抽出し、それが何行目から何行目までに設定されているかを出力 | S |
| 7   | detectLoops          | ループを検出 | E |
| 8   | differentialReachability          | ある構成(現状)では許可されるが、別の構成(設定後)ではドロップされるフローを検出 | E★ |
| 9   | edges          | 指定したタイプ(layer3、BGP、OSPF、EIGRP等)のネイバー関係をリストアップ | S★ |
| 10  | fileParseStatus          | ファイルのパース(構文解析)ステータスを表示。問題なければPASS、Batfishがうまくパースできない行があった場合、PARTIALLY_UNRECOGNIZEDやFAILと表示される | S★ |
| 11  | filterLineReachability          | 前の行でより広い範囲をカバーするACL行があるために、評価されないACL行を特定 | E★ |
| 12  | filterTable          | あるQuestionに対する回答をさらにフィルタする | E |
| 13  | interfaceMtu          | MTU値が、指定した条件と合致するインターフェースを出力。"<"などの比較演算子を使い、例えば1500より小さいものを出力することが可能 | E |
| 14  | interfaceProperties          | インターフェース設定のプロパティを出力 | E★ |
| 15  | ipOwners          | スナップショット内の全機器のIPアドレス、インターフェース、ノード、VRFのマッピングを出力 | S |
| 16  | ipsecSessionStatus          | 設定したIPSecセッションのステータスを出力 | S |
| 17  | multipathConsistency          | マルチパスのルーティングが存在する中で、経路によって異なる扱いを受けるフローを検出 | E★ |
| 18  | namedStructures          | ACLやVRF等の名称と中身を構造化されたデータとして出力 | E |
| 19  | neighbors          | スナップショット内機器における、特定のレイヤー(layer3、eBGP、iBGP、OSPF、EIGRP等)のネイバー関係をリストアップ | E |
| 20  | nodeProperties          | ノード設定のプロパティを出力 | E★ |
| 21  | nodes          | 各ノードのすべて(もしくはサマリー）の設定パラメータを、ベンダー非依存のデータモデルの形で、JSON辞書形式で出力 | E |
| 22  | ospfProperties          | OSPFルーティングプロセスに関する設定パラメータを出力 | E |
| 23  | parseWarning          | パース出来なかったConfig、行番号、コメントを出力 | S★ |
| 24  | prefixTracer          | あるプレフィックス(A.B.C.D/Y)のネットワークへの伝播をトレース | E |
| 25  | reachability          | 入力/出力箇所、送信元/宛先IPアドレス、配置上の制約にマッチするフローを検出 | E★ |
| 26  | referencedStructures          | ACL、クラスマップ等と、それを参照する設定(アクセスグループ、ポリシーマップ）と行番号を出力 | S |
| 27  | resolveFilterSpecifier          | 各ノードが持つACL名、ACL番号の一覧を出力 | E |
| 28  | resolveInterfaceSpecifier          | 各ノードが持つインターフェース名の一覧を出力 | E |
| 29  | resolveIpSpecifier          | IP指定子によって解決された値を出力 | E |
| 30  | resolveIpsOfLocationSpecifier          | 各ノードが持つインターフェースとそのIPアドレスの一覧を出力 | E |
| 31  | resolveLocationSpecifier          | 各ノードのインターフェースのロケーション(インターフェース名やノード名)の一覧を出力 | E |
| 32  | resolveNodeSpecifier          | 各ノードのノード名を出力 | E |
| 33  | routes          | 特定のノード、VRF、RIB(main/bgp/bgpmp)に関するルート情報を出力 | S★ |
| 34  | searchFilters          | あるFilter/ACLが対象フローを許可、拒否したり、特定の行にマッチするか検索 | E★ |
| 35  | testFilters          | 特定のフローが、特定のfilter/ACLによってどのように処理されるかを検出 | S★ |
| 36  | traceroute          | 指定した開始ノードから宛先へ仮想的なTracerouteを行う。実際のTracerouteと異なり、各ホップの戻り通信がNGでもIPアドレスは返してくれる | E★ |
| 37  | undefinedReferences          | 参照しているACL等が、実際には定義されていないケースを検知(場合によっては、深刻な結果を招くミスの可能性あり) | S★ |
| 38  | unusedStructures          | ACL、ルートマップ等が定義されているが、使われていないケースを検知(Config誤り等の可能性あり) | S |
| 39  | viModel          | すべての設定パラメータとネイバー関係を、ベンダー非依存のデータモデルの形で、JSON辞書形式で出力 | E |
| 40  | viConversionWarning          | ベンダー非依存モデルに変換したときに発生したWarningを出力 | S |
| 41  | loopbackMultipathConsistency          | マルチパスのルーティングが存在する中で、経路によって異なる扱いを受けるLoopback間のフローを検出 | E |
| 42  | subnetMultipathConsistency          | マルチパスのルーティングが存在する中で、経路によって異なる扱いを受けるサブネット間のフローを検出 | E |


# 最後に
今回調べていく中で、Batfishが強力なネットワーク解析ツールであることを改めて実感しました。
個人的に興味を持ったQuestionについて、もう少し踏み込んだ内容を別の記事で紹介できればと思います。
あと、Advent Calendarはまだまだ空いていますので、みなさんも是非触ってみた結果を共有してもらえると嬉しいです！:grin: