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

スポンサーリンク

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経路から除外しています。

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

動作確認

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

コメント

タイトルとURLをコピーしました