Windows10でVPN接続時に自動でrouting設定する方法

Windows10標準のVPN接続で、必要なときのみVPN接続するという使い方をしているのですが、VPN先が特定の開発用サーバにしか接続できない、回線が細いなどの理由で、必要なパケットのみをVPN側に回し、それ以外のパケットは通常の経路で流したいという状況がちょくちょく発生するようになりました。
当初はVPN接続するたびにコマンドプロンプトを起動して、手動でrouteコマンドを実行していたのですが、手間だったので自動化について調べてみました。結果的には、意外と簡単なことだったのですが、日本語情報が見つからなかったので紹介しておきます。

準備と前提知識

まずは、VPN接続を作成しておいてください。この状態でVPN接続をして、Windowsのコマンドプロンプトでipconfigを実行すると、VPNのアダプタが追加されて、俗に言う「ネットワークカード2枚刺し」状態になっていることが分かります。

C:\>ipconfig

Ethernet adapter イーサネット:
   IPv4 Address. . . . . . . . . . . : 192.168.x.10
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 

PPP adapter VPN:
   IPv4 Address. . . . . . . . . . . : 172.16.x.x
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . :

このとき、コマンドプロンプトでroute PRINT -4として、IPv4のルーティングテーブルを表示すると、ほとんどの通信先宛てのパケットが、VPN側のインタフェース(IPアドレス)から出て行くように自動設定されていることが分かります。
まずは、この設定を変更して、VPN接続時に勝手にゲートウェイを設定しないようにする必要があります。この方法は、「Windows vpn デフォルトゲートウェイ」で検索すればいくらでも出て来るので省略します。
この変更をした後に再度VPN接続すると、今度はすべてのパケットが通常のLAN側に流れてしまい、手動でrouteコマンドを起動してルーティングテーブルを変更しないと、肝心のVPN先に接続できないという状態になります。
これが手間なので、VPN接続時に自動的に、必要なパケットだけVPN側に流れるように設定することが、この記事の目的です。

設定方法

Windows8.1以降のPowerShellには、Add-VpnConnectionRouteというコマンドレットがあります。これを使うだけです。

まず、PowerShellを起動して、Get-VpnConnectionで接続の名前を確認します。下記だと、Name欄に出ている"ABC VPN"です。

PS> Get-VpnConnection

Name                  : ABC VPN
ServerAddress         : vpn.example.com
(省略)

次に、確認した接続名に対して、Add-VpnConnectionRouteでルーティングを追加します。下記の例は、172.16.0.0/16へのパケットをVPN側に流したい場合の入力方法です。

PS> Add-VpnConnectionRoute "ABC VPN" -DestinationPrefix "172.16.0.0/16" -PassThru

一度この設定を行っておけば、あとはABC VPNに接続するたびに、自動的にルートが追加されるようになります。
参考にした英語記事はこちら。
http://serverfault.com/a/752698

なお、設定したルートの内容は、下記のコマンドレットで見ることができます。

PS> (Get-VpnConnection "ABC VPN").Routes