はじめに
Batfishは、ネットワーク機器のスナップショット(Config等)に対し、Questionを使って様々な問い合わせを行います。
Questionの例として、Advent Calender 3日目で紹介したnodePropertiesや、Advent Calender 4日目で紹介したinterfacePropertiesがあります。他にも、2018年11月末時点で、42種類のQuestionが提供されています。
本記事では、各Questionでできることの概要をまとめたいと思います。
Questionの仕組み
以下URLの情報をもとに、イメージを図で表してみました。
https://github.com/batfish/batfish/tree/master/questions
まずPybatfish(クライアント)でJSON形式のQuestionテンプレートをロードします。次に、ユーザが定義したノード名やプロパティ等の変数をテンプレート内に埋め込みます。このテンプレートを使ってBatfishサービス(コーディネーター)にREST APIリクエストをかけ、内容に従ったスナップショットの解析を行い、結果をPybatfishに返すという流れになります。
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に保管してありますので、見比べながら表を見て頂くと分かりやすいかもしれません。
####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はまだまだ空いていますので、みなさんも是非触ってみた結果を共有してもらえると嬉しいです!