HiRoLabブログ

HiRoのゆるふわIT備忘録

batfishを使ってみた

はじめに

今まではAnsibleを使ったconfigの自動的に機器に設定するなどやってきた。
しかし、ネットワークconfigの検証の記事がかけてないと思い。
そこでネットワークconfig分析を行うためにbatfishというツールを使ってみた。

動作環境

Docker on Mac OS

目次

検証内容

R1.cfg/R2.cfgといった2つのconfigを用意 configの中身はシンプルにIPアドレスが重複してるものとなっている。 そのconfigをbatfishにて被っているかを検出する。

環境構築

まずは環境構築

batfishのコンテナが提供されている為それを使用する。
下記が今回使用するコンテナイメージである。
・batfish/allinone

コンテナを起動

docker run -d -p 8888:8888 --name batfish batfish/allinone

すると下記のように起動していることを確認。

$docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED              STATUS              PORTS                                      NAMES
a720fad08ed5   batfish/allinone                 "./wrapper.sh"           About a minute ago   Up About a minute   0.0.0.0:8888->8888/tcp, 9996-9997/tcp      batfish

検証対象のconfig

・R1.cfg

hostname R1
!
enable password cisco
!
username cisco password 0 cisco
no aaa new-model
!
interface Vlan1
 ip address 192.168.100.20 255.255.255.0
!
end

・R2.cfg

hostname R2
!
enable password cisco
!
username cisco password 0 cisco
no aaa new-model
!
interface Vlan1
 ip address 192.168.100.20 255.255.255.0
!
end

上記のcfgファイルをコンテナのconfigsディレクトリにコピーして置いてください。
コピー方法は下記です。

docker cp R1.cfg batfish:/notebooks/networks/example/batfish_test/configs
docker cp R2.cfg batfish:/notebooks/networks/example/batfish_test/configs

batfish_testディレクトリに関して今回検証用に作成したディレクトリであるため好きな名前のディレクトリで実施してください。
デフォルトではexampleディレクトリが用意されておりそれでも大丈夫です。
ディレクトリを新たに作成する場合、配下にconfigディレクトリとhostsディレクトリとiptablesディレクトリがあることに注意してください。

検証

このコンテナには既にbatfishを動かす為の、pybatfishがinstallされている為、
batfishコンテナでpython3を実行して検証を行う。
対象のコンテナで特定のコマンドを実行させる方法は下記です。

docker exec -it batfish python3

対象のコンテナでpython3を実行できたら下記にて必要なモジュールと設定ファイルを読み込みます。
bf_init_snapshotのパラメーターは個人のものに合わせてください。

>>> from pybatfish.client.commands import *
>>> from pybatfish.question.question import load_questions
>>> from pybatfish.question import bfq
>>> load_questions()
Successfully loaded 64 questions from remote
Successfully loaded 64 questions from remote
>>> bf_init_snapshot('/notebooks/networks/example/batfish_test/', name='test', overwrite=True)
status: TRYINGTOASSIGN
.... no task information
status: TRYINGTOASSIGN
.... no task information
status: CHECKINGSTATUS
.... no task information
status: CHECKINGSTATUS
.... no task information
status: CHECKINGSTATUS
.... no task information
status: CHECKINGSTATUS
.... 2021-04-11 14:51:35.363000+00:00 Serializing 'org.batfish.representation.host.HostConfiguration' instances to disk 0 / 2.
status: CHECKINGSTATUS
.... 2021-04-11 14:51:35.363000+00:00 Serializing 'org.batfish.representation.host.HostConfiguration' instances to disk 2 / 2.
status: CHECKINGSTATUS
.... 2021-04-11 14:51:35.363000+00:00 Parse network configs 0 / 2. (00:00:05 elapsed)
status: CHECKINGSTATUS
.... 2021-04-11 14:51:35.363000+00:00 Serializing 'org.batfish.representation.cisco.CiscoConfiguration' instances to disk 0 / 2. (00:00:07 elapsed)
status: CHECKINGSTATUS
.... 2021-04-11 14:51:35.363000+00:00 Reading, unpacking, and deserializing files containing 'org.batfish.vendor.VendorConfiguration' instances 2 / 4. (00:00:08 elapsed)
status: CHECKINGSTATUS
.... 2021-04-11 14:51:35.363000+00:00 Serializing 4 vendor-independent configuration structures for snapshot a3779dc8-c69e-4307-b786-24e2fd3a1335 0 / 4. (00:00:11 elapsed)
status: CHECKINGSTATUS
.... 2021-04-11 14:51:35.363000+00:00 Deserializing objects of type 'org.batfish.datamodel.Configuration' from files 4 / 4. (00:00:13 elapsed)
status: TERMINATEDNORMALLY
.... 2021-04-11 14:51:35.363000+00:00 Deserializing objects of type 'org.batfish.datamodel.Configuration' from files 4 / 4. (00:00:17 elapsed)
Default snapshot is now set to test
status: CHECKINGSTATUS
.... no task information
status: CHECKINGSTATUS
.... 2021-04-11 14:51:57.425000+00:00 Begin job.
status: TERMINATEDNORMALLY
.... 2021-04-11 14:51:57.425000+00:00 Begin job.
'test'

次でIPアドレス被りがあるか確認できる。

>>> bfq.ipOwners(duplicatesOnly=True).answer().frame()
status: TRYINGTOASSIGN
.... no task information
status: CHECKINGSTATUS
.... no task information
status: CHECKINGSTATUS
.... no task information
status: CHECKINGSTATUS
.... 2021-04-11 14:52:53.437000+00:00 Begin job.
status: TERMINATEDNORMALLY
.... 2021-04-11 14:52:53.437000+00:00 Begin job.
  Node      VRF Interface              IP Mask Active
0   r2  default     Vlan1  192.168.100.20   24   True
1   r1  default     Vlan1  192.168.100.20   24   True

参考資料

pybatfish.readthedocs.io

おわりに

本ツールは他にも様々な検証に使えるため、色々と使って記事にしようと思う。