NWエンジニアの勉強ブログ

NWエンジニアです。勉強した内容を気ままにまとめていきます。

OSPFでdistribute-listを使用する際にベストLSAをフィルタリングする【Cisco】

こんにちは。
今回は、OSPFネットワークにおいて、distribute-listを使用し、ベストLSA(ベストパスとなるLSA)をフィルタリングした時の仕様について検証したので、アウトプットします。なお、下記の公式ドキュメントを参考にしました。
OSPF distribute-list の実装変更について - Cisco Community

検証構成1


R2およびR3が172.20.1.0/24のルートをOSPFドメインに再配布しています。この時、R2ではメトリックを200とし、タグ200を付与、R3ではメトリックを300とし、タグ300を付与しています。これにより、R1は172.20.1.0/24に関するLSAを受け取った際に、R2からのLSAをベストLSAとしルーティングテーブルに載せます。

投入コンフィグ

R2とR3に投入したコンフィグは下記の通りです。

R2
router ospf 1
 redistribute connected metric 200 subnets tag 200
 network 192.168.1.0 0.0.0.255 area 0
 distribute-list 10 out
!
access-list 10 deny   10.2.2.2
access-list 10 permit any

R3
router ospf 1
 redistribute connected metric 300 subnets tag 300
 network 192.168.1.0 0.0.0.255 area 0
 distribute-list 10 out
!
access-list 10 deny   10.3.3.3
access-list 10 permit any

R1のルーティングテーブルとLSDB

R2とR3にて経路制御を行ったため、R1にて想定通りのルーティングテーブルとLSDBとなっているかを確認します。

R1#sh ip ro | b las
Gateway of last resort is not set

      10.0.0.0/32 is subnetted, 1 subnets
C        10.1.1.1 is directly connected, Loopback0
      172.20.0.0/24 is subnetted, 1 subnets
O E2     172.20.1.0 [110/200] via 192.168.1.2, 00:15:55, FastEthernet0/0
      192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.1.0/24 is directly connected, FastEthernet0/0
L        192.168.1.1/32 is directly connected, FastEthernet0/0
R1#
R1#sh ip os d

            OSPF Router with ID (10.1.1.1) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
10.1.1.1        10.1.1.1        1142        0x80000002 0x00E040 2
10.2.2.2        10.2.2.2        1138        0x80000002 0x00B184 1
10.3.3.3        10.3.3.3        1143        0x80000002 0x0089A5 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.1.3     10.3.3.3        1138        0x80000002 0x005B29

                Type-5 AS External Link States

Link ID         ADV Router      Age         Seq#       Checksum Tag
172.20.1.0      10.2.2.2        1180        0x80000001 0x00CF81 200
172.20.1.0      10.3.3.3        1183        0x80000001 0x00B3D1 300

172.20.1.0/24のベストルートとして、R2をネクストホップとしたルートが選択されていることがルーティングテーブルからわかります。
Link ID 172.20.1.0について、二つのLSA(Type-5)を受信していることが確認できましたが、もう少し詳しく確認してみます。

R1#sh ip os d external 172.20.1.0

            OSPF Router with ID (10.1.1.1) (Process ID 1)

                Type-5 AS External Link States

  Routing Bit Set on this LSA in topology Base with MTID 0
  LS age: 1323
  Options: (No TOS-capability, DC)
  LS Type: AS External Link
  Link State ID: 172.20.1.0 (External Network Number )
  Advertising Router: 10.2.2.2
  LS Seq Number: 80000001
  Checksum: 0xCF81
  Length: 36
  Network Mask: /24
        Metric Type: 2 (Larger than any link state path)
        MTID: 0
        Metric: 200
        Forward Address: 0.0.0.0
        External Route Tag: 200

  LS age: 1326
  Options: (No TOS-capability, DC)
  LS Type: AS External Link
  Link State ID: 172.20.1.0 (External Network Number )
  Advertising Router: 10.3.3.3
  LS Seq Number: 80000001
  Checksum: 0xB3D1
  Length: 36
  Network Mask: /24
        Metric Type: 2 (Larger than any link state path)
        MTID: 0
        Metric: 300
        Forward Address: 0.0.0.0
        External Route Tag: 300

想定通り、R2からのLSAはメトリック200、タグ200となっており、R3からのLSAはメトリック300、タグ300となっていることが確認できました。

検証構成2


ここからが本題です。検証構成1の条件に加えて、R1においてタグ200が付与された経路を除外するdistribute-listをin方向に適用した際の挙動を検証してみます。

投入するコンフィグ

R1に、下記のコンフィグを投入します。

router ospf 1
 distribute-list route-map TEST in
!
route-map TEST deny 10
 match tag 200
!
route-map TEST permit 20

状態確認の前に考えてみる

状態確認の前に、どのような挙動となるかを考えてみます。172.20.1.0/24の経路情報は、R2とR3の両方からLSAを受信しています。また、distribute-listをin方向で適用するので作用するポイントはLSDB構築後からルーティングテーブル形成までの間です。そのため、LSDBは投入前後で変わらないが、ルーティングテーブルに載るベストルートは、R3をネクストホップとしたルートと推測できます。

状態確認

R1のルーティングテーブルとLSDBを確認してみます。

R1#sh ip ro | b las
Gateway of last resort is not set

      10.0.0.0/32 is subnetted, 1 subnets
C        10.1.1.1 is directly connected, Loopback0
      192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.1.0/24 is directly connected, FastEthernet0/0
L        192.168.1.1/32 is directly connected, FastEthernet0/0
R1#
R1#sh ip os d

            OSPF Router with ID (10.1.1.1) (Process ID 1)

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
10.1.1.1        10.1.1.1        386         0x80000003 0x00DE41 2
10.2.2.2        10.2.2.2        403         0x80000003 0x00AF85 1
10.3.3.3        10.3.3.3        424         0x80000003 0x0087A6 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.1.3     10.3.3.3        424         0x80000003 0x00592A

                Type-5 AS External Link States

Link ID         ADV Router      Age         Seq#       Checksum Tag
172.20.1.0      10.2.2.2        403         0x80000002 0x00CD82 200
172.20.1.0      10.3.3.3        425         0x80000002 0x00B1D2 300

ルーティングテーブルに、172.20.1.0/24が載っていない!
これが今回最も重要な部分になります。冒頭で載せた公式ドキュメント内には、次のように記述されています。

実装後:ベストパスとなる LSA を除外すると、次に有効なパスは計算されません

つまり、distribute-listによってベストパスとなるLSAを除外するように設定すると、その次に有効となる経路情報が保持されていても、SPFツリー形成およびルーティングテーブル形成には使用しないという仕様が存在します。このような仕様となった理由ですが、ドキュメント内に記述があるように、distribute-listの使用有無によるパス計算の違いによりループが発生するため、とのことです。

したがって、172.20.1.0/24がルーティングテーブルに載っていないのは、実装されたOSPFの仕様によるものとなります。
※なお、Ciscoのみで確認できた仕様のため、他ベンダ機器のOSPFの実装の場合だと異なる可能性があります。

まとめ

今回は、OSPF環境において、distribute-listを使用してベストパスLSAを制御した際の挙動について検証しました。バックアップ経路に自動で切り替えてくれるのがダイナミックルーティングのメリットですが、思わぬ落とし穴(仕様)に落ちないよう、検証はしっかり行っておきたいですね。それでは。