WindowsでVPN接続時に、VPNを経由させたくない除外ルートを指定する方法です。スクリプトでVPNを作成し、その際に指定する必要があります。
以下では設定方法について説明します。
なお、逆に特定のあて先だけVPN経由にしたい場合は、次の記事を参照してください。
特定の宛先だけ VPN経由で通信させる | パソコン鳥のブログ
特定の宛先だけ VPN経由で通信させる(PowerShellで設定) | パソコン鳥のブログ
スクリプトで除外ルートを指定してVPN接続を作成
以降のサンプル setvpn.ps1 を修正して作成します。
(Optimizing Office 365 traffic for remote workers with the native Windows 10 or Windows 11 VPN client – Windows security | Microsoft Docs のスクリプトで実行に際しエラーが出た箇所を削除したものです)
・<Servers>XXXXXX</Servers> の XXXXXX を、VPNサーバーにします
・次の内容で<Route></Route>の箇所を修正します
<Route></Route>には、VPN経由しない除外ルートを指定します。<Adress>、<PrefixSize>でVPN経由から除外したいサブネットのIPアドレス・プレフィックスサイズを指定します。また、<ExclusionRoute>true</ExclusionRoute>も記述しておきます。
例えば、10.8.0.0/16 を除外したい場合は、<Adress><10.8.0.0/Adress><PrefixSize>16</PrefixSize><ExclusionRoute>true</ExclusionRoute> と記述します。
複数ある場合は、下記スクリプトのように<Route></Route>を列挙して記述します。下記サンプルでは、Google Public DNSの 8.8.8.8と8.8.4.4 をVPN経路から除外しています。
2023.1.5
$ProfileXML = の行を修正しました
$ProfileName = 'SAMPLE VPN'
$ProfileNameEscaped = $ProfileName -replace ' ', '%20'
<#-- Define VPN ProfileXML --#>
$ProfileXML = '<VPNProfile>
<RememberCredentials>true</RememberCredentials>
<AlwaysOn>false</AlwaysOn>
<NativeProfile>
<Servers>XXXXXX</Servers>
<RoutingPolicyType>ForceTunnel</RoutingPolicyType>
<NativeProtocolType>L2TP</NativeProtocolType>
<L2tpPsk></L2tpPsk>
</NativeProfile>
<Route>
<Address>8.8.8.8</Address>
<PrefixSize>32</PrefixSize>
<ExclusionRoute>true</ExclusionRoute>
</Route>
<Route>
<Address>8.8.4.4</Address>
<PrefixSize>32</PrefixSize>
<ExclusionRoute>true</ExclusionRoute>
</Route>
</VPNProfile>'
<#-- Convert ProfileXML to Escaped Format --#>
$ProfileXML = $ProfileXML -replace '<', '<'
$ProfileXML = $ProfileXML -replace '>', '>'
$ProfileXML = $ProfileXML -replace '"', '"'
<#-- Define WMI-to-CSP Bridge Properties --#>
$nodeCSPURI = './Vendor/MSFT/VPNv2'
$namespaceName = "root\cimv2\mdm\dmmap"
$className = "MDM_VPNv2_01"
<#-- Define WMI Session --#>
$session = New-CimSession
<#-- Create VPN Profile --#>
try
{
$newInstance = New-Object Microsoft.Management.Infrastructure.CimInstance $className, $namespaceName
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ParentID", "$nodeCSPURI", 'String', 'Key')
$newInstance.CimInstanceProperties.Add($property)
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("InstanceID", "$ProfileNameEscaped", 'String', 'Key')
$newInstance.CimInstanceProperties.Add($property)
$property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ProfileXML", "$ProfileXML", 'String', 'Property')
$newInstance.CimInstanceProperties.Add($property)
$session.CreateInstance($namespaceName, $newInstance, $options)
$Message = "Created $ProfileName profile."
Write-Host "$Message"
}
catch [Exception]
{
$Message = "Unable to create $ProfileName profile: $_"
Write-Host "$Message"
exit
}
$Message = "Script Complete"
Write-Host "$Message"
setvpn.ps1 を作成したらコマンドプロンプトを管理者権限で開き、次のコマンドを実行します。
VPN名「SAMPLE VPN」が作成されます。
powershell -NoProfile -ExecutionPolicy unrestricted -File setvpn.ps1
なお、この時、「Unable to create test VPN profile: オブジェクトが既に存在するため、操作を実行できません。」と出る場合は、先頭の $ProfileName = の行で指定したVPN名が既に存在しています。(今回の例では「SMAPLE VPN」です)
その場合は、該当するVPN接続を削除します。削除は次の手順で行えます。
[スタート] ボタンを選択し、歯車アイコン([設定]) 、[ネットワークとインターネット] 、[VPN] を選択します。
VPN一覧が出るので、削除したいものを選択して[削除]を押してください。
VPN接続設定
先の手順でVPN接続「SAMPLE VPN」が作成されましたが、サーバ名以外の接続に必要な設定がされていないので、各種設定を行う必要があります。
[スタート] ボタンを選択し、歯車アイコン([設定]) 、[ネットワークとインターネット] 、[VPN] を選択します。
VPN一覧が出るので、「SAMPLE VPN」を選択して、[詳細オプション] を押します。
「接続プロパティ」の画面になるので、続けて[編集] を押すと、次の画面になります。
接続先にあわせて、設定をおこなってください。
また接続先によっては、加えてネットワーク接続のプロパティでの設定も必要かもしれません。
[スタート] ボタンを選択し、歯車アイコン([設定]) 、[ネットワークとインターネット] 、[イーサネット] を選択し、”アダプターのオプションを変更する”を押します。
表示されたネットワーク接続から、設定したいVPN接続を選択して右クリックし、[プロパティ] を選択します。
セキュリティタブを選択します。必要に応じて設定してください。
動作確認
VPN接続後にコマンドプロンプトで、tracertコマンドを実行して確認します。
ここでは例として、除外ルート(先のsetvpn.ps1で指定)を 8.8.8.8 、VPN経由する宛先(除外しない宛先)をwww.yahoo.co.jp とします。
まず、VPN接続せずに、(VPN接続時に除外したい宛先の)8.8.8.8 を 指定して、 tracert コマンドを実行します。
最初に通るルータ(いわゆるデフォルトゲートウェイですね)が表示されます。この例で192.168.1.1です。
C:\Windows\System32>tracert -h 1 8.8.8.8
dns.google [8.8.8.8] へのルートをトレースしています
経由するホップ数は最大 1 です:
1 <1 ms <1 ms <1 ms ntt.setup [192.168.1.1]
トレースを完了しました。
次にVPN接続して、VPN経由する宛先(除外しない宛先)www.yahoo.co.jp を指定して、 tracert コマンドを実行します。
VPN接続では、最初に通るルータがさきほどと変わりました。この例では 192.168.11.99です。
C:\Windows\System32>tracert -h 1 www.yahoo.co.jp
edge12.g.yimg.jp [182.22.16.251] へのルートをトレースしています
経由するホップ数は最大 1 です:
1 16 ms 15 ms 16 ms 192.168.11.99
トレースを完了しました。
続けて、除外する宛先 8.8.8.8 を 指定して、 tracert コマンドを実行します。
VPN接続にも関わらず、最初に通るルータが通常時と同じ(この例で192.168.1.1)です。
C:\Windows\System32>tracert -h 1 8.8.8.8
dns.google [8.8.8.8] へのルートをトレースしています
経由するホップ数は最大 1 です:
1 <1 ms <1 ms <1 ms ntt.setup [192.168.1.1]
トレースを完了しました。
これで、VPN接続時でも、除外指定したルートはVPN経由せずに通信できることが確認できました。
VPNサーバを変更したい場合・除外ルートを変更したい場合
VPNサーバを変更したい場合や、除外したい宛先を変更したい場合は、VPN接続を作り直す必要があります。
一度VPN接続を削除した後、本記事の内容に沿って再度作成してください。
なお、VPN接続の削除は、次の手順で行います。
[スタート] ボタンを選択し、歯車アイコン([設定]) 、[ネットワークとインターネット] 、[VPN] を選択します。
VPN一覧が出るので、削除したいものを選択して[削除]を押してください。
参考
Exclude Routes Windows 10 VPN – Microsoft Community
Optimizing Office 365 traffic for remote workers with the native Windows 10 or Windows 11 VPN client – Windows security | Microsoft Docs
コメント
はじめまして。元サイトも参考にしながら進めているのですが、設定した”MDM_VPNv2_01”にはExclusion routeはちゃんと記述されているのですが、どうしてもVPN経由になってしまっており、成功例も少ないため、藁をもつかむ思いでこちらにコメントさせて頂いています。
デバイスの前提条件か何かあるのでしょうか・・・・。
まず申し訳ございません、setvpn.ps1 に誤りがあったため、下記の行を修正しました。
(修正前)
$ProfileXML = $ProfileXML -replace ‘<', '<' $ProfileXML = $ProfileXML -replace '>‘, ‘>’
$ProfileXML = $ProfileXML -replace ‘”‘, ‘”‘
(修正後)
$ProfileXML = $ProfileXML -replace ‘<', '<' $ProfileXML = $ProfileXML -replace '>‘, ‘>’
$ProfileXML = $ProfileXML -replace ‘”‘, ‘"’
そのうえで、本記事と同じ Exclusion route の設定で、「動作確認」の手順での確認で 8.8.8.8 は除外されますでしょうか?
こちらでは Windows10 Home ですが、期待通りに動作しています。
早速どうもありがとうございます ^ ^
$ProfileXML に関しては登録ができなかったので、ここだけ元サイトを参照して(修正後と同じ形で)回しました。
setvpn.ps1適用後に、パソコン鳥さんの様にVPN一覧に表示されなかったのですが、Powershell(get-vpnconnection)では登録されていることが確認できましたので、手動で設定したりはしました。
「動作確認」の手順で8.8.8.8の確認をしたのですが、VPN経由のままなのです(涙)
当方はWindows10 Pro(AD登録あり)です。GPOの設定は少なめ、影響はないと思われるのですが・・・。
Windows10 Pro(AD登録なし,ローカルユーザー)で試しましたが、記事の通り、VPN一覧にも表示されました。動作も記事の通り 8.8.8.8 は除外されました。
う~ん、うまくいかない原因はなんでしょう・・
ルーティングを確認したほうがいいかもです。
VPN接続状態で、コマンドプロンプトで route print を実行してみてください。
一部抜粋ですが下のような感じで表示されます。
(1) 8.8.8.8 、8.8.4.4 の行がありますでしょうか?
(2) 8.8.8.8 、8.8.4.4 の行で、”ゲートウェイ”列 は、ipconfig 実行時に表示される デフォルト ゲートウェイ と同じでしょうか。
IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先 ネットマスク ゲートウェイ インターフェイス メトリック
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.12 4506
0.0.0.0 0.0.0.0 リンク上 192.168.11.128 26
8.8.4.4 255.255.255.255 192.168.1.1 192.168.1.12 4251
8.8.8.8 255.255.255.255 192.168.1.1 192.168.1.12 4251
無事通りました!
通らなかった原因は「標準ユーザー」だったことでした。
「標準ユーザー」でPowershell>右クリック>管理者権限で実行する形では効かず、ユーザーを一旦「管理者」に変える事で、パソコン鳥さんと同じ動線になりました(VPNも一覧に表示されました)。
当方の環境ではAD登録の有無関わらず「管理者」でないと通らなかったのはナゾなのですが・・・、コメントに反応頂けなかったら、見つけられなかったと思います。
通りすがりの質問にご丁寧にお答えいただき、本当にありがとうございました!
なるほど、こちらのローカルユーザーも、PC初期設定時に作成したユーザ(=管理者権限あり)なので、ユーザーアカウントの権限として管理者が必要のようですね。
ご指摘ありがとうございました。