OSPFでのdistribute-listを使った経路フィルタリング方法と注意点(Cisco)

OSPF の distribute-list in を使うと、特定の経路をルーティングテーブルに入れないようにできます。ただし OSPF では、同じエリアのルータ同士で LSDB(Link State Database)を同じ内容にそろえる必要があるため、LSDB そのものはフィルタできません。distribute-list が効くのは、LSDB から計算した経路をルーティングテーブルに入れるところだけです。この記事では、この動きを実機の出力で確かめ、使うときの注意点をまとめます。

この記事でわかること
  1. ACL と distribute-list in で特定の経路を止める設定
  2. フィルタしたルータのルーティングテーブルと LSDB の違い
  3. ほかのルータには経路が残り、通信が途中で捨てられること

検証構成

R1・R2・R3 を一列につなぎ、すべてエリア0にします。R1 のループバック 1.1.1.1/32 を OSPF で広告し、真ん中の R2 で distribute-list を設定します。R3 では、R2 のフィルタがほかのルータに影響するかを確かめます。

Area 0 R1R2R3 (広告元)(distribute-list)(結果を確認) Lo0 1.1.1.1/32 .1.2.2.3 192.168.12.0/24192.168.23.0/24
図1 検証構成(すべてエリア0。R2 で 1.1.1.1/32 をフィルタする)

OSPF の基本設定

R1

R1(config)#router ospf 1
R1(config-router)#network 1.1.1.1 0.0.0.0 area 0
R1(config-router)#network 192.168.12.0 0.0.0.255 area 0

R2

R2(config)#router ospf 1
R2(config-router)#network 192.168.12.0 0.0.0.255 area 0
R2(config-router)#network 192.168.23.0 0.0.0.255 area 0

R3

R3(config)#router ospf 1
R3(config-router)#network 192.168.23.0 0.0.0.255 area 0

R2 と R3 のルーティングテーブルを確認します。どちらも 1.1.1.1/32 を学習しています。

R2

R2#show ip route ospf
O        1.1.1.1 [110/2] via 192.168.12.1, 00:32:15, FastEthernet0/0.12

R3

R3#show ip route ospf
O        1.1.1.1 [110/3] via 192.168.23.2, 00:32:12, FastEthernet0/0.23
O     192.168.12.0/24 [110/2] via 192.168.23.2, 00:32:12, FastEthernet0/0.23

アクセスリストを作る

1.1.1.1 を拒否し、ほかはすべて許可する標準 ACL を作ります。distribute-list で使う標準 ACL は、経路のネットワークアドレスと照合されます。ACL は最後に「すべて拒否」が暗黙で入るので、permit any がないとすべての OSPF 経路が止まります。

R2

R2(config)# access-list 1 deny   1.1.1.1
R2(config)# access-list 1 permit any

distribute-list を適用する

OSPF のプロセスに、作った ACL を distribute-list 1 in で適用します。

R2

R2(config)# router ospf 1
R2(config-router)# distribute-list 1 in

フィルタの結果を確認する

R2:ルーティングテーブルから消える

R2 には OSPF の経路が1つもなくなり、show ip route 1.1.1.1 も % Network not in table になります。

R2# show ip route ospf   
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override


Gateway of last resort is not set

R2# show ip route 1.1.1.1 
% Network not in table

R3:ルーティングテーブルに残る

R3 には 1.1.1.1/32 が残っています。from 1.1.1.1 は、この経路の情報を作ったルータ(R1 のルータ ID)です。R2 のフィルタは R3 には伝わりません。

R3# show ip route ospf   

O        1.1.1.1 [110/3] via 192.168.23.2, 00:41:14, FastEthernet0/0.23
O     192.168.12.0/24 [110/2] via 192.168.23.2, 00:41:14, FastEthernet0/0.23

R3# show ip route 1.1.1.1
Routing entry for 1.1.1.1/32
  Known via "ospf 1", distance 110, metric 3, type intra area
  Last update from 192.168.23.2 on FastEthernet0/0.23, 00:41:31 ago
  Routing Descriptor Blocks:
  * 192.168.23.2, from 1.1.1.1, 00:41:31 ago, via FastEthernet0/0.23
      Route metric is 3, traffic share count is 1

