【GRE】再帰ルーティングエラー

 

GRE トンネルの接続先(アンダーレイ)への経路を、GRE トンネル経由(オーバーレイ)で学習してしまうと、次のようなエラーログが出て、GRE トンネルが安定して使えなくなります。

R2

%TUN-5-RECURDOWN: Tunnel0 temporarily disabled due to recursive routing

これは、アンダーレイのインターフェースでも、オーバーレイのトンネルインターフェースと同じダイナミックルーティングを不用意に動かしたときに起こることがあります。この記事では、OSPF でこのエラーを実際に起こし、なぜトンネルがアップとダウンを繰り返すのかを確認します。

この記事でわかること
  1. アンダーレイとトンネルの両方で OSPF を動かした構成と、経路の選ばれ方
  2. OSPF のコストを変えて、トンネルの宛先への経路をトンネル経由にする
  3. 再帰ルーティングエラーでトンネルがアップ・ダウンを繰り返す理由と対策

検証構成

【基本】GREトンネルの設定方法 の構成から、R2 と R3 のスタティックルートを削除し、R2、R3、R5 で OSPF を有効にします。R2 と R3 の間には、R5 を経由する GRE トンネル(Tunnel0)があります。

OSPF Area 0 Tunnel0(GRE) 192.168.235.0/24 R5 R2 R3 端末A 端末B 169.254.25.0/24 169.254.35.0/24 .5 .5 .2 .3 192.168.12.0/24 192.168.34.0/24 .1 .2 .3 .4
図1 検証構成。アンダーレイ(169.254.0.0)とトンネル(192.168.235.0/24)の両方で OSPF を動かす
機器Tunnel0 のアドレスtunnel source → tunnel destination
R2192.168.235.2/24169.254.25.2 → 169.254.35.3
R3192.168.235.3/24169.254.35.3 → 169.254.25.2

アンダーレイとトンネルで OSPF を動かす

R2 と R3 では、アンダーレイ(169.254.0.0/16)、各端末側の LAN、トンネル(192.168.235.0/24)のすべてで OSPF を有効にします。R5 では、アンダーレイで OSPF を有効にします。

R2

R2(config)#interface Tunnel0
R2(config-if)# ip address 192.168.235.2 255.255.255.0
R2(config-if)# tunnel source 169.254.25.2
R2(config-if)# tunnel destination 169.254.35.3
R2(config-if)#exit   
R2(config)#router ospf 1
R2(config-router)# network 169.254.0.0 0.0.255.255 area 0
R2(config-router)# network 192.168.12.0 0.0.0.255 area 0
R2(config-router)# network 192.168.235.0 0.0.0.255 area 0
R2(config-router)#exit

R3

R3(config)#interface Tunnel0
R3(config-if)# ip address 192.168.235.3 255.255.255.0
R3(config-if)# tunnel source 169.254.35.3
R3(config-if)# tunnel destination 169.254.25.2
R3(config-if)#exit
R3(config)#router ospf 1
R3(config-router)# network 169.254.0.0 0.0.255.255 area 0
R3(config-router)# network 192.168.34.0 0.0.0.255 area 0
R3(config-router)# network 192.168.235.0 0.0.0.255 area 0
R3(config-router)#exit

R5

R5(config)#router ospf 1
R5(config-router)# network 169.254.0.0 0.0.255.255 area 0

R2 のルーティングテーブルを確認します。

R2

R2#show ip route ospf

      169.254.0.0/16 is variably subnetted, 3 subnets, 2 masks
O        169.254.35.0/24 
           [110/2] via 169.254.25.5, 00:17:55, FastEthernet0/0.25 
O     192.168.34.0/24 [110/3] via 169.254.25.5, 00:17:55, FastEthernet0/0.25

トンネルの宛先(169.254.35.3)を含む 169.254.35.0/24 も、R3 側の LAN(192.168.34.0/24)も、トンネルではなく、アンダーレイの物理インターフェース(R5 経由)の経路が選ばれています。

トンネル経由にならないのは、トンネルインターフェースの OSPF コストが大きいためです。show ip ospf interface を見ると、物理インターフェースのコストは 1、トンネルインターフェースのコストは既定で 1000 です。

R2

R2#show ip ospf interface 
FastEthernet0/0.25 is up, line protocol is up 
  Internet Address 169.254.25.2/24, Area 0, Attached via Network Statement
  Process ID 1, Router ID 2.2.2.2, Network Type BROADCAST, Cost: 1 
・・・
Tunnel0 is up, line protocol is up 
  Internet Address 192.168.235.2/24, Area 0, Attached via Network Statement
  Process ID 1, Router ID 2.2.2.2, Network Type POINT_TO_POINT, Cost: 1000 

R2 から 169.254.35.0/24 までのコストは、R5 経由なら 1+1=2、トンネル経由なら 1000+1=1001 です。OSPF はコストの合計が小さい経路を選ぶので、物理インターフェース側の経路が使われます。この状態では、トンネルの宛先への経路はアンダーレイ経由なので、問題は起きません。

R5 のコストを大きくする

次に、R5 の R2 側と R3 側のインターフェースで、OSPF のコストを 10000 にします。R5 を経由する経路のコストが大きくなり、トンネル経由の経路のほうが小さくなります。

R5

R5(config)#interface FastEthernet0/0.25 
R5(config-subif)#ip ospf cost 10000 
R5(config-subif)#exit 
R5(config)#interface FastEthernet0/0.35 
R5(config-subif)#ip ospf cost 10000 

そして、R5 で OSPF のプロセスを再起動します。

