LGTM

Looks Good To Me

inet-henge 利用例: Batfish ネットワークトポロジーの可視化

inet-henge を使うと、ネットワーク図を簡単に描画できます。

github.com

必要なのは「このデバイスは、あのデバイスとつながっている」という構成情報のみ。

{
  "nodes": [
    { "name": "A" },
    { "name": "B" }
  ],

  "links": [
    { "source": "A", "target": "B" }
  ]
}

このエントリーでは、Batfish が持っているネットワークトポロジーをinet-henge をつかって可視化してみます。 たとえば、👇のようなネットワーク図が描けます。

Batfish とは

Batfish はネットワークコンフィグ分析ツールで、実機に投入せずとも confiuration validation / 各種プロトコルの状態確認 / ルーティングテーブルやACL分析が可能です。

その一環として、IPアドレスを元に layer-3 interface adjacencies を判定しネットワーク構成をデータ化する、ということもやっています。

詳細は こちら をご覧ください。

API で、Batfish ネットワークトポロジーを取得する

Batfish が持っているネットワークトポロジーは、👇のようなURLからAPIで取得できます。

http://<batfish_server>:9996/v2/networks/<network>/snapshots/<snapshot>/topology

チュートリアルGetting Started with Batfish を試す場合でいえば、Batfish サーバーである 9996/tcp を公開しておけばOKです。

$ docker run --rm -p 8888:8888 -p9996:9996 batfish/allinone
[I 17:02:05.649 NotebookApp] Writing notebook server cookie secret to /data/.local/share/jupyter/runtime/notebook_cookie_secret
[I 17:02:05.892 NotebookApp] Serving notebooks from local directory: /notebooks
[I 17:02:05.892 NotebookApp] The Jupyter Notebook is running at:
[I 17:02:05.892 NotebookApp] http://(5df00b13e028 or 127.0.0.1):8888/?token=2a0b09ed8f6a1aea73fc1f4e9360696224ec1d4bcbe646b5
[I 17:02:05.892 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 17:02:05.895 NotebookApp] No web browser found: could not locate runnable browser.
[C 17:02:05.895 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///data/.local/share/jupyter/runtime/nbserver-9-open.html
    Or copy and paste one of these URLs:
        http://(5df00b13e028 or 127.0.0.1):8888/?token=2a0b09ed8f6a1aea73fc1f4e9360696224ec1d4bcbe646b5

APIリクエストにX-Batfish-Version: 0.36.0 のようなHTTPヘッダーが必要な点にもご注意ください。

レスポンス例

$ curl -H "X-Batfish-Version: 0.36.0" http://localhost:9996/v2/networks/example_network/snapshots/example_snapshot/topology
[ {
  "node1" : "as1border1",
  "node1interface" : "GigabitEthernet0/0",
  "node2" : "as1core1",
  "node2interface" : "GigabitEthernet1/0"
}, {

...

inet-henge による可視化

Batfish が吐くデータ構造を、inet-henge が期待する形に変換します。

サンプルをこちらに掲載しますが、さほど複雑ではありません。 https://gist.github.com/codeout/07f3f711a7f0b5adec7fc8065b0f3958

コマンド等による前処理が面倒なため、ブラウザからBatfish APIを呼んでいます。

inet-henge によるネットワーク図

拡大するとインターフェイス名が現れます。

チュートリアル中にあるネットワーク図

(https://github.com/batfish/pybatfish/blob/master/jupyter_notebooks/Getting%20started%20with%20Batfish.ipynb)

まとめ

inet-henge によるネットワーク図は オートレイアウトのため、ひょっとすると好みの出力を得られないかもしれません。しかしながら「見てわかる」程度のネットワーク図を描くことが可能です。

HTMLをひとつ置いておくだけで、前処理なしでBatfish のネットワーク図が見れるというのは便利ですね!