【解決】そのネットワーク不調、「ルーティングテーブル」が原因かも? Windows標準「route」コマンドやPowerShellで今すぐ確認する方法:Tech TIPS
ルーターを超えたネットワーク通信に重要な役割を担う「ルーティングテーブル」。Windows OSのルーティングテーブルはどうやって操作すればいいのか? Windows OS標準装備のコマンド「route」に加えてPowerShellコマンドレットの基本的な使い方を解説する。
対象OS:Windows 10/11、Windows Server 2016/2019/2022/2025
Windows PCの「ルーティングテーブル」を変えたい!
TCP/IPでは、IPアドレスに基づいてネットワークパケットのルーティングを行っている。このルーティング処理において重要な役割を持つのが「ルーティングテーブル」(ルートテーブル)である。
ルーティングテーブルには、宛先となるネットワークアドレス(とネットマスク)と使用するネットワークインタフェースなどを記録した情報(エントリ)が多数格納されている。
IPパケットのルーティング処理では、パケットの宛先IPアドレスがどのルーティングテーブルのエントリに合致するかを調べ、合致するものがあれば、指定されたネットワークインタフェースへと送出する。また、どのエントリにも合致しなければ、「デフォルトゲートウェイ」として指定されているルーターへとパケットが送られる。
このように、TCP/IPのルーティング処理では、ルーティングテーブルが重要な役割を担っている。
とはいっても、一般的な用途では、PCのルーティングテーブルを手動で変更する必要性は少ない。
しかし、ルーターに頼ることなく、PCから同時に2カ所以上のネットワークへ接続しなければならないような場合には、そのルーティングテーブルをメンテナンスする必要がある。例えば、通常の社内ネットワークや一時的に構築されたローカルネットワーク、VPN回線、バックアップ用のインターネット回線などへ同時に接続する、といった状況が挙げられる。
本Tech TIPSでは、Windows OSにおけるルーティングテーブルの管理方法について簡単に解説する。ルーティングテーブルの操作には、どのWindows OSにも標準装備されている「route.exe」コマンドの他、PowerShellコマンドレットを使う方法も説明する。
「route print」コマンドで現在のルーティングテーブルを表示させる
現在のルーティングテーブルの状態を表示するには、「route print」コマンドを実行する(「netstat -r」コマンドでも全く同じ情報が得られる)。
ルーティングテーブル(ルートテーブル)は、IPv4とIPv6それぞれに存在する。以下では主にIPv4を例に挙げて説明していく。
この画面で押さえておくべきポイントを幾つか説明しておこう。
●「メトリック」とは?
「メトリック」(Metric:距離という意味)の値は、同じルートが複数存在する場合、どれを優先するかを決めるために使われる。
メトリックは数値が小さい方が優先される。ただし数値の大小関係だけが意味を持ち、絶対的な値には無関係だ。例えばメトリックが「1」と「20」の2通りのエントリがあると、「1」のルートの方が優先されることになる。
●「インターフェイス」とは?
これはネットワークインタフェース(ネットワークカード、NIC)を指していて、イーサネットや無線LAN、携帯通信アダプタなどのインタフェースが該当する。
route printによって出力される「インターフェイス一覧」枠には各ネットワークインタフェースが列挙され、その左端に識別用の番号(ここでは<インタフェース番号>とする)が表示される。後述する「route add」コマンドで特定のインタフェースを指定する場合には、「IF <インタフェース番号>」と指定する必要がある。
●デフォルトルートはどれ?
IPv4のルーティングテーブルの一番上に表示されている「ネットワーク宛先」「ネットマスク」がどちらも「0.0.0.0」の行が、デフォルトルートを表している。
この行の意味は、「デフォルトゲートウェイは、インタフェース『172.16.80.146』のネットワークにつながっている『172.16.64.1』というルーターである」という意味である。
「route add」コマンドで新しいルートを追加する
以下のような環境や状況では、ルーティングテーブルに対して新しいエントリを追加する必要がある。
- LAN上に2つ以上のルーターが存在し、それぞれ異なるネットワークへ接続している
- 特別なネットワーク環境を構築したので、ある特定のルートだけを別のルーターへ迂回(うかい)させたい
新しいルートを追加するには、「route add」コマンドを使用する。
route <オプション> add <宛先> mask <ネットマスク> <ゲートウェイアドレス> metric <メトリック値> if <インタフェース番号>
- <オプション>には「-f」と「-p」がある。「-p」を付けると、追加したルート情報が、次回の再起動後からもずっと有効になる。デフォルトでは、システムを再起動すると、ここで追加した情報は失われる。「-f」を付けると、ルートを追加する前に、現在のゲートウェイ(ルーター)の全エントリを削除する
- <宛先>には、ルーティングの宛先となるネットワークアドレスを指定する
- <ネットマスク>には、宛先ネットワークのネットマスクを指定する。省略した場合は「255.255.255.255」になる
- <ゲートウェイアドレス>には、ゲートウェイのIPアドレスを指定する
- 前述のメトリック値を手動で指定したい場合は<メトリック値>を指定する。省略すると自動的に決定される。複数のインタフェースのうち、特定のものの優先度を上げたい場合にはこれを指定することがある
- 特定のインタフェースを指定したい場合は<インタフェース番号>を指定する
その他の詳細については、routeコマンドのヘルプを参照していただきたい(単に「route」とだけ入力して実行すると表示される)。
route addのようにルーティングテーブルを操作するコマンドを実行するには、管理者アカウントの権限が必要だ。そのため、以下の例を試す際には、必ず管理者権限でコマンドプロンプトを起動すること。
さて、例えば「10.0.0.0/8」のネットワークへのルーターが「172.16.80.1」ならば、次のようなコマンドラインを実行すればよい。
route add 10.0.0.0 mask 255.0.0.0 172.16.80.1
宛先のネットワークアドレスだけではなく、ネットマスクも忘れずに指定しよう。これを付け忘れると(省略すると)、それはネットワークではなく、「10.0.0.0」というただ1つだけのIPアドレスを表すことになる。
特定の1つのIPアドレスだけへのルートを設定するならそれでもかまわないが、このような指定はめったに使うことはない。一般的には「255.255.255.255」以外のネットマスクを使い、ネットワーク全体を指すのが普通である。
ルート情報を追加したら、必ずroute printコマンドで再確認しよう。
「route add -p」コマンドで永続的なルートを追加する
特にオプションを指定せずに「route add」コマンドを実行した場合、そのシステム(Windows OS)を再起動すると、追加したルートは消えてしまう。
再起動後も永続的に残したい場合は、「-p」オプションを付けて「route add」コマンドを実行する。
「route delete」コマンドでルートを削除する
特定のルートエントリだけを削除するには、次のコマンドを使用する。
route delete <宛先> mask <ネットマスク>
- <宛先>には、削除したいネットワークアドレスを指定する
- <ネットマスク>にはネットマスクを指定する
- 使用するゲートウェイやインタフェースも、前述の「route add」コマンドと同様、明示的に指定できる
<ネットマスク>を指定しないと、<宛先>に合致する全エントリが削除されるので注意が必要だ。同じネットワークに対して複数のルートがあり、その中の特定のエントリだけを削除したい場合は、ネットマスク(やゲートウェイ、インタフェースなど)を必ず指定すること。
例えば、先ほど追加した「10.0.0.0/8」へのルートを削除するには、以下のコマンドラインを実行する。
route delete 10.0.0.0 mask 255.0.0.0
ルートを削除したら、やはりroute printコマンドでルーティングテーブルの確認をすること。
「route change」コマンドで既存のルートを変更する
現在のルーティングテーブル内にある特定のエントリの内容を変更するには、「route change」コマンドを利用する。
例えばデフォルトゲートウェイを「172.16.1.201」に変更するには、次のようにする。
route change 0.0.0.0 mask 0.0.0.0 172.16.64.201
route changeコマンドで変更できるのは、ゲートウェイとメトリックに限られる。宛先やそのネットワークマスクを変更するには、いったんそのルートのエントリをroute deleteコマンドで削除してから、route addコマンドで新しい宛先/ネットワークマスクを含むルートを追加し直す必要がある。
リモートからデフォルトルートを変更する場合、宛先やネットマスクなどを間違えると、以後の通信が全くできなくなって制御や管理ができなくなることがある。あらかじめ、現在のリモート操作に使っているルートを明示的に追加しておくなどの対策をした方がよいだろう。
PowerShellコマンドレットでルーティングテーブルを操作するには
スクリプトでルートを追加/削除したい場合や、複雑な条件で対象のルートを絞り込みたい場合、routeコマンドを駆使するより、PowerShellのネットワークルート向けコマンドレットを活用した方が便利だ。以下ではPowerShellによるルートの設定/確認の手順を紹介する。
PowerShellのバージョンは5.1または7以降を前提としている。
●現在のルーティングテーブルを表示させるには
現在のルーティングテーブルの状態を表示するには、「Get-NetRoute」コマンドレットを実行する。
前述のrouteコマンドとGet-NetRouteコマンドレットの出力を比べると、各列の見出しが異なる。以下のように読み替えるとよいだろう。
- ifIndex: インタフェース番号
- DestinationPrefix: 宛先とそのネットワークマスク/プレフィックスの長さ
- NextHop: ゲートウェイアドレス
- RouteMetric、ifMetric: 合算した値がrouteコマンドのメトリック値に相当
- PolicyStore: 「ActiveStore」ならシステムの再起動で消えてしまう「一時的なルート」、「PersistentStore」なら再起動後も残る「永続的なルート」をそれぞれ表す
「if〜」という見出しについては、実際のプロパティ名は「Interface〜」になるので、コマンドレット実行時にプロパティを指定する際には注意しよう。
Get-NetRouteコマンドレットは、上記の他にも多数のプロパティを取得する。全てのプロパティを表示させるには、以下のように「Format-List」コマンドレットでリスト表示させるとよい。
Get-NetRoute | Format-List -Property *
テーブル表示のまま列数を絞り込みたければ、「Format-Table」コマンドレットの「-Property」パラメーターで各列を列挙すればよい。以下のコマンドラインでは、routeコマンドと同様の順番で各列が出力されるようにしている。
Get-NetRoute | Format-Table -Property DestinationPrefix,NextHop,InterfaceAlias,RouteMetric,InterfaceMetric
●新しいルートを追加するには
ここからは、各PowerShellコマンドレットを管理者アカウントで実行する必要がある。それには、[スタート]ボタンを右クリックして表示されるメニューで、[Windows PowerShell(管理者)]または[ターミナル(管理者)]をクリックすること。
さて、ルーティングテーブルに新しいルートを追加するには、「New-NetRoute」コマンドレットを用いる。
New-NetRoute -DestinationPrefix <宛先プレフィックス> -NextHop <ゲートウェイアドレス> -InterfaceIndex <インタフェース番号>
例えば「10.0.0.0/8」のネットワークへのルーターが「172.16.80.1」で、そこにつながっているネットワークインタフェースの番号が「5」ならば、次のようなコマンドラインを実行すればよい。
New-NetRoute -DestinationPrefix 10.0.0.0/8 -NextHop 172.16.80.1 -InterfaceIndex 5
メトリック値を指定したい場合は「-RouteMetric <ルートメトリック値>」というパラメーターを付ける。
永続的なルートとして追加するには、「-PolicyStore PersistentStore」というパラメーターを付けること。これを付けないと、システムを再起動した後に、追加ルートが消えてしまう。
●ルートを削除するには
ルーティングテーブルから特定のルートを削除するには、「Remove-NetRoute」を用いる。
Remove-NetRoute -DestinationPrefix <宛先プレフィックス> -NextHop <ゲートウェイアドレス> -InterfaceIndex <インタフェース番号>
注意が必要なのは、指定したパラメーターに一致するルートが複数あった場合、いずれも削除されるということだ。うっかりパラメーターを指定し忘れると、意図していないルートまで削除される危険性がある。
そのため、Get-NetRouteコマンドレットで対象のルートを絞り込みつつ確定してから、パイプラインで対象ルートのオブジェクトをRemove-NetRouteコマンドレットに渡した方が安全だろう。
# ルートの絞り込みを確認
Get-NetRoute -DestinationPrefix <宛先プレフィックス> -NextHop <ゲートウェイアドレス> -InterfaceIndex <インタフェース番号>
# 確認できたら「 | Remove-NetRoute」を付けて実際に削除
Get-NetRoute -DestinationPrefix <宛先プレフィックス> -NextHop <ゲートウェイアドレス> -InterfaceIndex <インタフェース番号> | Remove-NetRoute
●既存のルートを変更するには
ルーティングテーブルにある特定のルート(エントリ)のルートメトリック値を変更するには、以下のように「Set-NetRoute」コマンドレットを実行する。
Set-NetRoute -DestinationPrefix <宛先プレフィックス> -NextHop <ゲートウェイアドレス> -InterfaceIndex <インタフェース番号> -RouteMetric <新たなルートメトリック値>
宛先プレフィックスやゲートウェイ、インタフェース番号を変更するには、いったんRemove-NetRouteコマンドレットで対象のルートを削除してから、New-NetRouteコマンドレットで新たなルートを追加し直す必要がある。
■この記事と関連性の高い別の記事
- IPアドレスとは(基礎から学ぶWindowsネットワーク)
- ネットワークのバインド順序を制御する方法(TIPS)
- 優先DNSサーバと代替DNSサーバの動作について(TIPS)
- Windowsのデフォルトゲートウェイは1つのみ有効(TIPS)
- Windowsのレジストリを設定してIPルーティングを有効にする(WindowsマシンをIPルーターにする)(TIPS)
- IPルーティングを有効にする方法(Server OS編)(TIPS)
- ICMPリダイレクト使用時のファイアウォール設定に注意(TIPS)
- Windowsのpingの-rオプションでパケットの通過ルートを確認する(TIPS)
■更新履歴
【2025/10/01】PowerShellでルーティングテーブルを操作する方法を追記しました。
【2022/10/19】Windows 10/11などに対応しました。
【2003/01/11】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.