ルーターは通常,「あて先ベースのルーティング」(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名
- [ACL]
- (config-router-map)# match match length [min] [max]
- [min] [max]
- レイヤ3PDUのサイズの最小値と最大値
- [min] [max]
同様に,setコマンドでは次の2種類の構文がよく使われます。
- (config-router-map)# set ip next-hop [IPアドレス]
- [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のルーティングテーブル
ここで,ネクストホップを172.17.0.2に変更するポリシーをルータAのfa0/0に設定します。その結果,PC(192.168.0.2)から10.0.0.0/24あてのtracerouteは図5のようになります(図4・5)。
図4 ルートマップの作成(その1)
図5 tracerouteの結果(その1)
ただし,この設定ではすべてのあて先に対し,172.17.0.2をネクストホップにするため,ルーティングで最適なパスが選ばれない可能性があります(図6)。
図6 tracerouteの結果(その2)
こうしたとき,拡張ACLを使用することで,特定のIPアドレスを送信元/あて先とするパケットにポリシーを適用したり,ポート番号やプロトコルによる指定が可能になります(図7)。
図7 ルートマップの作成(その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の結果
また,ToS値の設定は次のようになります。ルータCから192.168.0.0/24あてのパケットのToS値を7に変更しています(図9・10)。
図9 ルートマップの作成(その3)
図10 PCでのキャプチャ結果
ルートマップを確認する
最後に,作成したルートマップを確認する方法についても押さえておきましょう。ルートマップの確認には,show route-mapコマンドとdebugコマンドを使います(図11・12)。- (config)# show route-map
- (config)# debug ip policy
図11 show route-mapの表示結果
図12 debug ip policyの表示結果