もがもがしいブログ

もがもがしく生きる

有線LANと無線LANの優先度を切り替える

会社でノートPCを使っていると、無線LANと有線LANを使い分けたいことがあります。
イントラネットには無線でしかアクセスできないけど、
運用LANには有線でしかアクセスできないみたいなパターンですね。
こんな時、PCのルーティングテーブルが適切に設定されていないと、
無線で通信するべきネットワークに有線でつないだり、その逆の事態が生じたりします。
これを解消するのがrouteコマンドです。
クライアントOSはWindows 7、ネットワーク構成は以下の前提で説明していきます。

f:id:moga_shi:20130330235647p:plain

まず、route printコマンドでPCの現在のルーティングテーブルを確認します。

C:\Users\u123456>route print
===========================================================================
インターフェイス一覧
 11...f0 de f1 ** ** ** ......Intel(R) 82579LM Gigabit Network Connection
 12...10 0b a9 ** ** ** ......Intel(R) Centrino(R) Advanced-N 6205
  1...........................Software Loopback Interface 1
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0        10.192.1.254      10.192.1.100     20
       10.192.1.0    255.255.255.0            リンク上      10.192.1.100    266
     10.192.1.100  255.255.255.255            リンク上      10.192.1.100    266
     10.192.1.255  255.255.255.255            リンク上      10.192.1.100    266
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    306
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    306
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    306
        224.0.0.0        240.0.0.0            リンク上      10.192.1.100    266
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
  255.255.255.255  255.255.255.255            リンク上      10.192.1.100    266
===========================================================================
固定ルート:
  なし


この構成だと、有線LANでしか接続できないネットワークや
社内のプロキシでブラックリストに登録されているサイトにアクセスできません。
ここに有線LANを接続します。

f:id:moga_shi:20130331005228p:plain

C:\Users\u123456>route print
===========================================================================
インターフェイス一覧
 11...f0 de f1 ** ** ** ......Intel(R) 82579LM Gigabit Network Connection
 12...10 0b a9 ** ** ** ......Intel(R) Centrino(R) Advanced-N 6205
  1...........................Software Loopback Interface 1
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0        10.192.1.254      10.192.1.100     20
       10.192.1.0    255.255.255.0            リンク上      10.192.1.100    266
     10.192.1.100  255.255.255.255            リンク上      10.192.1.100    266
     10.192.1.255  255.255.255.255            リンク上      10.192.1.100    266
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    306
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    306
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
      192.168.1.0    255.255.255.0            リンク上     192.168.1.100    261
    192.168.1.100  255.255.255.255            リンク上     192.168.1.100    261
    192.168.1.255  255.255.255.255            リンク上     192.168.1.100    261
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    306
        224.0.0.0        240.0.0.0            リンク上     192.168.1.100    261
        224.0.0.0        240.0.0.0            リンク上      10.192.1.100    266
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
  255.255.255.255  255.255.255.255            リンク上     192.168.1.100    261
  255.255.255.255  255.255.255.255            リンク上      10.192.1.100    266
===========================================================================
固定ルート:
  なし


有線LANに接続しているので有線LAN向けの通信ができそうですが、デフォゲが無線LANルータの方を向いているので、
宛先ノードが自分と同じネットワークに存在しない場合、
パケットが無線LANルータの方に行ってしまいます。
かといって、すべてのパケットを有線LAN経由にすると、今度は無線LANでしか
通信できないネットワークと通信できなくなってしまいます。


案1

要件を以下のように定めます。

f:id:moga_shi:20130331005230p:plain

  • 無線LAN経由でしか通信できないネットワーク宛のパケットは必ず無線LANルータ経由にする。
  • 宛先が自分と同じネットワークに存在しないパケットは、
    • PCにLANケーブルが接続されている時はそっち経由にする。
    • 接続されていない時は無線LANルータ経由にする。


実行するコマンドは以下の通りです。

