ルーティングの問題:デフォルト ルートとして、ネクストホップ IP アドレスと出力インターフェイスのどちらを指定すべきか (翻訳)

    本ページは英語ドキュメントを翻訳したものです。

     


     

    シスコで働けた光栄

    このドキュメントは、マルチアクセス ネットワーク内において、スタティックなデフォルト ルートとして、ネクストホップ IP アドレスを指定した場合と、出力インターフェイスを指定した場合の相違点について説明します。


    パケット転送の概要

     

    ルータ経由でパケットを送信するには、主に 3 つの手順が必要です。

     

    1. ルーティング:パケットの発信インターフェイスを見つけます。
    2.  スイッチング:パケットをインターフェイス間で移動します。
    3.  カプセル化:レイヤ 2 ヘッダーを再構築します。

     

    宛先ネットワークへの最適パス(つまり、ルーティング テーブル内の最長一致エントリ)は、ルーティング プロセスで決定します。適切なルートが見つからない場合は、デフォルト ルートが使用されます。最終的に、ルーティング プロセスは、発信インターフェイスを解決する必要があります。そのために再帰ルックアップを複数回実行することがあります。例:10.1.1.1 via 172.16.1.1 >> 172.16.1.1 via 192.168.1.1 >> 192.168.1.1 is directly connected, FastEthernet0/1

     

    インターフェイス間でのパケットの移動は、スイッチング プロセスで行われます。スイッチング パスには、プロセス スイッチング、ファスト スイッチング、および Cisco Express Forwarding(CEF)の複数の方式があります。プロセス スイッチングでの転送処理は、CPU が行います。つまり、各パケットが CPU によって検査され処理されます。この方式は、面倒な処理を行って膨大なリソースを消費するため低速です。ファスト スイッチングはプロセス スイッチングと同様に動作しますが、いくつかの改善が行われています。ファスト スイッチングもプロセス スイッチング方式を採用しますが、トラフィック フローの最初のパケットのみを対象としています。ルータは最初のパケットをプロセス スイッチングすると、転送に必要な情報を含むキャッシュ エントリを生成します。それ以降のパケットは、個別にルックアップを行うことなく、キャッシュ エントリを使用して転送されます。CEF 方式は、パケット転送を最適化するよう進化しています。パケットを受信する前に、ルーティング テーブルと ARP キャッシュに基づいて、転送情報を事前に構築および計算します。この情報は、CPU を必要としない迅速なルックアップ向けに設計された別のデータ ストラクチャ(FIB テーブルと隣接テーブル)に格納されます。

     

    パケットを回線に送信するには、事前にレイヤ 2 ヘッダーを再構築する必要があります。ヘッダー タイプは出力インターフェイスによって異なります。イーサネットなどのマルチポイント インターフェイスの場合、レイヤ 3 とレイヤ 2 の間でアドレス解決(IP アドレスと MAC アドレスのマッピング)が必要です。

     

    RP_graph.PNG

    上の図は、プロセス スイッチングを簡略化して表したものです。各手順について、以下に詳しく説明していきます。

    1. 最初に、インターフェイス プロセッサがパケットの存在を検出し、このパケットをルータ上の入出力メモリに転送します。
    2. インターフェイス プロセッサは受信割り込みを生成します。この割り込みの間、中央のプロセッサがパケットのタイプを判別し(ここでは IP パケットと仮定します)、パケットを適切なプロセスの入力キューへ配置します。
    3. スケジューラは、次回実行時に、IP 入力の入力キュー内のパケットを認識し、このプロセスの実行をスケジュールします。
    4. IP 入力は、実行時に RIB に問い合わせて、ネクスト ホップと出力インターフェイスを決定し、次に ARP キャッシュを参照して MAC 情報を検索します。
    5. その後、IP 入力は MAC ヘッダーを書き換え、適切な送信用インターフェイスの出力キューにパケットを配置します。送信用インターフェイス プロセッサが送信キューのパケットを検出し、パケットを転送します。

     

     

    ネクストホップ IP アドレスの指定

     

    ルーティング プロセスを念頭に置きつつ、スタティックなデフォルト ルートとしてネクストホップ IP アドレスを設定する場合から見ていきます。経過をわかりやすく示すために、以下のようなシナリオを用意しました(Joshua Johnson がホストするラボで実施)。

     

    VIPblog_topology.PNG

     

    スタティックなデフォルト ルートをルーティング テーブルに挿入するために、ip route 0.0.0.0 0.0.0.0 155.0.0.7 を実行します。

     

    R9#show ip route

     

    Gateway of last resort is 155.0.0.7 to network 0.0.0.0

     

    S*    0.0.0.0/0 [1/0] via 155.0.0.7

          155.0.0.0/16 is variably subnetted, 2 subnets, 2 masks

    C        155.0.0.0/24 is directly connected, GigabitEthernet1

    L        155.0.0.9/32 is directly connected, GigabitEthernet1

     

    リモートの複数の宛先に同時に ping するために、簡単な TCL スクリプトを記述しました。

     

    R9#tclsh

    R9(tcl)#foreach n {

    +>(tcl)#155.1.1.1

    +>(tcl)#155.2.2.2

    +>(tcl)#155.3.3.3

    +>(tcl)#155.4.4.4

    +>(tcl)#} { ping $n }


    Sending 5, 100-byte ICMP Echos to 155.1.1.1, timeout is 2 seconds:

    !!!!!

    Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

     

    Sending 5, 100-byte ICMP Echos to 155.2.2.2, timeout is 2 seconds:

    !!!!!

    Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

     

    Sending 5, 100-byte ICMP Echos to 155.3.3.3, timeout is 2 seconds:

    !!!!!

    Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

     

    Sending 5, 100-byte ICMP Echos to 155.4.4.4, timeout is 2 seconds:

    !!!!!

    Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

     

    ping は成功しているようです。ルックアップ プロセスの詳細についても見ていきましょう。

     

    まず初めに、R9 は、ネクストホップ ネイバーの R7 の MAC アドレスを取得するために ARP 要求を生成する必要があります。ARP 要求には、次の情報が含まれます:src IP = 155.0.0.9、scr MAC = 000c.2999.fcba、dst IP = 155.0.0.7、dst MAC = 0000.0000.0000(不明)。R7 は、src IP = 155.0.0.7、src MAC = 000c.2968.22dd、dst IP = 155.0.0.9、dst MAC = 000c.2999.fcba という情報を含む ARP 応答を返します。

     

    R9#debug arp

    IP ARP: sent req src 155.0.0.9 000c.2999.fcba,

                     dst 155.0.0.7 0000.0000.0000 GigabitEthernet1

    IP ARP: rcvd rep src 155.0.0.7 000c.2968.22dd, dst 155.0.0.9 GigabitEthernet1

     

    ARP キャッシュには、動的に学習されたエントリ(R7)が 1 つだけ含まれていることに注意してください。実際、R9 はリモートのすべての宛先に対して R7 経由で送信するため、これが唯一必要な情報となります。R9 が伝えているのは、「ルーティング テーブル内に該当するエントリがないパケットはすべて R7 へ転送されるため、レイヤ 2 フレームはすべて R7 宛となる」ということです。

     

    R9#show arp

    Protocol  Address          Age (min)  Hardware Addr   Type   Interface

    Internet  155.0.0.7               0   000c.2968.22dd  ARPA   GigabitEthernet1

    Internet  155.0.0.9               -   000c.2999.fcba  ARPA   GigabitEthernet1

     

    これは、 シンプルでエレガントなソリューションです。しかし、ちょっと待ってください。何か見落としている点はないでしょうか。残念ながらあります。ネクストホップ IP アドレスをスタティックに指定した場合、発信インターフェイスがダウンしたのに、再帰ルックアップを通じてそのネクストホップ IP アドレスが有効なままだと、そのルートは有効なエントリとしてルーティング テーブルに残ってしまいます(その結果、ブラック ホールができます)。これは、このシナリオでは発生しませんが、他のシナリオでは発生する可能性があります。詳細についてはこちらをご覧ください:Specifying a Next Hop IP Address for Static Routes(ネクスト ホップ IP アドレスをスタティックなルートとして指定) [英語]

     

     

    出力インターフェイスの指定

     

    前章では、スタティックなデフォルト ルートとしてネクストホップ IP アドレスを指定すると、レイヤ 2 ヘッダーを再作成するためのメモリ リソースと処理サイクルが最小化されることを示しました。これとは対称的に、出力インターフェイスへのルートを指定すると、プロセッサの使用率が上がり、大量の ARP キャッシュが生成される(結果としてメモリの割り当てで障害が発生する)可能性があります。

     

    デフォルト ルートが設定されている場合でも、ルータは潜在的なパフォーマンスの問題について、以下のように管理者に通知します。

     

    R9(config)#ip route 0.0.0.0 0.0.0.0 GigabitEthernet1

    %Default route without gateway, if not a point-to-point interface, may impact performance

     

    スタティック ルートが出力インターフェイスに関連付けられている場合、ルーティング テーブルには、直接接続されているものとして示されます。

     

    R9#show ip route

     

    Gateway of last resort is 0.0.0.0 to network 0.0.0.0

     

    S*    0.0.0.0/0 is directly connected, GigabitEthernet1

          155.0.0.0/16 is variably subnetted, 2 subnets, 2 masks

    C        155.0.0.0/24 is directly connected, GigabitEthernet1

    L        155.0.0.9/32 is directly connected, GigabitEthernet1

     

    ここで、直接接続とは、レイヤ 2 ネイバーシップを意味しています。つまり、ルータは、ルートの範囲内の各宛先にそのインターフェイス経由で直接到達できるとみなします。そのため、ルータは、ネクストホップ IP アドレスを解決する代わりに、各宛先のレイヤ 2 情報を取得する必要があります。

     

    ここで、TCL スクリプトを再度実行したところ、ping は引き続き成功しました(出力は長いため省略しますが、本当に成功しました。どうか信じてください)。しかし、内部では何が起こっているのでしょうか。ルータは、すべての宛先に対して個別に ARP 要求を生成しています。

     

    R7#debug arp

    IP ARP: rcvd req src 155.0.0.9 000c.2999.fcba, dst 155.1.1.1 GigabitEthernet1

    IP ARP: rcvd req src 155.0.0.9 000c.2999.fcba, dst 155.2.2.2 GigabitEthernet1

    IP ARP: rcvd req src 155.0.0.9 000c.2999.fcba, dst 155.3.3.3 GigabitEthernet1

    IP ARP: rcvd req src 155.0.0.9 000c.2999.fcba, dst 155.4.4.4 GigabitEthernet1

     

    ここで疑問が出てきます。実際には直接接続されていない最終的な宛先にルータが ARP 要求を送信した場合、パケットは目的の宛先にどのように到達するのでしょうか。その答えは、簡単に言うと、プロキシ ARP です。今日、プロキシ ARP は、一般的には使用されていません。しかし実は、ルーティングの潜在的な問題を解決する「応急処置」として使用されています。プロキシ ARP は、ARP とまったく同じプロセスを使用します。異なるのは、ARP ではローカル サブネット上にない MAC アドレスを要求する点のみです。要求された宛先へのルートをルータが保持している場合には、ターゲット ホストの代わりに、自身の MAC アドレスとともにプロキシ ARP 応答を発行します。その仕組みを以下の図に示します。

     

    VIPblog_proxyARP.PNG

     

    R7 が、インターフェイス GigabitEthernet1 の MAC アドレスを返信して、受信した ARP 要求に応答していることがわかります。

     

    R7#show interface GigabitEthernet1

    GigabitEthernet1 is up, line protocol is up

      Hardware is CSR vNIC, address is 000c.2968.22dd (bia 000c.2968.22dd)

      Internet address is 155.0.0.7/24


    R7#debug arp

    IP ARP: sent rep src 155.1.1.1 000c.2968.22dd,

                     dst 155.0.0.9 000c.2999.fcba GigabitEthernet1

    IP ARP: sent rep src 155.2.2.2 000c.2968.22dd,

                     dst 155.0.0.9 000c.2999.fcba GigabitEthernet1

    IP ARP: sent rep src 155.3.3.3 000c.2968.22dd,

                     dst 155.0.0.9 000c.2999.fcba GigabitEthernet1

    IP ARP: sent rep src 155.4.4.4 000c.2968.22dd,

                     dst 155.0.0.9 000c.2999.fcba GigabitEthernet1

      

    R7#show ip interface GigabitEthernet1

    GigabitEthernet1 is up, line protocol is up

      Internet address is 155.0.0.7/24

      Broadcast address is 255.255.255.255

      Proxy ARP is enabled

     

    R9 の ARP キャッシュの容量はかなり大きくなります。さらに、すべてのエントリは基本的に同じもので、同じハードウェア アドレスにマップされます。ラボ環境においては、ARP テーブルと CPU 使用率の増加による影響は最小限にとどまりますが、大容量の実稼働ネットワークでは壊滅的な事態を招く可能性があります。

     

    R9#show arp

    Protocol  Address          Age (min)  Hardware Addr   Type   Interface

    Internet  155.1.1.1               0   000c.2968.22dd  ARPA   GigabitEthernet1

    Internet  155.2.2.2               0   000c.2968.22dd  ARPA   GigabitEthernet1

    Internet  155.3.3.3               0   000c.2968.22dd  ARPA   GigabitEthernet1

    Internet  155.4.4.4               0   000c.2968.22dd  ARPA   GigabitEthernet1

     

    もう 1 つの重大な懸念として、隣接ルータのプロキシ ARP 機能に完全に依存してしまう点があげられます。プロキシ ARP が無効な場合、宛先 IP アドレスを MAC アドレスに解決することができません。その結果、送信された ARP 要求に対する ARP 応答が受信されないため、ARP エントリが不完全なものとなります。レイヤ 2 ヘッダーを作成できないため、パケットは廃棄されます。

     


    まとめ

     

    スタティックなデフォルト ルートとして、ネクストホップ IP アドレスを指定した場合と、出力インターフェイスを指定した場合の主な相違点を以下の表にまとめました。

     

    VIPblog_summary.PNG

     

    トラフィックがブラック ホールへ送信されたり(これは稀なケースです)、ルータのリソースが過剰に使用されたりする問題を回避するための最適な選択肢として、ネクストホップ IP と出力インターフェイスの両方を指定する方法があります。

     

    R9(config)#ip route 0.0.0.0 0.0.0.0 GigabitEthernet1 155.0.0.7

     

    R9#show ip route

     

    Gateway of last resort is 155.0.0.7 to network 0.0.0.0

     

    S*    0.0.0.0/0 [1/0] via 155.0.0.7, GigabitEthernet1

          155.0.0.0/16 is variably subnetted, 2 subnets, 2 masks

    C        155.0.0.0/24 is directly connected, GigabitEthernet1

    L        155.0.0.9/32 is directly connected, GigabitEthernet1

     

    CLNBanner