📶

IKEv2 IPsec VPNにSIM認証を使ってみる (5)【Windows 11 PC】

に公開

概要

WindowsのネイティブVPNクライアントは、一般的なユースケースに対してはUIもこなれていて手軽なのですが、現状EAP-AKA利用は一般的ではありません。しかし、導入方法があるだけ全くもってマシな方で、しかもMicrosoft Intuneを使えるなら設定ファイルの作成も適用も自動化できたりします。
まあ今回は個人ユーザーとして頑張るコンセプトなので、愚直に VPN設定プロファイルをPowershell経由で適用する という方法を使います。

事前準備

前記事(1)の「VPNクライアント」の項目にも書きましたが、WindowsがEAP-AKAを使うには、MBIM(Mobile Broadband Interface Model)モードで認識されている通信モジュールが必要です。一般的には、モバイル通信対応PCに搭載されている通信モジュールが、このモードで接続されています。
なので、通信モジュール内蔵Windows 11 PCであれば、モバイル通信を有効化するだけでEAP-AKAを使えるようになります。

しかし、一般的な(通信モジュールを搭載していない)Windows 11 PCでは、外付けのMBIM対応デバイスが必要になります。大抵はモバイル通信用USBドングルを使うことになりますが、日本で市販されているメジャーどころの製品はRNDISモードがデフォルトであり、接続モードを変更する手段も基本的には提供されません。
ただ、IoT機器にモバイル通信を提供するためのUSBドングル製品であれば、通信モジュール固有のATコマンドによるUSB接続モード変更方法が用意されていることが多く、Windows用ドライバーが準備されていれば、利用できる可能性が高いです。

MBIMモード変更可能なことが確認できていて、2026年4月現在でも日本で調達可能な製品となると、Soracom Onyxぐらいですが、残念ながら2023年4月以降、Windows利用はサポート対象外となってしまっています。
とはいえWindows用ドライバーは提供中で、モバイル通信も可能です。
https://soracom.jp/store/7326/
なお、Soracom公式サイトにはUSB接続モード変更のATコマンドに関する記載はありません。採用している通信モジュール「Quectel EG25-G」の、固有ATコマンド仕様を探す必要があります。本来はQuectel公式サイトから固有ATコマンドの仕様書をダウンロードするのが正道ですが、現在はダウンロードするために法人ユーザーとしてのアカウント登録を求められるので、個人では情報取得は難しいと思います。
ただ、Web上には色々と情報は転がっているので、以下のような記事を参考にしてみるのもいいかもしれません。
https://wiki.seeedstudio.com/ja/raspberry_pi_4g_lte_hat_mbim/
長くなってしまいましたが、WindowsでEAP-AKAを使うには一定のハードルがあることを(個人的には)書いておきたかったのでした。

証明書ストアへのCA証明書登録

前記事(2)の手順7で、プライベートCA公開鍵証明書をDER形式に変更しましたが、このファイル(caCert.cer)をWindowsに登録します。この手順はGUIから実行可能です。

  1. エクスプローラーを開き、プライベートCA公開鍵証明書(この記事内だとcaCert.cer)の上で右クリックして、コンテクストメニューを表示します。
  2. コンテクストメニューに「証明書のインストール」を選択すると、「証明書のインポート ウィザード」が起動します。
  3. 証明書のインポート ウィザードで保存場所を選択します。今回はユーザー認証に関するデータなので、私の場合は「現在のユーザー」を選択しました。
  4. 続いて証明書ストアの指定を求められるので、「証明書をすべて次のストアに配置する」を選択し、参照先を「信頼されたルート証明機関」に指定します。
  5. そして「次へ」ボタンを押すと、特に問題がなければ証明書インポートが完了します。

なお、証明書を削除したい場合は、証明書マネージャー(certmgr.msc)を起動して、信頼されたルート証明機関の「証明書」から、インポートした証明書を削除してください。

VPN profile用XMLファイルの作成

続いて、以下の内容を VPNProfile.xml のファイル名で保存してください。管理者権限を要求されないなら、保存先はどこでも構いません。
ちなみにファイル名は何でもよいのですが、この後の手順でファイル名を指定する箇所があるので、ファイル名を変える人は意識しておいてください。

<VPNProfile>
  <ProfileName>IKEv2-AKA</ProfileName>

  <NativeProfile>
    <Servers>simauth.vpn.jp</Servers>
    <NativeProtocolType>IKEv2</NativeProtocolType>

    <Authentication>
      <UserMethod>Eap</UserMethod>
      <Eap>
        <Configuration>
          <EapHostConfig xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
            <EapMethod>
              <Type xmlns="http://www.microsoft.com/provisioning/EapCommon">23</Type>
              <VendorId xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorId>
              <VendorType xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorType>
              <AuthorId xmlns="http://www.microsoft.com/provisioning/EapCommon">311</AuthorId>
            </EapMethod>
            <Config xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
              <EapAka xmlns="http://www.microsoft.com/provisioning/EapAkaConnectionPropertiesV1">
                <DontRevealPermanentID>FALSE</DontRevealPermanentID>
                <Realm Enabled="true"></Realm>
              </EapAka>
            </Config>
          </EapHostConfig>
        </Configuration>
      </Eap>
    </Authentication>

    <RoutingPolicyType>SplitTunnel</RoutingPolicyType>
    <DisableClassBasedDefaultRoute>true</DisableClassBasedDefaultRoute>
  </NativeProfile>

  <Route>
    <Address>192.168.50.0</Address>
    <PrefixSize>24</PrefixSize>
  </Route>

  <RememberCredentials>true</RememberCredentials>