R5

R5#clear ip ospf process 
Reset ALL OSPF processes? [no]: yes
R5 のコスト変更前 R2 → 169.254.35.0/24 のコスト R5 経由(物理) 1 + 1 = 2 選ばれる Tunnel0 経由 1000 + 1 = 1001 使われない R5 のコスト変更後 R2 → 169.254.35.0/24 のコスト R5 経由(物理) 1 + 10000 = 10001 使われない Tunnel0 経由 1000 + 1 = 1001 選ばれる
図2 R5 のコストを変えると、169.254.35.0/24 への経路はトンネル経由のほうがコストが小さくなる

トンネルがアップとダウンを繰り返す

すると、R2 と R3 でトンネルインターフェースがアップとダウンを繰り返し、不安定になります。

R2

R2#
%TUN-5-RECURDOWN: Tunnel0 temporarily disabled due to recursive routing
%LINEPROTO-5-UPDOWN: Line protocol on Interface Tunnel0, changed state to down

%LINEPROTO-5-UPDOWN: Line protocol on Interface Tunnel0, changed state to up

%TUN-5-RECURDOWN: Tunnel0 temporarily disabled due to recursive routing
%LINEPROTO-5-UPDOWN: Line protocol on Interface Tunnel0, changed state to down

トンネルがダウンしているときの R2 のルーティングテーブルを見ると、トンネルの宛先を含む 169.254.35.0/24 を、アンダーレイ(R5 経由、コスト 10001)で受信しています。

R2

R2#show ip route ospf
      169.254.0.0/16 is variably subnetted, 3 subnets, 2 masks
O        169.254.35.0/24 
           [110/10001] via 169.254.25.5, 00:00:26, FastEthernet0/0.25
O     192.168.34.0/24 
           [110/10002] via 169.254.25.5, 00:00:26, FastEthernet0/0.25

この経路でトンネルの宛先に届くので、トンネルインターフェースがアップします。すると、トンネル上でも OSPF の経路交換が始まり、169.254.35.0/24 への経路は、コストの小さいトンネル経由(1001)に変わります。

R2

R2#
 %LINEPROTO-5-UPDOWN: Line protocol on Interface Tunnel0, changed state to up

R2#show ip route ospf
O      169.254.35.0/24 [110/1001] via 192.168.235.3, 00:00:04, Tunnel0
O     192.168.34.0/24 [110/1001] via 192.168.235.3, 00:00:04, Tunnel0

ところが、R2 にとって 169.254.35.0/24 は、トンネルを張るために必要な経路(トンネルの宛先 169.254.35.3 への経路)です。それをトンネル経由で学習すると、「トンネルのパケットを宛先に届けるために、そのトンネル自身を通る」という矛盾が起きます。そこで R2 は %TUN-5-RECURDOWN: Tunnel0 temporarily disabled due to recursive routing(再帰ルーティングのエラー)を出力し、トンネルインターフェースを一時的にダウンさせます。

トンネルがダウンすると、トンネル経由の経路は消え、169.254.35.0/24 は再び R5 経由になります。するとトンネルがまたアップし……と、設定を直すまで、トンネルのアップとダウンをずっと繰り返します。

Tunnel0 がアップ トンネル上で OSPF の経路交換 経路がトンネル経由に 169.254.35.0/24 via Tunnel0(1001) RECURDOWN トンネルの宛先にトンネルで向かう矛盾 Tunnel0 がダウン 169.254.35.0/24 は R5 経由(10001)に戻る くり返す トンネルの宛先(169.254.35.3)を含む経路を、トンネル自身から学習してしまう
図3 再帰ルーティングでトンネルがアップとダウンを繰り返すしくみ

再帰ルーティングエラーが出たときは

再帰ルーティングのエラーが出たら、アンダーレイの経路(トンネルの宛先への経路)を、オーバーレイ(トンネル)経由で学習しようとしていないかを確認します。show ip route トンネルの宛先アドレス で、トンネルの宛先への経路がトンネルインターフェースを向いていないかを見ると切り分けられます。

対策は、トンネルの宛先への経路が、常にトンネル以外(物理インターフェース側)を向くようにすることです。

対策内容
トンネルの宛先へのスタティックルートトンネルの宛先アドレスへ、物理インターフェース側を向くスタティックルート(/32 のホストルートなど)を両端のルータに設定する。プレフィックス長の長い経路が優先されるので、OSPF でトンネル経由の /24 を学習しても、トンネルの宛先への通信は物理側を通る
アンダーレイをトンネル上のルーティングに入れないアンダーレイ(今回は 169.254.0.0/16)の経路を、トンネル上で動かすルーティングプロトコルに広告しないように設計する

今回の構成なら、例えば R2 で ip route 169.254.35.3 255.255.255.255 169.254.25.5、R3 で ip route 169.254.25.2 255.255.255.255 169.254.35.5 のように、相手のトンネルの宛先を R5 経由に固定します。

まとめ

項目内容
エラー%TUN-5-RECURDOWN: Tunnel0 temporarily disabled due to recursive routing
原因トンネルの宛先への経路を、トンネル自身から学習した
今回のきっかけアンダーレイとトンネルで同じ OSPF を動かし、R5 のコストを 10000 にしてトンネル経由(1001)のほうが小さくなった
症状トンネルのダウン → 経路が物理側に戻る → トンネルのアップ → 経路がトンネル経由になる → ダウン、を繰り返す
対策トンネルの宛先への経路が常に物理側を向くようにする(スタティックのホストルート、アンダーレイをトンネル上のルーティングに入れない)

コメント