Skip to content

batfish で interface_blacklist を使い、特定インターフェイスをダウンさせる

batfish を利用する際、「コンフィグは変更せずに特定インターフェイスをダウン状態とみなす」為には interface_blacklist というファイルを使います。 今回はこの interface_blacklist の使い方をメモしておきます。

検証環境

batfish は Docker コンテナとして起動済みであるものとします。 また、今回のディレクトリ構造は以下の通りです。

1
2
3
4
5
6
├── example
│   └── configs
│       ├── r1.cfg
│       ├── r2.cfg
│       └── r3.cfg
└── sample.py

batfish の解析対象であるコンフィグファイルとして、今回は以下を利用しました。

r1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
hostname r1
!
interface GigabitEthernet0/0
 ip address 10.12.1.1 255.255.255.0
 no shutdown
!
interface GigabitEthernet0/1
 ip address 10.12.2.1 255.255.255.0
 no shutdown
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0.0.0.0
!
end

r2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
hostname r2
!
interface GigabitEthernet0/0
 ip address 10.12.1.2 255.255.255.0
 no shutdown
!
interface GigabitEthernet0/1
 ip address 10.12.2.2 255.255.255.0
 no shutdown
!
interface GigabitEthernet0/2
 ip address 10.23.0.2 255.255.255.0
 no shutdown
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0.0.0.0
!
end

r3

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
hostname r3
!
interface GigabitEthernet0/2
 ip address 10.23.0.3 255.255.255.0
 no shutdown
!
router ospf 1
 network 0.0.0.0 255.255.255.255 area 0.0.0.0
!
end

確認用スクリプト

動作確認用のスクリプトには以下を使いました。 ipOwnersRoutes を利用しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import logging

from pybatfish.client.commands import *
from pybatfish.question import bfq
from pybatfish.question.question import load_questions

logging.getLogger("pybatfish").setLevel(logging.ERROR)
BASENAME = "example"
SNAPSHOT_PATH = "./" + BASENAME
SNAPSHOT_NAME = BASENAME + "_snapshot"
NETWORK_NAME = BASENAME + "_network"

bf_set_network(NETWORK_NAME)
bf_init_snapshot(SNAPSHOT_PATH, name=SNAPSHOT_NAME, overwrite=True)

load_questions()
result1 = bfq.routes(nodes="r1", protocols="ospf").answer().frame()
print(
    result1.sort_values(by=["Node", "VRF", "Protocol", "Network"]).to_string(
        index=False
    )
)

result2 = bfq.ipOwners().answer().frame()
print(result2.sort_values(by=["Node", "VRF", "Interface"]).to_string(index=False))

実行結果は以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ./sample.py
Node      VRF       Network Next_Hop_IP  Next_Hop_Interface Protocol Metric Admin_Distance   Tag
  r1  default  10.23.0.0/24   10.12.1.2  GigabitEthernet0/0     ospf      2            110  None
  r1  default  10.23.0.0/24   10.12.2.2  GigabitEthernet0/1     ospf      2            110  None
Node      VRF           Interface         IP Mask Active
  r1  default  GigabitEthernet0/0  10.12.1.1   24   True
  r1  default  GigabitEthernet0/1  10.12.2.1   24   True
  r2  default  GigabitEthernet0/0  10.12.1.2   24   True
  r2  default  GigabitEthernet0/1  10.12.2.2   24   True
  r2  default  GigabitEthernet0/2  10.23.0.2   24   True
  r3  default  GigabitEthernet0/2  10.23.0.3   24   True

インターフェイスをダウンさせる

特定インターフェイスをダウンさせるには interface_blacklist (拡張子は無し) というファイルを以下の内容で新規作成します。

1
2
[{"hostname": "r1", "interface": "GigabitEthernet0/1"},
 {"hostname": "r2", "interface": "GigabitEthernet0/1"}]

これをスナップショットパスの直下にアップロードします。 この時点で具体的なディレクトリ構造は以下になりました。

1
2
3
4
5
6
7
├── example
│   ├── configs
│   │   ├── r1.cfg
│   │   ├── r2.cfg
│   │   └── r3.cfg
│   └── interface_blacklist
└── sample.py

サンプルスクリプトの実行結果が以下のように変化しました。 r1 の Gi0/1 と r2 の Gi0/1 が interface_blacklist の内容に従って「ダウンしている」とみなされ、処理されていることが分かります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# ./sample.py
Node      VRF       Network Next_Hop_IP  Next_Hop_Interface Protocol Metric Admin_Distance   Tag
  r1  default  10.23.0.0/24   10.12.1.2  GigabitEthernet0/0     ospf      2            110  None
Node      VRF           Interface         IP Mask Active
  r1  default  GigabitEthernet0/0  10.12.1.1   24   True
  r1  default  GigabitEthernet0/1  10.12.2.1   24  False
  r2  default  GigabitEthernet0/0  10.12.1.2   24   True
  r2  default  GigabitEthernet0/1  10.12.2.2   24  False
  r2  default  GigabitEthernet0/2  10.23.0.2   24   True
  r3  default  GigabitEthernet0/2  10.23.0.3   24   True