この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
routeコマンドは、IPパケットをルーティングするためのルーティングテーブルの内容表示と設定を行う。ルーティングテーブルは、おもにOSが管理するルーティング情報を保管したメモリテーブルだ。テーブルのエントリーが経路を表している。経路はネットワークまたはホストへ到達するために通過する必要のあるゲートウェイを表している。
ここで、ルーティングテーブルの管理とは、
を意味する。
route[ -f][ -p][ PRINT| ADD| DELETE| CHANGE[ 宛先IPアドレス][ MASK サブネットマスクアドレス[ ゲートウェイIPアドレス][ METRIC メトリック数][ IF インターフェイス名]]
-f | ルーティングテーブルのすべての経路情報をクリアする | |
-p | ADD(追加)時に指定すると、追加した経路は次回以降のOS起動時にも自動的に追加される。指定しない場合は今回限りの設定となる。PRINT(表示)時に指定すると、このオプションで追加した経路のみを表示する*1 | |
ルーティングテーブルを表示する | ||
ADD | 経路を追加する | |
DELETE | 経路を削除する | |
CHANGE | すでに登録されている経路を変更する | |
MASK | 経路が使用するサブネットマスクアドレスを指定する | |
ゲートウェイIPアドレス | 経路が使用するゲートウェイIPアドレスを指定する | |
METRIC | 経路のメトリック値を1〜9999までの範囲で指定する | |
IF | 経路が割り当てられるインターフェースを指定する。インターフェイス名は「route PRINT」で表示される「Interface List」の16進値を指定する。省略されるとゲートウェイIPアドレスから最適と考えられるインターフェイスを自動選択する | |
*1ヘルプなどにはこのように記載されているが、実際には普通のPRINTと何も変わらないようだ
-n | 出力をIPアドレスのみに抑制する(DNS逆引きを行わない) | |
-v | 詳細モード | |
-e | netstatと同様のフォーマットで表示する。-eeはnetstat形式のデータも含めた詳細情報を表示する | |
-F | FIB(Forwarding Information Base:Linuxにおけるルーティングテーブルの実装方式。宛先IPアドレスをキーに経路情報を効率的に配置して性能の向上を図っている)テーブルを用いる。デフォルト | |
-C | カーネルキャッシュでの情報を表示する | |
-A | プロトコル種別。デフォルトは「inet(IPv4)」。ほかに「ipx(IPX)」「inet6(IPv6)」などが使用できる | |
add | 経路を追加する | |
del | 経路を削除する。削除する経路は宛先IPアドレスなど追加時に指定したパラメータが一致する経路である | |
-host | ホストのための経路情報として登録する | |
-net | ネットワーク(サブネット)のための経路情報として登録する | |
宛先IPアドレス | 経路の宛先IPアドレス | |
gw | 経路が使用するゲートウェイIPアドレスを指定する | |
metric | 経路のメトリック値を指定する | |
netmask | 経路が使用するサブネットマスクアドレスを指定する | |
mss | 経路におけるMSS(Maximum Segment Size:TCPパケットの最大データサイズ)を指定する。デフォルトはインターフェイスのMTU(ifconfigコマンドで指定)から導かれる。単位はバイト | |
window | TCPにおけるwindowサイズを指定する。windowsサイズはTCPコネクションにおける最大連続転送サイズである。単位はバイト | |
irtt | 経路におけるTCPの初期ラウンドトリップ時間を指定する。ラウンドトリップ時間はTCPコネクションにおける通信途絶を判断するまでのタイムアウト時間である。単位はミリ秒。1〜12000の範囲で指定する | |
mod/dyn/reinstate | ダイナミックルーティング時などに利用される診断用フラグを設定する | |
dev | 経路が割り当てられるインターフェイス名を指定する。インターフェイス名の指定がすべてのパラメータの最後である場合にはdevキーワードは省略できる | |
reject | ルーティングを拒否する経路を指定する。デフォルトゲートウェイより優先するので、このホストで簡易に特定のネットワークへのルーティングを禁止したい場合には便利だ | |
-V | バージョン情報を表示する | |
-h | ヘルプを表示する | |
Windowsでは「route PRINT」、Linuxでは「route」で現在のルーティングテーブルを確認できる。それぞれ細かな点で出力内容が異なるが、経路情報に関する基本は完全に同じだ。
●Windowsでの使用例
C:\>route print |
●Linuxでの使用例
[root@host1 ~]# route |
上記の例は最も簡単な、つまりインターフェイスを1つだけ設定している場合だ。ホストのIPアドレスは「192.168.1.10(ホスト名:host1)」を設定している。実はほとんどの場合、自身が持つインターフェイスに関する経路はOSが自動的に登録してくれる。そのため、上記は自動設定の結果に過ぎない。Windowsでは、ブロードキャストアドレスへの経路(「192.168.1.255」「255.255.255.255」)やマルチキャストへの経路(「224.0.0.0」)なども追加されて経路数が増えているものの、内容はどちらもほぼ同じだ。
インターフェイス1つにつき、最低限でも「(a) 自身(ホスト)への経路」「(b) 自身の所属するネットワークへの経路」「(c) ローカルループバックへの経路」の3つは必ず必要になる。このうち「ローカルループバックへの経路」は、仮想インターフェイスのための経路だ。たとえインターフェイスが1つもなくとも、必ず自動的に設定される。
共通したルーティングテーブル列は以下のとおりだ。
「宛先IPアドレス」が、それぞれのサブネットにおける経路となる。このネットワークや、そこに所属するホスト向けのパケットは、経路として設定されたインターフェイスからゲートウェイへと転送されることになる。またサブネットマスクは、「宛先IPアドレスがネットワークを意味しているのか」「ホストなのか」を判断するのに使用される。この例では、「192.168.1.0」への経路は、サブネットマスクから導かれるホスト番号(下位8ビット)が0であることから、ネットワークへの経路であると分かる。Linuxでは、ゲートウェイが「*」の場合には、実際にゲートウェイを使用するのではなく、自身のインターフェイスから転送可能である(つまりルーティングを必要としない)ことを意味している。Windowsでも、ゲートウェイが自身のインターフェイスの場合は同様だ。
(d)はデフォルトゲートウェイの指定を意味している。この例では、「192.168.1.254」がデフォルトゲートウェイだ。経路は自身と自身の所属するネットワークしか登録されていないので、それ以外のすべてのルーティングは「192.168.1.254」へ送られることになる。
また、WindowsとLinuxでは固有の情報も表示されている。Windowsの「Interface List」は、設置されているインターフェイスの一覧だ。一番左の番号(16進数)はインターフェース個々の番号だ。Linuxでの「Flags」は経路の種類を示している。「U」は有効、「H」はホスト、「G」はゲートウェイを意味している。そのほか、ダイナミックルーティングを行っている場合には、固有のフラグが追加されることもある。また、「Ref」は経路が参照された回数、「Use」は経路が実際に使用された(ルーティングされた)回数を表している。
●経路の追加
経路をルーティングテーブルに追加するには、Windows/Linuxともに「route add」コマンドを用いる。
●Windowsでの使用例
●Linuxでの使用例
上記では、ネットワーク「192.168.10.0/24」への経路(ゲートウェイ「192.168.1.254」)を追加している。「192.168.10.0/24」はゲートウェイの先にあるので、メトリックは1となる。インターフェイスは省略することもできる。この場合は、ゲートウェイアドレスなどから最も適切と考えられるインターフェイスが自動的に選ばれる。
多くの場合、経路を追加するのは、インターフェイス(NIC)を追加したり、デフォルトゲートウェイだけでは対処できないネットワークが新たに追加された、などの場合だろう。例えば、以下の図1のような構成でのホストXからホストYへのルーティングでは、ホストZがネットワーク「192.168.99.0/24」を知らなければ、ルーティングは行えないので、ホストZに対して以下のような経路を追加するとよい。
●Linuxでの使用例
[root@host-z ~]# route add -net 192.168.99.0 gw 192.168.10.253
metric 1 netmask |
なお、この例のように、ほかのホストからのIPパケットを、インターフェイスから別のインターフェイスへと転送することを「IPフォワーディング」と呼ぶ。この機能は通常、デフォルトでは不可となっているので、使用する場合には明示的に使用を許可しなくてはならない。
Linuxでは「/etc/sysconfig/network」ファイルで
FORWARD_IPV4="no"
を「yes」に変更する。またはRedHat 6.2以降などでは、「/etc/sysctl.conf」の
net.ipv4.ip_forward = 0
を「1」に変更することで許可する場合もある。
Windows 2000ではレジストリを設定するか*2、またはRRAS(Routing and Remote Access Service)を使用したほうが無難だろう。
*2\\HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \IPEnableRouterに「1」をセットする
●継続的な経路の追加
これらのコマンドで追加された経路は一時的なもので、ホストをリブートすると無効になってしまう。そこで、Windowsでは「-p」オプションを追加することで、OSブート時に再設定される経路(Persistent Routes)を追加できる。再設定される経路は「route PRINT」コマンドで「Persistent Routes」に表示される。Linuxではrouteコマンドでは行えないが、「/etc/sysconfig/static-routes」ファイルに経路を記述しておけば、OSブート時に再設定される。
●Windowsでの使用例
C:\>route -p add 192.168.99.0 mask 255.255.255.0 192.168.10.253 metric 1 if 0x1000003 |
●Linuxでの使用例
eth0 net 192.168.99.0 netmask 255.255.255.0 gw 192.168.10.253 |
●拒否経路の追加
Linuxでは拒否経路を追加することもできる。拒否経路には、そのホストでルーティングしない宛先を指定する。デフォルトゲートウェイを設定している環境で、ルーティングしたくないネットワークやホストがある場合に追加する。
●Linuxでの使用例
[root@host1 ~]# route add -net 192.168.40.0 netmask 255.255.255.0 reject |
●経路の削除と変更
経路の削除は、Windowsは「route DELETE」コマンド、Linuxは「route del」コマンドで行う。
●Windowsでの使用例
C:\>route delete 192.168.90.0 |
●Linuxでの使用例
[root@host1 ~]# route del -net
192.168.90.0 netmask 255.255.255.0 |
Windowsでは経路の変更は「route CHANGE」コマンドで行えるが、Linuxでは変更は行えない。「route del」と「route add」を組み合わせる必要がある。
●トラブル解決の第一歩は現状の把握から
ルーティングのトラブルは、ネットワーク障害において最もやっかいな部類に入る。まず、必ずしも自身のホストにおける問題でないことが多い。ほかの場所にあるルータや、中継に使っているホストのルーティング設定ミスが問題だとすると、すぐには原因がつかみにくい。また影響範囲が大きく、深刻な問題を起こしやすい。ダイナミックルーティングを使っていると、設定ミスがほかの機器に伝播してしまうこともある。
問題を早急に収束させるためにも、普段からネットワーク構成がどうなっているか、本来どのようにルーティングさせるべきとしているか、きちんとまとめて把握しておくようにしよう。あるべき理想の姿と、現状の障害の様子を比較することは、原因調査の第一歩である。
経路情報は非常に複雑なので、経路図を覚えるのも無理がある。経路の設計書など資料を管理するのはもちろんだが、ルータや中継ホストのルーティングテーブルを正常に稼働している際にダンプして保存し、障害時に比較できるようにしているケースもある。台数が多いと逆に煩雑になるだけだが、ネットワークの根幹に設置しているなど、ポイントとなる機器のみを対象にしてもいいだろう。単純だが実は意外に効果がある方法だ。いずれにせよ、普段からの準備が解決の速度を決めると心がけよう。
●ネットワークコマンドで状況を探る
ルーティングの状態を確認するには、まずは「traceroute(tracert)」コマンドを用いるのがベストだ。もっとも、traceroute(tracert)コマンドはある特定ホストから別のホスト間の経路についてだけ表示するものだともいえる。ただ1つの経路で調査するだけでなく、複数のホストから調査を行って比較する必要もある。もし複数の調査結果が同じルータやホストを示していれば、ほぼ原因は絞れる。
●有効なサブネットマスク/ゲートウェイが使用されているか?
原因となるルータやホストが特定できたら、そこで使用されているルーティングテーブルが適切かどうかの判断を行うわけだが、意外に多いミスはサブネットマスクの間違いだ。すでに述べたように、サブネットマスクはサブネットのネットワーク番号を決定するのに使われる。つまり、宛先IPアドレスがマッチしないと判断されて、別のゲートウェイに転送されたり破棄されてICMPエラーになっているかもしれない。ゲートウェイの設定ミスでも、もちろん同じ現象を引き起こす。
また、デフォルトゲートウェイの設定も見落としがちだ。便利なために必要がなくともつい設定してしまい、設定間違いからルーティングミスにつながる場合もある。デフォルトゲートウェイは、ほかのすべてのネットワークを意味する「ワイルドカード」でしかない。決して最適なゲートウェイということではないので注意しよう。
●メトリックは適切か?
特定ホストに対して複数の経路があり得る場合、その経路選択の判断に使用されるのがメトリックだ。このメトリックは、ダイナミックルーティングを使用している場合には動的に更新されるため、実際に運用してみると設計時の想定動作と異なる、という場合もある。
もっとも、動的に変更された距離(ホップ数)や回線品質によって経路を変更できるのがダイナミックルーティングのメリットなので、それで問題ないということでもいいが、RIP/RIP2ではその経路が何らかの問題で使用不可だと判断すると、メトリックを非常に大きな数値にして使用しないようにしてしまう。実際に稼働しているシステムでのメトリックの変化にも着目するようにしよう。
●不用意にRIP/RIP2が使用されていないか?
ダイナミックルーティング、特にRIP/RIP2の場合、ネットワーク内に予想外のroutedなどが稼働していると、自動的にその情報を受け取り、ルーティングテーブルが混乱してしまうことがある。特に、送出されたルーティングテーブルがテスト用など不適切なものだと、間違ったルーティングテーブルがネットワーク全体にあっという間に広まってしまう。復旧するには、予定外のroutedを停止し、混乱したルータやホストのルーティングテーブルを修正して回るなどしかない。非常に危険なミスなのだが、実際に多いケースでもある。
これを防ぐためには、根幹となるルータやホストではスタティックにルーティングテーブルを設定し、routedは受信不可/送信のみ可能とする、などの方法が考えられる。
Copyright © ITmedia, Inc. All Rights Reserved.