ルーターは通常,「あて先ベースのルーティング」(Destinaiton-Based Routing:DBR)を実行します。しかし,場合によっては,プロトコルやパケットサイズといった条件に基づいて,柔軟にトラフィックのパスを指定したいというケースが出てきます。このようにパスを柔軟に変更する「ポリシーベースルーティング」(Policy-Based Routing:PBR)を実現する方法として,ルートマップを使う方法があります。

ルートマップを設定する

 BGPを除くルーティングプロトコルは,IPパケットのあて先IPアドレスによりパスを選択します。パス選択の基準をあて先IPアドレス以外にするには,受信した経路情報に対して処理を実施します。そこで使われるのが「ルートマップ」です。

 ルートマップは次の目的で使用されます。

  • 再配布のフィルタリング … メトリックを制御することによりフィルタリングを実行する
  • ポリシーベースルーティング … アドレスやパケットサイズなどからパスを選択する
  • NAT … アドレス変換の条件を細かく指定する
  • BGP … BGPのアトリビュートを変更する

 ルートマップはアクセスリストと同じように,命令を作成します。ただし,アクセスリストのように1つの命令を1行で記述するのではなく,複数のコマンドで1つの命令を記述します。ルートマップの作成は,まずルートマップ設定モードに入ることから始まります。

  • (config-router)# route-map マップタグ [permit | deny] シーケンス番号
    • マップタグ
      • ルートマップ名
    • [permit | deny]
      • 条件が一致した場合の処理
    • シーケンス番号
      • 作成するルートマップのリストの行番号

 命令の内容をルートマップ設定モードで設定します。ルートマップの行には「match」と「set」を使用します。

  • (config-router-map)# match 条件項目 条件内容
  • (config-router-map)# set 設定項目 設定内容

 matchは条件を,setはその条件に一致した場合の設定を記述します。ルートマップを使う目的により,記述が異なります。この2つで1セットになり,1つの命令を構成します(図1)。

 図1 ルートマップの作成

ルートマップを使ったポリシーベースルーティング

 シスコ・ルーターでは,ルートマップを使ってポリシーベースルーティングを実現します。具体的には,次の条件を使うことができます。

  • IPアドレス
  • ポート番号
  • プロトコル
  • パケットサイズ
  • ToS(Tyoe of Service)値

 ポリシーベースルーティングを実施するにあたって使うルートマップのmatchコマンドは,次の2種類の構文がよく使われます。

  • (config-router-map)# match ip address [ACL]
    • [ACL]
      • ACL番号またはACL名
  • (config-router-map)# match match length [min] [max]
    • [min] [max]
      • レイヤ3PDUのサイズの最小値と最大値

 同様に,setコマンドでは次の2種類の構文がよく使われます。

  • (config-router-map)# set ip next-hop [IPアドレス]
    • [IPアドレス]
      • 次のネクストホップを指定。複数設定可能
  • (config-router-map)# set interface [インタフェース名]
    • [インタフェース名]
      • パケットを出力するインタフェース。複数設定可能

 また,条件にToS値を使う場合のsetコマンドは次の構文になります。

  • (config-router-map)# set ip tos [値 | ワード]
    • [番号 | ワード]
      • IPパケットのサービスタイプを変更します
  • (config-router-map)# set ip precedence [値 | ワード]
    • [番号 | ワード]
      • IPパケットのプレシデンスを変更します

 set ip tosとset ip precedenceコマンドは,IPヘッダのToSフィールドにある8ビットを変更できます。ip tosはToSフィールドの後半5ビットを,ip precedenceは先頭3ビットを変更します。値を直接入力する方法と,キーワードによる設定方法があります。

 そして,作成したルートマップはインタフェースに設定します。

  • (config-if)# ip policy route-map マップタグ
    • マップタグ
      • 作成したルートマップのマップタグ

 例えば,次の図2のような構成のネットワークがあるとします。ルータAのルーティングテーブルは図3のように作成されます。通常なら,10.0.0.0/24へのベストパスは172.16.0.2がネクストホップになります(図2・3)。

 図2 ネットワーク構成図
ネットワーク構成図

 図3 ルータAのルーティングテーブル
distribute-listによるアドバタイズのフィルタ

 ここで,ネクストホップを172.17.0.2に変更するポリシーをルータAのfa0/0に設定します。その結果,PC(192.168.0.2)から10.0.0.0/24あてのtracerouteは図5のようになります(図4・5)。

 図4 ルートマップの作成(その1)
ルートマップの作成(その1)

 図5 tracerouteの結果(その1)
図5 tracerouteの結果(その1)

 ただし,この設定ではすべてのあて先に対し,172.17.0.2をネクストホップにするため,ルーティングで最適なパスが選ばれない可能性があります(図6)。

 図6 tracerouteの結果(その2)
tracerouteの結果(その2)

 こうしたとき,拡張ACLを使用することで,特定のIPアドレスを送信元/あて先とするパケットにポリシーを適用したり,ポート番号やプロトコルによる指定が可能になります(図7)。

 図7 ルートマップの作成(その2)
ルートマップの作成(その2)

 上の図7の設定例では,2つのルートマップを作成し,あて先が10.0.0.0/24ならシーケンス番号10のset文(ネクストホップを172.17.0.2へ),あて先が11.0.0.0/24ならシーケンス番号20のset文(インタフェースs0/0からの送信)というポリシーを適用しています。

 図2の構成図と図3のルーティングテーブルを見るとわかりますが,ルータAは,ルータBのループバックインタフェースとして設定された11.0.0.0/24を知りません。ですが,図7によってポリシーを設定したので,パケットは届きます(図8)。

 図8 pingの結果
pingの結果

 また,ToS値の設定は次のようになります。ルータCから192.168.0.0/24あてのパケットのToS値を7に変更しています(図9・10)。

 図9 ルートマップの作成(その3)
ルートマップの作成(その3)

 図10 PCでのキャプチャ結果
PCでのキャプチャ結果

ルートマップを確認する

 最後に,作成したルートマップを確認する方法についても押さえておきましょう。ルートマップの確認には,show route-mapコマンドとdebugコマンドを使います(図11・12)。

  • (config)# show route-map
  • (config)# debug ip policy

 図11 show route-mapの表示結果
show route-mapの表示結果

 図12 debug ip policyの表示結果
debug ip policyの表示結果