てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Batfish] ネットワーク機器のコンフィグを読み込んでルーティングなどの様々な検証ができるツール「Batfish」の紹介

■ Batfish とは: 実機に接続することなくコンフィグを検証

f:id:akira6592:20181025150354p:plain

Batfish は、ネットワーク機器のコンフィグの様々な検証ができるツールです。 実機に接続する必要はありません。 準備したコンフィグファイルを読み込んでパースし、解析して内部でネットワーク機器が動作するようなイメージです。

本体は Java で書かれていて、Python から扱うためのクライアントである pybatfishもあります。 設定変更のコンフィグの妥当性を、あらかじめ Batfish で確認してから実機に投入する、というようなことが実現できるのではないかと、最近興味を持ちました。

この記事では、Batfish でできることなどの概要や、Docker、Jupyter Notebook を利用した試し方をご紹介します。

Cisco、Arista、Juniper、Palo Alto などの機器に対応

Batfish が対応している機器の一覧はこちらです。これらの機器の形式のコンフィグファイルを読み込むことができます。 https://github.com/batfish/batfish#what-configuration-formats-does-batfish-support

Cisco、Arista、Juniper、Palo Alto などの機器に対応しています。

情報ソース(デモ動画・プレゼン資料)

Batfish 公式サイトのトップにもリンク掲載されていますが、デモ動画やプレゼン資料などがあります。

チュートリアル動画

今後も Batfish の YouTube チャンネルで動画が増えるかもしれません。

プレゼン動画・資料

ブログ


■ Allinone の Docker イメージ でかんたんにお試しできる

Batfish には 2 つの公式 Docker イメージがあります。

イメージ1: batfish/batfish

batfish 本体の イメージです。 f:id:akira6592:20181026160249p:plain (数字はTCPポート番号)

イメージ2: batfish/allinone  ←今回はこちらを利用

batfish と かんたんにお試しできる Jupyter Notebook とサンプルコンフィグ入りイメージです f:id:akira6592:20181026230814p:plain

利用方法は、Dockerfile が管理されているリポジトリ batfish/dockerREADME.md に記載されています。 ここでは、batfish/allinone を利用して、簡単に動作を確認する方法をご紹介します。

もし、Docker コンテナを動かす環境が用意できない場合は、batfish/pybatfish リポジトリにある Jupyter Notebook の .ipynb ファイル で雰囲気がつかめます。 Play with Docker のような、ブラウザだけで Docker 環境を一定時間利用できるサービスを利用するという手段もあります。

コンテナの起動と Junipter Notebook へのログイン

docker run -p 8888:8888 batfish/allinone

コンテナ側で Jupyter Notebook が 8888/TCP ポートを空けているので、ホスト側からも 8888/TCP でアクセスできるようにポートマッピングしています。

コンテナが起動すると、以下のようなログが表示されます。

  • ログ
[root@centos7 ~]# docker run -p 8888:8888 batfish/allinone
[I 04:30:16.094 NotebookApp] Writing notebook server cookie secret to /data/.local/share/jupyter/runtime/notebook_cookie_secret
[I 04:30:16.779 NotebookApp] Serving notebooks from local directory: /notebooks
[I 04:30:16.779 NotebookApp] The Jupyter Notebook is running at:
[I 04:30:16.779 NotebookApp] http://(0320725b43c3 or 127.0.0.1):8888/?token=abcdef123456xxxx
[I 04:30:16.779 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 04:30:16.780 NotebookApp] No web browser found: could not locate runnable browser.
[C 04:30:16.780 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://(0320725b43c3 or 127.0.0.1):8888/?token=abcdef123456xxxx

上記のログの例では token=abcdef123456xxxx が Jupyter Notebook へログインするトークン情報です。この場合、以下のような URL で Jupyter Notebook へログインします。

http://localhost:8888/?token=abcdef123456xxxx

Notebook の選択

Jupyter Notebook にログインすると、以下の Notebook の一覧が表示されます。

f:id:akira6592:20181025150132p:plain

ここでは、一番初歩的そうな「Getting started with Batfish.ipynb」を選択して説明します。

なお、同じディレクトリにある networks ディレクトリの配下には、example-filtersexamples ディレクトリがあります。これらの 2つのディレクトリの中には、ネットワーク機器のコンフィグやホストの定義ファイルが含まれています。Batfish でこれらのディレクトリを指定すると、コンフィグなどを読み込んで、解析できる状態になります。

Getting started with Batfish

この Notebook は、大まかには以下の流れです。

  • networks/example ディレクトリに含まれる、ネットワーク機器(Cisco IOS)のコンフィグや、ホストの定義などを読み込み、スナップショットを作成する
  • 設定の抽出や、traceroute、ルーティングテーブルなどを検証する。

見出しだけ翻訳して、一部 "※" で注釈をつけた .ipynb ファイルを作成したので、以下に貼り付けます。

Getting started with Batfish (Japanese)

自身で準備したコンフィグで試すには

上記の例では SNAPSHOT_PATH = "networks/example"という指定で、 networks/example ディレクトリ配下のネットワーク機器のコンフィグやホスト定義ファイルを読み込んでいます。自身で準備したコンフィグなどを読み込ませたい場合は、以下のようなファイル、ディレクトリの配置にした上で、読み込むパスを変更します。

networks/mynet
|-- configs      # ネットワーク機器のコンフィグを格納
|   |-- router1.cfg 
|   `-- router2.cfg
|-- hosts         # ホスト定義ファイルを格納(batfish固有使仕様)(任意)
|   |-- host1.json
|   `-- host2.json
`-- iptables     # ホストに適用する iptables 定義ファイル(任意)
   |-- host1.iptables
   `-- host2.iptables

詳細は Packaging snapshots for analysis を参照してください。

また、コンテナ起動時に、別途用意したディレクトリをマウントするという方法もあります。 詳細は以下の記事を参照ください。

[Batfish] allinone イメージの Jupyter Notebook から自前のコンフィグディレクトリを利用可能にする方法 - てくなべ (tekunabe)


■ まとめ

ネットワーク機器のコンフィグを読み込んでルーティングなどの様々な検証ができるツール「Batfish」で、どんな事ができるかなど、雰囲気が伝わりましたでしょうか。 完全に実機と同じものとみなして検証することは難しいですが、補助的な検証には利用できるのではないでしょうか。 また、実機に接続する必要がなく、コンフィグだけ用意すればよい点も魅力的です。

私自身はまだ調べ始めたばかりです。また何か新しいことが分かったり試したりしたら、このブログに投稿したいしと思います。

参考

Ansible と Batfish を組み合わせた話の Webinar があるようです。

[2018/11/12 追記] 動画と資料がアップされました。

www.ansible.com

https://www.ansible.com/hubfs/2018_Content/Ansible-Intentionet-Webinar-Slides.pdf