検証環境
- Cisco C891FJ-K9
- バージョン:15.8(3)M9
OSPF における distribute-list in の動作
OSPF において、distribute-list in をインターフェースに対して設定することで、そのインターフェースで受信したルートをフィルタリングして、特定のルートをルーティングテーブルにインストールさせないようにすることができます。
例えば、以下のネットワークを考えます。

Router02 に注目すると、ルーティングテーブルの OSPF ルートは以下の通りです。
Router02#show ip route ospf
...
1.0.0.0/32 is subnetted, 1 subnets
O 1.1.1.1 [110/2] via 10.1.100.1, 00:00:04, Vlan100
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/2] via 10.1.200.1, 00:00:04, Vlan200
10.0.0.0/8 is variably subnetted, 6 subnets, 2 masks
O 10.11.0.0/24 [110/2] via 10.1.100.1, 00:00:04, Vlan100
O 10.13.0.0/24 [110/2] via 10.1.200.1, 00:00:04, Vlan200
ここで、Router02 にて Router03 の右側のセグメントの 10.13.0.0/24
宛のルートをルーティングテーブルにインストールさせないようにしてみます。例えば、以下のような distribute-list を Router03 向けのインターフェースである Vlan200 の in 方向に設定します。
router ospf 100
distribute-list ospfdlist in Vlan200
ip access-list standard ospfdlist
deny 10.13.0.0 0.0.0.255
permit any

distribute-list を設定後の Router02 のルーティングテーブルを見てみると、以下のように 10.13.0.0/24 宛のルートが消えています。
Router02#show ip route ospf
...
1.0.0.0/32 is subnetted, 1 subnets
O 1.1.1.1 [110/2] via 10.1.100.1, 00:02:14, Vlan100
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/2] via 10.1.200.1, 00:02:14, Vlan200
10.0.0.0/8 is variably subnetted, 5 subnets, 2 masks
O 10.11.0.0/24 [110/2] via 10.1.100.1, 00:02:14, Vlan100
このように、distribute-list in を使用することで特定のルートをルーティングテーブルに載せないようにすることができます。
【注意】隣接するルータにはフィルタリングしたルートが広報されてしまう
OSPF では distribute-list in を使用することで、その設定をしたルータ自身のルーティングテーブルにはルートを載せないようにすることはできますが、隣接するルータにはフィルタリングしたルートは広報されてしまいます。
distribute-list in コマンドは、ルーティングテーブルに入るルートをフィルタ処理するだけであり、リンクステートパケットの伝達を防ぐわけではありません。そのため、このコマンドがルータメモリの節約を助けることはなく、ルータがフィルタ処理されたルートを他のルータに伝達することを防ぐこともありません。
https://www.cisco.com/c/ja_jp/support/docs/ip/open-shortest-path-first-ospf/9237-9.html#q12
上で示したネットワーク構成例で確認してみます。

Router02 に distribute-list in を設定した後、Router02 のルーティングテーブルでは 10.13.0.0/24 宛のルートが消えましたが、Router02 に隣接する Router01 のルーティングテーブルを確認してみます。
Router01#show ip route ospf
...
2.0.0.0/32 is subnetted, 1 subnets
O 2.2.2.2 [110/2] via 10.1.100.254, 01:44:21, Vlan100
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/3] via 10.1.100.254, 01:44:57, Vlan100
10.0.0.0/8 is variably subnetted, 6 subnets, 2 masks
O 10.1.200.0/24 [110/2] via 10.1.100.254, 01:46:26, Vlan100
O 10.13.0.0/24 [110/3] via 10.1.100.254, 01:46:26, Vlan100
上記の通り、Router01 のルーティングテーブルには 10.13.0.0/24 宛のルートが存在しており、Nexthop が Router02 となっています。
このため Router01 が 10.13.0.0/24 宛のパケットを受信した場合 Router02 にルーティングしてしまいますが、Router02 は 10.13.0.0/24 宛のルートを持たないため到達不能となります。
このように、OSPF で distribute-list in を設定するとネットワークに問題が発生する可能性があるため、distribute-list in を設定する場合は細心の注意を払う必要があります。
OSPF の distribute-list in のルート再配送への影響
上で説明した通り OSPF の distribute-list in は、当該ルータのルーティングテーブルにフィルタリングしたルートを載せないが、隣接ルータには当該ルートを広報するという仕様です。
ここで以下の点が気になりました。
- OSPF の distribute-list in を設定しているルータで EIGRP も使用していて、かつ EIGRP で OSPF 再配送を設定している場合、OSPF の distribute-list in でフィルタされたルートは EIGRP に再配送されるのか?
以下のネットワーク構成で確認してみます。

前項で示していたネットワーク構成をベースに、Router01 – Router02 間を OSPF から EIGRP に変更し、Router02 では EIGRP で OSPF 再配送を設定しています。
上記構成でまず、Router02 の OSPF で distribute-list in を設定していない状態での Router01 のルーティングテーブルは以下の通りです。
Router01#show ip route eigrp
...
2.0.0.0/32 is subnetted, 1 subnets
D EX 2.2.2.2 [170/3072] via 10.1.100.254, 00:16:57, Vlan100
3.0.0.0/32 is subnetted, 1 subnets
D EX 3.3.3.3 [170/3072] via 10.1.100.254, 00:16:57, Vlan100
10.0.0.0/8 is variably subnetted, 6 subnets, 2 masks
D EX 10.1.200.0/24 [170/3072] via 10.1.100.254, 00:16:57, Vlan100
D EX 10.13.0.0/24 [170/3072] via 10.1.100.254, 00:16:57, Vlan100
次に、Router02 の OSPF の設定にて以下の distribute-list in の設定を行い、Router03 から広報される 10.13.0.0/24 宛のルートを拒否します。
router ospf 100
distribute-list ospfdlist in Vlan200
ip access-list standard ospfdlist
deny 10.13.0.0 0.0.0.255
permit any

