はじめに
今までは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
参考資料
おわりに
本ツールは他にも様々な検証に使えるため、色々と使って記事にしようと思う。