ポイズンリバースって何のためにあるんだろう...?
本記事では、このような疑問に答えていきます。
本記事の内容
今回は、ルーティングループを防ぐ方法として、ポイズンリバースの必要性について、調べてみました。
というのも、Ciscoのルーターには、ルーティングループを防ぐ方法として、下記のような仕組みを取り入れています。
- ①:スプリットホライズン
- ②:ルートポイズニング
- ③:ポイズンリバース
- ④:ホールドダウンタイマ
- ⑤:トリガードアップデート
その中でも、ポイズンリバースの必要性や意味合いが、いまいち分かりませんでした。
ネットワークがダウンした際には、まず隣接ルーターに対して、そのネットワークに対して到達不能のホップ数をセットし、知らせます(ルートポイズニング)。
そして、更新タイミングのずれによるループを防ぐために、あるインタフェースから受け取った経路情報は、そのインタフェースから出力しないようにしています。これがスプリットホライズンです。
これで、対策としては十分のように思いますが、さらなる対策としてポイズンリバースがあります。
これは、スプリットホライズンが出力しないという動作に対して、ポイズンリバースはルートポイズニングの受信時(=ダウン情報)に限り出力する、という動作を行います。
これは、なんでなのででしょうか?
今回は、その理由について、事例を用いて解説します。
本記事の信頼性
本記事は、筆者がCCNAの勉強をしている際に学習した内容を基づいて執筆しています。
スプリットホライズンのおさらい
例えば、下記の様なネットワークがあったとします。
192.168.0.0/24のネットワークがダウンすると、ルートポイズニングにより、A→Bへのリンクがダウンした、という情報を通知します。
これがB→C、C→Dへと広がっていきます
しかし、C→Dへ通知する前に、D→Cへルーティングアップデートを通知した場合、どうなるでしょうか?
ルーターCで、情報が上書きされてしまいます。
すると、ルーターCかDで192.168.0.0/24宛のデータを受信した場合、C-D間でループが発生していしまいます。
これを防ぐため、ルーターDではD→Cの経路を送らないようにします。
というのも、ルーターDでは、192.168.0.0/24の経路情報はもともとルーターCから受け取った情報なので、既にルーターCはこの情報を持っていると仮定し、ルーターDではルーターCに対して192.168.0.0/24の経路情報を送らないようにします。
これがスプリットホライズンです。
ポイズンリバースが必要なケース
これはこれでよいのですが、実はスプリットホライズンではループを防げないケースがあります。
例えば、下記のネットワークの場合です。
ルーターCでは、192.168.0.0/24のネットワークはルーターD経由で送信するルートになっています。
192.168.0.0/24がダウンしたとき、A→Bへルーティングアップデートを送ります。
しかし、C→Bへ通知する前に、C→Bへ経路情報を送ってしまう可能性もあります。
なぜなら、スプリットホライズンを有効すると、192.168.0.0/24に関して、C→Dへの通知はなくなりますが、C→Bへの通知は無くならないからです。
すると、ルーターBでは192.168.0.0/24のルーティングテーブルを上書きしてしまいます。
これが、ルーターAまで波及してしまうと、A~B~C~Dの間でループが発生してしまいます。
これを防ぐためにどうするかというと、ルーターAでは、到達不可の情報(ルートポイズニング)を隣接ルータへ送った際には、ルーターBに送り返してもらいます。
受信したルーターAでは、s1インタフェース方向(ルーターB)からも、192.168.0.0/24へ到達することは不可能だ、というルーティングテーブルを作成します。
これによって、s1からの情報に対してホールドダウン状態となり、次にルーターBからルーティングアップデートが送られてきたとしても、ルーティングテーブルをアップデートしなくなります。
すなわち、ルーティングループを防ぐことができるのです。
参考文献
下記のサイトを参考にさせて頂きました。
スプリットホライズン ‐ 通信用語の基礎知識
スプリットホライズン - ネットワークエンジニアを目指して
ポイズンリバースとは -- Key:雑学事典
ディスタンスベクタ型ルーティング - ホールドダウンタイマー、トリガーアップデート
ApresiaNPシリーズ ユーザーズガイド