C:\Users\u123456>route -p add 0.0.0.0 mask 0.0.0.0 192.168.1.254 metric 10

デフォルトルートを有線LANルータ宛に設定。メトリックが無線LANルータよりも小さくなるように。
-pは再起動後もルートを維持するオプション。


C:\Users\u123456>route -p add 10.240.0.0 mask 255.255.0.0 10.192.1.254

イントラネット宛の通信は必ず無線LANルータ経由にする。
メトリックは省略すると1になる。


なお、不幸にも有線LANと無線LANでネットワークアドレスが重複してしまう場合は、
route printコマンドの一番上に出てくるインタフェースを番号で指定します。(今回は不要です)

C:\Users\u123456>route -p add 10.240.0.0 mask 255.255.0.0 10.192.1.254 if 12


これで完成となりますが、実はこの設定だと以下の問題があって実用性に乏しいです。

  • DNSの名前解決が有線LAN経由になるため、社内システムのホスト名を解決できない。

案2

上記の問題を解決するために、仕様を以下のように変更します。

f:id:moga_shi:20130331005231p:plain

  • 基本は無線LANルータ経由で通信する。
  • 有線LANで接続したいネットワークだけroute addで追加する。

コマンドは次のとおりです。

C:\Users\u123456>route delete 0.0.0.0
C:\Users\u123456>route delete 10.240.0.0

先程登録したルートを削除します。


C:\Users\u123456>route -p add 0.0.0.0 mask 0.0.0.0 10.192.1.254 metric 20

デフォルトゲートウェイ無線LANルータにします。


C:\Users\u123456>route -p add 173.194.38.96 mask 255.255.255.240 192.168.1.254

有線LANで接続したいルートを個別に登録します。
ブラウザで閲覧する時はプロキシの例外設定を忘れないようにしてください。


ルーティングテーブルの最終形は次のようになります。

C:\Users\u123456>route print
===========================================================================
インターフェイス一覧
 11...f0 de f1 ** ** ** ......Intel(R) 82579LM Gigabit Network Connection
 12...10 0b a9 ** ** ** ......Intel(R) Centrino(R) Advanced-N 6205
  1...........................Software Loopback Interface 1
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0        10.192.1.254      10.192.1.100     20
       10.192.1.0    255.255.255.0            リンク上      10.192.1.100    266
     10.192.1.100  255.255.255.255            リンク上      10.192.1.100    266
     10.192.1.255  255.255.255.255            リンク上      10.192.1.100    266
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    306
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    306
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
    173.194.38.96  255.255.255.240       192.168.1.254     192.168.1.100      6
      192.168.1.0    255.255.255.0            リンク上     192.168.1.100    261
    192.168.1.100  255.255.255.255            リンク上     192.168.1.100    261
    192.168.1.255  255.255.255.255            リンク上     192.168.1.100    261
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    306
        224.0.0.0        240.0.0.0            リンク上     192.168.1.100    261
        224.0.0.0        240.0.0.0            リンク上      10.192.1.100    266
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
  255.255.255.255  255.255.255.255            リンク上     192.168.1.100    261
  255.255.255.255  255.255.255.255            リンク上      10.192.1.100    266
===========================================================================
固定ルート:
  ネットワーク アドレス          ネットマスク  ゲートウェイ アドレス  メトリック

          0.0.0.0          0.0.0.0   10.168.195.254      20
    173.194.38.96  255.255.255.240    192.168.1.254       1
===========================================================================

その他

今回はWindowsのrouteコマンドをご紹介しましたが、Linuxにもrouteコマンドがあります。
書き方は異なりますが、基本的な動作は同じだと思われるので、詳しいことは以下のサイトなどをご覧ください。
Linuxコマンド集 - 【 route 】 ルーティング・テーブルを表示・設定する:ITpro


課題

案1で、名前解決だけを無線LAN経由にできれば問題は解決できたのではないかと思いますが、その方法が分かりませんでした。
分かり次第追記しますが、ご存知の方がいればご教示ください。