■ Batfish とは: 実機に接続することなくコンフィグを検証
Batfish は、ネットワーク機器のコンフィグの様々な検証ができるツールです。 実機に接続する必要はありません。 準備したコンフィグファイルを読み込んでパースし、解析して内部でネットワーク機器が動作するようなイメージです。
本体は Java で書かれていて、Python から扱うためのクライアントである pybatfishもあります。 設定変更のコンフィグの妥当性を、あらかじめ Batfish で確認してから実機に投入する、というようなことが実現できるのではないかと、最近興味を持ちました。
明日調べる / Batfish "An open source network configuration analysis tool" https://t.co/eoAHh8QW0l
— よこち(yokochi) (@akira6592) 2018年10月8日
この記事では、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 公式サイトのトップにもリンク掲載されていますが、デモ動画やプレゼン資料などがあります。
チュートリアル動画
- Getting Started with Batfish
- 一番最初に見ると良さそうなデモ動画
- Validating Configuration Settings with Batfish
- NTP サーバーが設定されているか、などコンフィグを検証するデモ動画
- Analyzing Routing Tables with Batfish
- ルーティングテーブルを検証するデモ動画
- Analyzing ACLs and Firewall Rules
- ACL や ファイヤウォールのルールを検証するデモ動画
- 指定の条件のパケットがどのノードのどのルールにマッチするかなど
今後も Batfish の YouTube チャンネルで動画が増えるかもしれません。
プレゼン動画・資料
- NANOG 65 : Proactive Network Configuration Validation with Batfish
- NANOG 70 : Minesweeper and Propane: Two Tools for Improving Network Reliability
ブログ
■ Allinone の Docker イメージ でかんたんにお試しできる
Batfish には 2 つの公式 Docker イメージがあります。
イメージ1: batfish/batfish
batfish 本体の イメージです。 (数字はTCPポート番号)
イメージ2: batfish/allinone ←今回はこちらを利用
batfish と かんたんにお試しできる Jupyter Notebook とサンプルコンフィグ入りイメージです
利用方法は、Dockerfile が管理されているリポジトリ batfish/dockerの README.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 へログインします。
Notebook の選択
Jupyter Notebook にログインすると、以下の Notebook の一覧が表示されます。
- Analyzing ACLs and Firewall Rules.ipynb
- Getting started with Batfish.ipynb
- Introduction to Route Analysis.ipynb
- Provably Safe ACL and Firewall Changes.ipynb
- Validating Configuration Settings.ipynb
ここでは、一番初歩的そうな「Getting started with Batfish.ipynb」を選択して説明します。
なお、同じディレクトリにある networks
ディレクトリの配下には、example-filters
と examples
ディレクトリがあります。これらの 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 追記] 動画と資料がアップされました。
https://www.ansible.com/hubfs/2018_Content/Ansible-Intentionet-Webinar-Slides.pdf