R2 の LSDB:情報は残っている

R2 の LSDB には、R1 のルータ LSA がそのまま入っています。

R2# show ip ospf database        

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

                Router Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum Link count
1.1.1.1         1.1.1.1         723         0x80000004 0x004ADA 2
2.2.2.2         2.2.2.2         748         0x80000005 0x00D544 2
3.3.3.3         3.3.3.3         719         0x80000003 0x000210 1

                Net Link States (Area 0)

Link ID         ADV Router      Age         Seq#       Checksum
192.168.12.2    2.2.2.2         748         0x80000002 0x008D20
192.168.23.3    3.3.3.3         719         0x80000002 0x004055
表示意味
Link ID 1.1.1.1R1 のルータ LSA(タイプ1)。ルータ LSA の Link ID はルータ ID なので、この 1.1.1.1 はプレフィックスではなく R1 自身を表します
Link count 2R1 のルータ LSA に入っているリンクの数。ループバックの 1.1.1.1/32 はスタブのリンクとしてここに含まれ、もう1つは R1–R2 間のセグメント(192.168.12.0/24。DR は 192.168.12.2)へのトランジットリンクです

R2 は LSDB に 1.1.1.1/32 の情報を持ったまま SPF 計算をし、その結果をルーティングテーブルに入れる段階で distribute-list に止められています。R2 は LSDB をそのまま R3 と同期するので、R3 は 1.1.1.1/32 を計算できます。

Area 0 同じ内容に同期同じ内容に同期 R1R2R3 LSDBLSDBLSDB distribute-list 1 in 1.1.1.1/32ルーティングテーブル(1.1.1.1/32 なし)ルーティングテーブル1.1.1.1/32ルーティングテーブル
図2 distribute-list が効く場所(LSDB は3台とも同じで、R2 のルーティングテーブルに入れるところだけを止める)

注意点

ほかのルータには経路が残る

distribute-list はフィルタしたルータ自身のルーティングテーブルにしか効きません。エリア内の LSDB は同期したままなので、ほかのルータは今までどおり経路を計算します。ネットワーク全体で経路を止めたいときには使えません。

通信が途中で捨てられる

R3 は 1.1.1.1 への経路を持っているので、R2 に向けてパケットを送ります。しかし R2 には経路がないので、パケットは R2 で捨てられます。R3 からトレースルートすると、2ホップ目で R2 から !H が返ります。

R3# traceroute 1.1.1.1
Type escape sequence to abort.
Tracing the route to 1.1.1.1
VRF info: (vrf in name/id, vrf out name/id)
  1 192.168.23.2 12 msec 24 msec 20 msec
  2 192.168.23.2 !H  !H  !H
R1R2R3 1.1.1.1 宛先 1.1.1.1 経路がないので捨てる ICMP Host Unreachable(!H) R2 のルーティングテーブルに 1.1.1.1/32 なし
図3 R3 から 1.1.1.1 へのトレースルート(R2 で捨てられて ICMP Host Unreachable が返る)
表示意味
!HICMP Destination Unreachable(タイプ3)のコード1、Host Unreachable を受け取った。宛先への経路がない R2 が返しています

この検証では R2 にほかの経路がないので、パケットは捨てられるだけです。R2 がデフォルトルートなど別の経路を持っていて、それが R3 の方向を向いていると、R2 と R3 の間でパケットが行き来するルーティングループになります。

原因を見つけにくい

経路が消えたルータでも、OSPF のネイバーや LSDB は正常に見えます。show ip ospf database には情報があるのに show ip route に経路がないときは、distribute-list を疑って show running-config | section router ospf などで設定を確認します。

まとめ

項目distribute-list in(OSPF)
止めるもの設定したルータのルーティングテーブルに入る経路
止めないものLSDB と LSA の伝わり方(ほかのルータには影響しない)
注意点ほかのルータは経路を持つので、通信が途中で捨てられたり、別の経路があるとループしたりする

エリアの外へ経路を出さないようにしたいときは、ABR で LSA タイプ3 をフィルタする area filter-list のように、LSA の段階で止める方法を検討します。

コメント