WindowsのVPNでルーティング

VPN接続した時、デフォルトルートをVPN経由にするケースが結構ある。

ただ、この場合、VPN経由にしなくてもいいIPアドレスでもVPN経由になるので、結構帯域がキツくなる場合があります。

なので、デフォルトルートはVPNにせず、必要な時だけVPN経由にする方が楽な時もある。

macOSの場合、VPNの接続設定で「すべてのトラフィックをVPN接続経由で送信」のチェックボックスをオフにした後、事前に作っておいた routeコマンドでゲートウェイをVPNに指定するスクリプトを実行してVPN経由である必要があるIPアドレス・ネットワークだけルーティングを変更していた。

同じことをWindowsでやってみたので、メモとして記録。

Windowsでの手順

  1. VPN接続時のデフォルトゲートウェイをVPNにしない設定に変更する
  2. VPNの接続名を確認する
  3. VPNの接続時のルーティング変更を登録する
  4. 登録したルーティング変更を削除する

1)  VPN接続時のデフォルトゲートウェイをVPNにしない設定に変更する

コントロールパネル > ネットワークとインターネット > ネットワークと共有センター

左側の「アダプターの設定変更」

VPNのアイコン > 右クリックでプロパティ > ネットワーク タブ

「インターネットプロトコルバージョン4」を選択して「プロパティ」ボタン

「詳細設定」ボタン

「リモートネットワークでデフォルトゲイトウェイを使う」のチェックボタンをはずす

「OK」ボタンを押す

2) VPNの接続名を確認する

PowerShellで以下を実行

PS C:\Users\hohiro> Get-VpnConnection

Get-VpnConnection

3) VPNの接続時のルーティング変更を登録する

以下をPowerShellで実行

$vpn = “xxxxx” ## 2) で確認した設定したいVPNのNameを指定

$addrs = @(

 “192.168.1.1/32”, # ホストとか

 “192.168.2.0/21” # ネットワークとか

)

foreach($addr in $addrs) {

 Add-VpnConnectionRoute $vpn -DestinationPrefix $addr

}

Add-VpnConnectionRoute

4) 登録したルーティング変更を削除する

以下をPowerShellで実行

$vpn = “xxxxx” ## 2) で確認した設定したいVPNのNameを指定

foreach( $route in (Get-VpnConnection $vpn).Routes) {

 Remove-VpnConnectionRoute $vpn -DestinationPrefix $route.DestinationPrefix

}

Remove-VpnConnectionRoute

感想

route PRINT で確認してみたが、VPN接続をすると自動的にルーティングを追加。VPN接続を切ると自動的にルーティングを削除してくれる。

自分で route を追加・削除するスクリプトを実行する macOSより便利。VPN接続、切断時にフックできるといいのになぁとは思ってたんだけど、 (Add|Remove)-VpnConnectionRoute はまさしくそういう設定のようだ。

PowerShellはオブジェクト的に扱えるシェルというイメージだったけど、確かに便利は便利だなぁ。

対応してるものが多ければ。

一応、C#とかで拡張もできるっぽい。cmdletっていうのかな。

PowerShell Cmdlet を人道的に使いたいから頑張ってみるお話

Visual Studioかぁ… いまProfessionalっていくらするんだろうと思ったら、64,131円らしい。昔より安いとは思うけど、まだまだ結構おたかいのネ。

と思ったが、自分の立ち位置だとCommunityエディションでもいいのかな。