上記設定をした後の Router01 のルーティングテーブルを確認してみます。
Router01#show ip route eigrp
...
2.0.0.0/32 is subnetted, 1 subnets
D EX 2.2.2.2 [170/3072] via 10.1.100.254, 00:20:24, Vlan100
3.0.0.0/32 is subnetted, 1 subnets
D EX 3.3.3.3 [170/3072] via 10.1.100.254, 00:00:47, Vlan100
10.0.0.0/8 is variably subnetted, 5 subnets, 2 masks
D EX 10.1.200.0/24 [170/3072] via 10.1.100.254, 00:20:24, Vlan100
上記の通り、Router01 で10.13.0.0/24 宛のルートが消えました。
この結果から OSPF の distribute-list in で拒否されたルートは EIGRP に再配送されないと言えます。
2方向からルート受信する場合での distribute-list in
上で使用していたネットワークに対して Router04 を追加した以下のネットワークを考えます。

このネットワークでは、Router03、Router04 の両方が背後にあるセグメント 10.13.0.0/24 へのルートを Router02 に広報するため、Router02 のルーティングテーブルは以下のようになります。
Router02#show ip route ospf
...
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/2] via 10.1.200.1, 00:00:05, Vlan200
4.0.0.0/32 is subnetted, 1 subnets
O 4.4.4.4 [110/1] via 10.1.40.1, 00:00:05, Vlan300
10.0.0.0/8 is variably subnetted, 8 subnets, 2 masks
O 10.13.0.0/24 [110/2] via 10.1.200.1, 00:00:05, Vlan200
[110/2] via 10.1.40.1, 00:00:05, Vlan300
上記の通り 10.13.0.0/24 へのルートとして Router03 (Vlan200) 向けと Router04 (Vlan300) 向けの 2 つのルートが掲載されています(2 つのルートは等コストのため)。
ここで、再び Router02 にて以下のように Router03 向けの Vlan200 に対して distribute-list in を設定してみます。
router ospf 100
distribute-list ospfdlist in Vlan200
ip access-list standard ospfdlist
deny 10.13.0.0 0.0.0.255
permit any

結果、Router02 のルーティングテーブルは以下のようになります。
Router02#show ip route ospf
...
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/2] via 10.1.200.1, 00:02:12, Vlan200
4.0.0.0/32 is subnetted, 1 subnets
O 4.4.4.4 [110/1] via 10.1.40.1, 00:02:12, Vlan300
10.0.0.0/8 is variably subnetted, 8 subnets, 2 masks
O 10.13.0.0/24 [110/2] via 10.1.40.1, 00:02:12, Vlan300
Router03 (Vlan200) 向けに対して distribute-list in を設定したので、Router03 から受信したルートは拒否されましたが、Router04 (Vlan300) から受信したルートは拒否されず、ルーティングテーブルに残っています。
さらに、この時の Router01 のルーティングテーブルも確認してみます。
Router01#show ip route eigrp
...
2.0.0.0/32 is subnetted, 1 subnets
D EX 2.2.2.2 [170/3072] via 10.1.100.254, 01:42:46, Vlan100
3.0.0.0/32 is subnetted, 1 subnets
D EX 3.3.3.3 [170/3072] via 10.1.100.254, 00:04:22, Vlan100
4.0.0.0/32 is subnetted, 1 subnets
D EX 4.4.4.4 [170/3072] via 10.1.100.254, 00:04:22, Vlan100
10.0.0.0/8 is variably subnetted, 7 subnets, 2 masks
D EX 10.1.40.0/24 [170/3072] via 10.1.100.254, 00:45:46, Vlan100
D EX 10.1.200.0/24 [170/3072] via 10.1.100.254, 01:42:46, Vlan100
D EX 10.13.0.0/24 [170/3072] via 10.1.100.254, 00:04:22, Vlan100
上記の通りRouter01 にも 10.13.0.0/24 宛のルートが存在します。
Router02 のルーティングテーブルには Router04 から受信したルートが残っているので、そのルートが EIGRP に再配送されて Router01 へルートが広報されています。
Router02 にて、Router04 から受信した 10.13.0.0/24 へのルートに関しても拒否したい場合は、Router03 向けの Vlan200 に対して設定したのと同様に、Router04 向けの Vlan300 に対しても distribute-list in を設定する必要があります。
まとめ
- OSPF の distribute-list in 設定は、当該設定をしたルータのルーティングテーブルには影響するが、隣接ルータへ広報されるルートには影響しない
- この仕様が意図せずネットワークのルーティングの問題を引き起こすことがあるので、十分に注意する必要がある
- OSPF の distribute-list in 設定を設定しているルータで EIGRP への OSPF再配送を設定している場合、distribute-list in で拒否されたルートは EIGRP に再配送されない