morimorihogeです。SGDQ21は良かったですね(その後スポンジボブをNetflixで観始めました)。ESA Summerも始まりましたしRTA in Japanも楽しみです。
諸般の事情からWindows環境でIPアドレスを切替ながら使いたいというユースケースに遭遇したのでまとめます。
具体的には、ノートPCに接続した
- ノートPC内蔵のWi-Fi経由
- USB経由のWiMAX回線
の二つのインターネット回線を物理的にPCに触らず、リモートRDP接続からWindowsの設定変更だけで任意に切り換えるという手順について書きます。
※本記事はWiFiとUSB接続WiMAXルーターの切り替えについて記載していますが、例えば自宅回線とVPN経由回線の経路を切り替えたい、といったケースでも応用が利くかと思います。ただ、そういった場合はVPN側のネットワークアドレスと自宅LANのネットワークアドレスが別のCIDRである必要があるなどの制限がでますので、適宜良い感じに読み替えてください。
背景など
元々は下図のような構成で、作業用デスクトップPCから動作確認用ノートPCにRDP接続して作業をしていました。
自宅内LANにWiFi接続したノートPCに繋ぎ、ノートPCはデスクトップPCと同じ経路でインターネットに出て行くごくごく一般的な構成です。
ある日、インフラ設定しているとちょいちょいある送信元IPアドレス制限的なアレを動作確認する必要に駆られ、手持ちのWiMAXルーターを使って別回線接続することにしました。
しかし、WiMAXルーターをノートPCにWiFi接続で繋ごうとすると、ノートPCのWiFiインターフェースは一つのため自宅内LAN側の接続が切れてしまい、RDP接続できなくなってしまいます。
というわけで、WiMAXルーターをUSB接続で繋ぎ、USB経由でWiMAX回線への接続経路を作ったのが下図です。
この環境下で以下のことをやりたいというのが今回のモチベーションになります。
- ノートPCからインターネットへの経路A/BをVDSL回線経由・WiMAX回線経由を任意で切り換えたい
- ノートPCは引き続き作業用デスクトップPCからRDP接続で利用したい。この接続は経路を切り換えても切断されないようにする
- ノートPCの物理デバイスON/OFF、WiMAXルーターの抜き差しなど、実機に触らずに設定変更したい
実現方針
こういった複数回線でインターネット接続する構成をマルチホーム環境と呼び、一般的には冗長化や同時に複数回線を最大限に利用することによる回線効率の最大化などの話が出てきたりする分野なのですが、今回やりたいのは冗長性の確保ではなく単純に2回線を排他で切り換えて使えれば良いということで、単純にルーティングテーブルを更新することにします。
作業手順
まずはノートPCにWiMAXルーターをUSB接続した所から設定を始めていきます。
現行設定の確認
まずはノートPC環境のコマンドプロンプトから route print
してみます。
大事な部分は赤枠で囲った部分になります。
以降の設定に進む前に確認しておきましょう。
- ネットワーク宛先
0.0.0.0/0
で192.168.0.1(VDSL側)
向けのルーティングが設定されている- VDSL回線経由でインターネット接続するのに必要な設定です
- ネットワーク宛先
0.0.0.0/0
で192.168.100.1(WiMAX側)
向けのルーティングが設定されている- WiMAXルーター経由でインターネット接続するのに必要な設定です
- ネットワーク宛先
192.168.0.0/24
のルーティングテーブルが設定されている- この後の経路変更を行ってもデスクトップRDP接続が切断されないために必要な設定です。
- この設定がない場合、自宅内LANが広告するDHCP設定に問題があるかもしれません。必要ならノートPC側で手動設定することも可能ですが、その場合DHCPによってさらに上書きされてしまう可能性もあります
また、この中で表示されている「メトリック」の値が重要です。後で出てくるので覚えておきましょう。
現在接続経路の確認
現在どの経路から接続しているのか確認してみましょう。接続元ホストを見て色々と情報を表示してくれる確認君+(Plus)にノートPC環境からアクセスして見てみます。
AU回線=WiMAX回線(UQ mobile)なので、今ノートPCのインターネット接続はWiMAXルーター経由になっていることが分かります。
これは、前節で挙げたルーティングテーブルにおいてデフォルトルート(0.0.0.0/0
)を見たとき、最もメトリック値が小さいのがWiMAXルーター経路(メトリック値25)だったためです。
整理すると、Windows的には以下のようなロジックで経路を選択しています。
- 要求された接続先IPに接続できるルーティングをルーティングテーブルから検索
- インターネット向け接続(グローバルIP)向けの個別設定はないため、デフォルトルート(
0.0.0.0/0
)が選択される - デフォルトルート向け経路として、VDSL回線経由(メトリック値40)、WiMAXルーター(メトリック値25)の二つが検出される
- インターネット向け接続(グローバルIP)向けの個別設定はないため、デフォルトルート(
- ルーティング先が複数ヒットした場合、よりメトリック値が低い経路を優先する
- WiMAXルーターの経路の方がメトリック値が小さいので、そちらを選択
接続経路の切り換え
では、経路を切り換えてみましょう。
インターネット向けの経路(デフォルトルート)のメトリック値を変更すれば良いのですが、メトリック値はインターフェース単位(Windows用語だとネットワークアダプタ)で設定するようになっています。
今回はWiMAXルーター経路のメトリック値を変更して経路を切り換えてみます。
「ネットワークとインターネット」設定の「状態」「ネットワークの詳細設定」から「アダプターのオプションを変更する」を開きます。
出てきたインターフェース一覧からWiMAXルーター(今回使っているのはHUAWEI Speed Wi-Fi NEXT W06)を開きます。
「プロパティ」から「インターネット プロトコル バージョン4(TCP/IPv4)」をダブルクリックで開き・・・
「全般」タブから「詳細設定」を開いた先にある「IP設定」タブで「自動メトリック」のチェックを外し、インターフェイスメトリックの値を手入力します。
ここで、VDSL回線側のインターフェイスのメトリック値が40だったので、39以下にすればWiMAX回線が優先、41以上にすればVDSL回線側が優先されるはずです。
ここではとりあえず大きい値として1000
を入力して保存します。
保存できたら再度確認君+を見てみましょう。
無事に経路が切り替わったことが確認できると思います。
route print
でも設定したメトリック値になっていることが確認できました(1000で設定したのに1001になってる理由はよくわかりませんが、何かWindows OS側での忖度があるのでしょう)。
接続経路を元に戻す
WiMAX経路に戻したい場合は同じようにWiMAXルーター側のネットワークアダプタのインターフェイスメトリック値を今度は1
のようなVDSL回線側より小さい値にしてやります。
設定にやや時間がかかることもありますが、問題なく元に戻せるはずです。
というわけで、無事RDP接続が切断されない状態でノートPCに触らず経路切り換えを実現することができました!
社内レビューに回していたところ、u-ichiからIPv4 ルートの自動メトリック機能の説明というドキュメントを教えてもらいました。
何も設定しないとWiFi側のVDSL回線よりもUSB接続のWiMAX回線に繋がったのは、WiMAXルーターデバイスが有線LAN相当で計算されたからのようですね。
インターネットへの接続速度を勝手に計測して判断してくれるようなものではないので、もし2回線繋いでる人は遅い方のインターフェースを使ってるかもしれませんので、このあたり知っておくと良いかもしれません。
うまくできないよーという人向けの確認どころ集
WiMAXルーターの機種や自宅内ネットワークの設定にも依存するため個別の完璧なトラブルシューティングは難しいのですが、僕が設定するにあたって注意した点を挙げておきます。
ノートPCのIPv6はOFFにしておく
ノートPCのWiFi、WiMAXルーターのインターフェース設定両方ともIPv6を無効化しておきます。
これは一般的にIPv6とIPv4接続両方の経路がある場合には、メトリック値に関わらずIPv6を優先する可能性が高いためで、その他にもデフォルトルート設定のあるインターフェースがある場合、接続がうまくいかない原因になっている可能性があると思います。
OSやアプリケーションの再起動をする
原因は不明なのですが、ごくまれに設定変更しても反映されない状況に陥るケースがあり、その際はWindowsの再起動を行うことで解決しました。
また、メトリック値の設定変更後、アプリケーション側のプロセスを再起動しないと通信が更新した経路に向かないこともありました。うまく行かない場合はまずはアプリケーション再起動、それでも駄目ならWindows再起動を試してみると良いかもしれません。
まとめ
椅子から一歩も動きたくないでござる!!!という引きこもり根性を実現するための「楽をするための努力」をまとめました。
そこまでしょっちゅう欲しいような設定作業でもないですが、VPN回線などを利用しているケースでも同様の設定が使えるかと思いますので、興味のある人はやってみてもらえればと思います。
なお、この段階では確認君+の画面を何度リロードしても常にWiMAXルーター経由での接続になります。
2回線あるんだから両方の回線を自動的に最大限使ってくれるんじゃないの?と思う人もいるかも知れませんが、そうはなりません。
TCP/IPによるソケット通信は接続元・接続先のIP/ポートに対してセッションを開くため、複数回線を同時に最大限使うような通信がしたければ、そういった通信方法に対応したソフトウェアが必要になります。
ルーターレベルであればマルチセッション対応の製品などを使えばルーターから先の通信を複数回線同時利用するようなことはできますが、クライアントレベルでのマルチセッションは先に挙げたTCP/IPソケット問題などが絡むため、地味に難しいです(多分ソフトウェアルーターをローカルに作ってそこで負荷分散すればできそうですが、面倒そう)。