</VPNProfile>

ファイルの内容に関して、重要なポイントをいくつか記載しておきます。

  • <NativeProfile> - <Servers>
    • ここを、VPNサーバー証明書のsan/cnや、strongSwanの swanctl.conf にある local 項目の id と一致させる必要があります。本件の記事シリーズでは simauth.vpn.jp と決めているので、これを設定しておきます。
  • <EapMethod> - <Type>
    • 使用するEAP Typeを指定しますが、今回はEAP-AKAを利用するので 23 を指定します。一応、EAP-AKA'(50)も指定可能ではありますが、通信モジュール側がEAP-AKA'非対応だったりNetworkNameの指定方法が不明だったり、他にも色々と不明点が多いこともあって動作確認ができていません。
  • <config> - <DontRevealPermanentID>
    • AKA-RADIUSサーバーの都合上、ここは必ず FALSE にしてください。自作AKA-RADIUSサーバーは仮名認証をサポートしておらず、Permanent ID(具体的にはIMSI)を通知してもらう必要があるためです。
  • <config> - <Realm>
    • ここもAKA-RADIUSサーバーの都合上、<Realm Enabled="true"></Realm> のままとしてください。EAP-Identityに入るUser-Nameにおいて、Realm部分をRFC 4187準拠の @wlan.mncXXX.mccYYY.3gppnetwork.org の形式で自動生成してもらうためです。
  • <RoutingPolicyType>
    • 本件環境ではスプリットトンネル設定を入れています。VPNサーバーからWindows 11 PCに対してDHCPで 192.168.50.0/24 でアドレスを振るので、これに合わせて <Route> タグの内容も設定されています。

VPN profileの登録

1つ前のセクションで作成したXMLファイルを、Powershell経由でWindowsに登録します。
残念ながらGUIから登録する方法が見当たらず、以下の方法を(ChatGPT/Claudeに聞きながら)ほぼ流用する形となりました。
https://learn.microsoft.com/en-us/azure/virtual-wan/howto-always-on-user-tunnel
ということで、まずは以下のPowershellスクリプトファイルを作成してください。
ファイル名は useraka.ps1 とでも付けておきましょう。このファイル名も、続く手順のコマンドで参照します。

Param(
    [string]$xmlFilePath,
    [string]$ProfileName
)

if (-not (Test-Path $xmlFilePath)) {
    Write-Host "XML file not found: $xmlFilePath"
    exit 1
}

$ProfileXML = Get-Content $xmlFilePath -Raw
$ProfileNameEscaped = $ProfileName -replace ' ', '%20'

$ProfileXML = $ProfileXML -replace '<', '&lt;'
$ProfileXML = $ProfileXML -replace '>', '&gt;'
$ProfileXML = $ProfileXML -replace '"', '&quot;'

$nodeCSPURI = "./Vendor/MSFT/VPNv2"
$namespaceName = "root\cimv2\mdm\dmmap"
$className = "MDM_VPNv2_01"

$session = New-CimSession

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)
    Write-Host "Created VPN profile: $ProfileName"
}
catch {
    Write-Host "Unable to create VPN profile: $_"
    exit 1
}

続いて、VPN profileの VPNProfile.xml と上記のPowershellスクリプトファイル useraka.ps1 を同じフォルダに配置し、管理者権限で Powershellを起動して、ファイルを配置したフォルダへ移動してください。
Powershell 7.xをインストールしているなら、エクスプローラー上のフォルダでコンテクストメニュー(右クリックで表示されるヤツ)を開くと、Poweshell 7の項目に Open here as Administrator があるので、これを使うのもおススメです。

Powershellが開いたら、下記コマンドを実行してください。

.\useraka.ps1 .\VPNProfile.xml IKEv2-AKA

これは単に、VPN profile用XMLファイルに対してPowershellスクリプトファイルを実行しているだけです。ここまででファイル名を変更している場合は、適宜コマンドも変更してください。
なお、コマンド末尾の IKEv2-AKA はVPN設定の登録エントリー名なので変更可能です。

コマンドを実行すると上記のような出力結果になるはずです。

IKEv2暗号ポリシーの設定

前記事(4)で、strongSwanの swanctl.conf でIKE暗号ポリシーを明示した箇所がありましたが、Windows 11側でこれと一致したIKE Proposalを提示させるため、Powershellで以下のコマンドを実行します。
Set-VpnConnectionIPsecConfiguration は IKEv2/L2TPのVPN接続用IPsecパラメータを設定するコマンドです。ConnectionName には、前段のVPN設定登録エントリー名を指定してください。

Set-VpnConnectionIPsecConfiguration `
  -ConnectionName "IKEv2-AKA" `
  -AuthenticationTransformConstants SHA256128 `
  -CipherTransformConstants AES128 `
  -EncryptionMethod AES128 `
  -IntegrityCheckMethod SHA256 `
  -PfsGroup PFS2048 `
  -DHGroup Group14 `
  -Force -PassThru

ここまで実行してしまえば、準備完了です。

VPN接続設定の確認(と削除方法)

VPN profileが登録されると、Windows 11の 「設定 > ネットワークとインターネット > VPN」 で、以下のように登録した項目が表示されるようになります。
VPN設定登録済み状態
……あとは、VPN設定メニューから「接続」を押すと、接続処理が走り始めます。

(なお、VPN設定を削除したいときは、このVPNメニューのGUI上から削除すればOKです)


次は IKEv2 IPsec VPNにSIM認証を使ってみる (6)【EAP-AKA RADIUS PoCサーバー】 です。

Discussion