WindowsでVPN接続すると、デフォルトではすべての宛先がVPN経由になる。
それだと相手方の帯域を食うし、使い方次第ではセキュリティ的にもよろしくないので、業務上必要なトラフィックのみVPN経由となるよう、ルーティングを見直すことにした。
手順
すべての宛先でVPNを使わないようにする
いったん、外向きの通信すべて、VPNに流さないようにする。
これはWindowsのGUI画面から設定できる。
ネットワーク接続を開く
[ファイル名を指定して実行] からncpa.cpl
と入力する。
該当するVPN接続を選び、右クリックからプロパティを開く。
TCP/IPのプロパティを開く
詳細設定を開く
リモートネットワークのGWを使わないようにする
デフォルトの設定では、VPN接続中の外向き通信はすべてリモートネットワークのゲートウェイを経由するようになっているので、これを無効にする。
- [リモートネットワークでデフォルトゲートウェイを使う] のチェックを外す
- [クラスベースのルートの追加を無効にする] のチェックを入れる
[クラスベースのルートの追加を無効にする] にチェックを入れない場合、VPNと同じネットワークアドレス宛の通信は、すべてVPNに流れることになる。
ローカルネットワークとリモートネットワークで、ネットワークアドレス(例:192.168.1.0/24
)が同じ場合、これでは都合が悪いのでチェックを入れること。
VPN経由の宛先を設定
VPN経由で通信させたい宛先を個別に追加していく。
コマンドベースで設定することになるが、これには2通りの方法があるので両方紹介しよう。
なお、ここでは、ローカルのネットワークアドレスが192.168.11.0/24
、リモートのネットワークアドレスが192.168.1.0/24
にあるものとして説明する。
PowerShellから追加する方法
Windows8以降のOSではAdd-VpnConnectionRoute
コマンドレットが使える。
VPN接続時にルートを自動で追加し、VPN切断時にルートを自動で削除してくれるので、一度だけ実行すれば良い。
【例1】宛先ネットワークを追加
社内に沢山あるサーバにアクセスする必要があり、それがローカルのネットワークアドレスと被らなければ、この書き方が簡単で良い。
Add-VpnConnectionRoute "VPN接続名" -DestinationPrefix 10.0.0.0/8
Add-VpnConnectionRoute "VPN接続名" -DestinationPrefix 192.168.1.0/24
【例2】宛先ホストごとに追加
ローカルのネットワークアドレスと被る場合や、接続元IPアドレスを制限しているインターネットのサーバにアクセスする目的でVPNを経由している場合は、ホストごとに追加する。
Add-VpnConnectionRoute "VPN接続名" -DestinationPrefix 13.114.178.6/32
※例示の 13.114.178.6 は qiita.com のアドレスである。
PowerShellではCIDR表記で書ける。
VPN接続名は、GUIで確認する以外に、Get-VpnConnection
コマンドレットでも確認できる。
設定されているルート情報は(Get-VpnConnection "VPN接続名").Routes
で見れる。
削除はRemove-VpnConnectionRoute
コマンドレットで行う。(PowerShellのコマンドレットではAddに対してはRemoveという暗黙ルールがあるので覚えておこう)
コマンドプロンプトから追加する方法
サポートが終了しているWindows7以前のOSでは、昔からお馴染みのroute add
コマンドを使う。
-p
オプションが恒久指定になるので一度だけ実行すれば良いが、PowerShellの書き方と比べると少し面倒くさい。
先述のPowerShellと同じことをroute add
で記述すると、次のようになる。
route -p add 10.0.0.0 mask 255.0.0.0 (VPNサーバのアドレス) metric 1 if (インターフェース番号)
route -p add 192.168.1.0 mask 255.255.255.0 (VPNサーバのアドレス) metric 1 if (インターフェース番号)
route -p add 13.114.178.6 mask 255.255.255.255 (VPNサーバのアドレス) metric 1 if (インターフェース番号)
VPN仮想NICのインターフェース番号はroute print
で確認すること。
削除はroute delete
で行う。