はじめに
Windowsの標準VPNクライアントでPPTPを使っているとルーティングの問題が悩ましいです。
デフォルトゲートにすると全通信がVPNを通ってしまい遅くなりますし、客先VPNだったりすると「何やってんの」と怒られます。。
デフォルトゲートのチェックは外しつつ、必要なルーティングを接続時に得る方法はいくつかあります。
Connection Manager で接続情報を作成
MS謹製のツール Connection Manager で接続情報を事前に作成します。
http://www.experts-exchange.com/articles/11931/Automatic-VPN-routes-configuration-for-PPTP-in-Windows-7-8.html
このツールでプロファイル作成すると接続時に自動実行するプログラムを指定できます。
バッチファイルを指定することでルーティングコマンドが叩けます。
...叩けますが、作成したプロファイルの配布が手間だったり、x64バージョンがWindows7向けに見つからなかったりと意外に制約が多いです。
PowerShellで接続管理
PowerShellスクリプトを登録することで接続時にフックできます。
https://technet.microsoft.com/ja-jp/library/JJ613766.aspx
できますがサンプルを見てわかるように相応の手間がかかります。
VPN (PPTP) ごときに、と言うのも何ですがここまで労力をかけてプログラム組むのは見合いません。
・・・と、どちらの方法も帯に短し襷に長し。
そこでオススメしたいのがタスクスケジューラを使った下記の方法です。
タスクスケジューラにイベントトリガーを設定
-
タスクスケジューラで新規タスクを作成
全般タブで「最上位の特権で実行」にチェックを入れておきます。
-
トリガー
トリガーから、
イベント時 > カスタム > イベントフィルター > XML
と進んで手動で編集する
にチェックを入れ、以下の内容を書き込みます。<QueryList> <Query Id="0" Path="Application"> <Select Path="Application">*[System[Provider[@Name='RasClient'] and (Level=4 or Level=0) and (EventID=20225)]] and *[EventData[Data='ここにVPN接続名を入力']]</Select> </Query> </QueryList>
次に
ここにVPN接続名を入力
の文字列を、検知したいVPN接続名と置き換えます。
これで指定のVPN接続が確立した際にフックをかけることが出来ます。※ EventID=20226 と指定すれば切断も検知可能です。
-
操作タブ
操作タブから
新規 > プログラムの開始
で実行したいプログラムを指定します。
route add コマンドを列挙したバッチファイルでもいいのですが、おすすめは netsh コマンドです。netsh.exe -f "実行したいnetshスクリプトファイルのパス"
で柔軟に指定できます。
netsh スクリプトファイルの中身はこのようになります。interface ipv4 add route prefix=1.2.3.0/24 interface="ここにVPN接続名を入力" store=active (以下、必要なだけ繰り返し) exit
※ interfaceはID番号でも指定可能ですが、VPNが複数ある場合に一意とならないのでお勧めしません。
-
実行
対象のVPN接続を実行し、接続後に
route print
して指定のルーティングが追加されていることを確認します。VPN接続時に一瞬コマンドプロンプトが表示されますが気にしないでください。