VPN接続で除外ルートを指定する

ALL
スポンサーリンク

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 '<', '&lt;'
$ProfileXML = $ProfileXML -replace '>', '&gt;'
$ProfileXML = $ProfileXML -replace '"', '&quot;'

<#-- 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接続が作成されます。

動作確認

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

コメント

  1. リス より:

    はじめまして。元サイトも参考にしながら進めているのですが、設定した”MDM_VPNv2_01”にはExclusion routeはちゃんと記述されているのですが、どうしてもVPN経由になってしまっており、成功例も少ないため、藁をもつかむ思いでこちらにコメントさせて頂いています。

    デバイスの前提条件か何かあるのでしょうか・・・・。

  2. パソコン鳥 より:

    まず申し訳ございません、setvpn.ps1 に誤りがあったため、下記の行を修正しました。

    (修正前)
    $ProfileXML = $ProfileXML -replace ‘<', '<' $ProfileXML = $ProfileXML -replace '>‘, ‘>’
    $ProfileXML = $ProfileXML -replace ‘”‘, ‘”‘
    (修正後)
    $ProfileXML = $ProfileXML -replace ‘<', '&lt;' $ProfileXML = $ProfileXML -replace '>‘, ‘&gt;’
    $ProfileXML = $ProfileXML -replace ‘”‘, ‘&quot;’

    そのうえで、本記事と同じ Exclusion route の設定で、「動作確認」の手順での確認で 8.8.8.8 は除外されますでしょうか?
    こちらでは Windows10 Home ですが、期待通りに動作しています。

  3. 匿名 より:

    早速どうもありがとうございます ^ ^

    $ProfileXML に関しては登録ができなかったので、ここだけ元サイトを参照して(修正後と同じ形で)回しました。

    setvpn.ps1適用後に、パソコン鳥さんの様にVPN一覧に表示されなかったのですが、Powershell(get-vpnconnection)では登録されていることが確認できましたので、手動で設定したりはしました。

    「動作確認」の手順で8.8.8.8の確認をしたのですが、VPN経由のままなのです(涙)

    当方はWindows10 Pro(AD登録あり)です。GPOの設定は少なめ、影響はないと思われるのですが・・・。

  4. パソコン鳥 より:

    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

  5. 匿名 より:

    無事通りました!
    通らなかった原因は「標準ユーザー」だったことでした。
    「標準ユーザー」でPowershell>右クリック>管理者権限で実行する形では効かず、ユーザーを一旦「管理者」に変える事で、パソコン鳥さんと同じ動線になりました(VPNも一覧に表示されました)。

    当方の環境ではAD登録の有無関わらず「管理者」でないと通らなかったのはナゾなのですが・・・、コメントに反応頂けなかったら、見つけられなかったと思います。

    通りすがりの質問にご丁寧にお答えいただき、本当にありがとうございました!

  6. パソコン鳥 より:

    なるほど、こちらのローカルユーザーも、PC初期設定時に作成したユーザ(=管理者権限あり)なので、ユーザーアカウントの権限として管理者が必要のようですね。
    ご指摘ありがとうございました。