VPN(Point To Site)接続する際の注意点

オンプレミスのサーバーからAzureにVPN(Point To Site)接続を行う際、設定や稼働後に課題があったのでご紹介します。
Point To Site(P2S)接続とは、クライアントコンピューターからAzureの仮想ネットワークへ、ポイント対サイトで安全に接続する方法です。

普通にVPN設定

まずは、Microsoft社から公開されている手順でVPN設定を行います。
下記手順はリソースマネージャのものです。クラシックデプロイはGUIから設定可能です。

  • 変数を設定
    • 使用するサブスクリプション
    Login-AzureRmAccount
    Get-AzureRmSubscription
    Select-AzureRmSubscription -SubscriptionName {SubscriptionName}
    
    • VNetの設定
    $VNetName  = "VNet1"    # VNet名
    $VNetPrefix1 = "192.254.0.0/16"    # 範囲
    $VNetPrefix2 = "10.7.0.0/16"    # 範囲
    
    • フロントエンド設定
    $FESubName = "FrontEnd"    # サブネット名
    $FESubPrefix = "192.254.1.0/24"    # 範囲
    
    • バックエンド設定
    $BESubName = "Backend"    # サブネット名
    $BESubPrefix = "10.7.1.0/24"    # 範囲
    
    • ゲートウェイ設定
    $GWSubName = "GatewaySubnet"    # サブネット名
    $GWSubPrefix = "192.254.200.0/26"    # 範囲
    $GWName = "GW"    # GW名
    $GWIPName = "GWIP"    # パブリックIP名
    $GWIPconfName = "gwipconf"    # GWIP設定名
    
    • VPNクライアントのアドレスプール
    $VPNClientAddressPool = "172.16.201.0/24"    # アドレス範囲
    
    • リソースグループ、ロケーション
    $RG = "sios_test"    # リソースグループ
    $Location = "Japan East"    # ロケーション
    
    • 名前解決に使用するDNSサーバーのIP
    $DNS = "8.8.8.8"    # DNSのIP
    
    • VPNクライアントの認証に使用されるルート証明書
    $P2SRootCertName = "ARMP2SRootCert.cer"    # 証明書ファイル名
    
  • VNetを構成
    • リソースグループ作成
    New-AzureRmResourceGroup -Name $RG -Location $Location
    
    • 仮想ネットワークのサブネットを構成
    $fesub = New-AzureRmVirtualNetworkSubnetConfig -Name $FESubName -AddressPrefix $FESubPrefix
    $besub = New-AzureRmVirtualNetworkSubnetConfig -Name $BESubName -AddressPrefix $BESubPrefix
    $gwsub = New-AzureRmVirtualNetworkSubnetConfig -Name $GWSubName -AddressPrefix $GWSubPrefix
    
    • 仮想ネットワークを作成
    New-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $RG -Location $Location -AddressPrefix $VNetPrefix1,$VNetPrefix2 -Subnet $fesub, $besub, $gwsub -DnsServer $DNS
    
    • 作成した仮想ネットワークの変数を指定
    $vnet = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $RG
    $subnet = Get-AzureRmVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet
    
    • パブリックIPアドレスを要求
    $pip = New-AzureRmPublicIpAddress -Name $GWIPName -ResourceGroupName $RG -Location $Location -AllocationMethod Dynamic
    $ipconf = New-AzureRmVirtualNetworkGatewayIpConfig -Name $GWIPconfName -Subnet $subnet -PublicIpAddress $pip
    
  • 証明書の追加
    • makecert等で、VPN接続用のルート証明書・クライアント証明書を作成
    • 作成したルート証明書をAzureに追加
    $filePathForCert = {pasteYourCerFilePathHere}
    $cert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2($filePathForCert)
    $CertBase64 = [system.convert]::ToBase64String($cert.RawData)
    $p2srootcert = New-AzureRmVpnClientRootCertificate -Name $P2SRootCertName -PublicCertData $CertBase64
    
  • VPNゲートウェイの作成
    • 仮想ネットワーク ゲートウェイを構成、作成
    New-AzureRmVirtualNetworkGateway -Name $GWName -ResourceGroupName $RG `
    -Location $Location -IpConfigurations $ipconf -GatewayType Vpn `
    -VpnType RouteBased -EnableBgp $false -GatewaySku Standard `
    -VpnClientAddressPool $VPNClientAddressPool -VpnClientRootCertificates $p2srootcert
    
  • VPNクライアント構成パッケージのダウンロード・インストール
    • ダウンロードURL取得
    Get-AzureRmVpnClientPackage -ResourceGroupName $RG `
    -VirtualNetworkGatewayName $GWName -ProcessorArchitecture Amd64
    
    • URLにアクセスしクライアント構成パッケージをダウンロード
    • クライアントコンピューターにインストール
  • Azureへ接続
    • クライアントコンピューターにクライアント証明書をインポートする
    • ネットワーク接続設定からVPNを選択し、「接続」をクリックして接続を開始
      azurevpn-2

以上で、通常手順によるVPN設定は完了です。

設定後、困ったこと

上記手順で設定を行うと、VPN接続の際に必ずポップアップが表示され、「接続」を押さないと接続開始されません。
また、ユーザーのサインアウトで切断されてしまい、バックグラウンドで接続し続けることが出来ません。
VPNを常時接続しておきたい場合など、このままでは接続を維持することが難しいです。

解決方法

下記サイト記事を参考に設定を行うことで、サインアウト後も接続を維持することが出来ます。

以下、設定手順です。

  • コンピューターアカウントの「信頼されたルート証明機関」に、下記2つの証明書をインポート
    1. VPN構成時にAzureに登録したルート証明書
    2. 1を使用して作成したクライアント証明書
  • VPNクライアントインストーラーを展開
    .\XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.exe /C /T:{展開先ディレクトリ}
    
  • 展開されたディレクトリの”.cer”ファイルを証明書ストアにインポート
    ※VPNクライアントインストール済みの際は、既にストアにある旨表示されます
    certutil -addstore root .\XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.cer
    
  • 展開されたディレクトリの”.pbk”ファイルを開き、下記項目の値を確認
    • PhoneNumber
  • 「新しい接続またはネットワークのセットアップ」を選択
    azurevpn-3
  • 「職場に接続します」を選択
    azurevpn-4

  • 「新しい接続を作成します」を選択
    azurevpn-5

  • 「インターネット接続(VPN)を使用します」を選択
    azurevpn-6

  • 「インターネットアドレス」に、.pbkファイルで確認した値を入力
    azurevpn-7

  • 「ネットワーク接続」から作成したVPN設定を右クリックし、「プロパティ」を選択
    azurevpn-8

  • 「セキュリティ」タブを選択

    • 「VPNの種類」を「Secure Socket トンネリング プロトコル(SSTP)」に変更
    • 「拡張認証プロトコル」を「スマートカードまたはその他の証明書(暗号化は有効)」に変更
      azurevpn-9
    • 「プロパティ」を選択
      azurevpn-10
      • 「このコンピューターの証明書を使う」を選択
      • 「証明書を検証してサーバーのIDを検証する」を選択
      • VPNゲートウェイの証明書を選択
        azurevpn-11
      • 認証方法の「詳細設定」を選択
        azurevpn-12
        • 「証明書発行者」を選択
        • 「ルート証明機関」から、下記2つの証明書を選択
          1. VPN構成時にAzureに登録したルート証明書
          2. 1を使用して作成したクライアント証明書
            azurevpn-13
  • 「ネットワーク」タブを選択
    • 「インターネットプロトコル バージョン 4」⇒「プロパティ」⇒「詳細設定」⇒「リモートネットワークでデフォルトゲートウェイを使う」のチェックを外す
      azurevpn-16
  • 「OK」を押して保存
  • 自動起動の設定

    • タスクスケジューラを起動
    • 新しいタスクを作成
    • 「全般」タブ
      • 「ユーザーがログオンしているかどうかに関わらず実行する」にチェック
      • 「最上位の権限で実行する」にチェック
      • 「構成: Windows Server 2012 R2」を選択
        azurevpn-17
    • 「トリガー」タブ
      • タスクの開始「スタートアップ時」を作成
        azurevpn-18
    • 「操作」タブ
      • 「操作: プログラムの開始」を選択
      • 「プログラム/スクリプト: rasdial」を入力
      • 「引数の追加」に作成したVPN設定名を入力
        azurevpn-19
    • 「設定」タブ
      • 「タスクを停止するまでの時間」のチェックを外す
      • 「要求時に実行中のタスクが終了しない場合、タスクを強制的に停止する」のチェックを外す
        azurevpn-20
    • 「OK」を押して保存
  • タスクを実行し、作成したVPN設定が「接続済み」になれば設定完了
    azurevpn-15
  • サインアウト、再ログインし、VPNが切断されていないことを確認

以上で、設定は完了です。

稼働後、困ったこと

上記設定で1年ほど問題なく稼働していたのですが、ある日突然、下記のエラーが発生してVPN接続が失敗するようになりました。

azurevpn-1
0x800B0109: 証明書チェーンは処理されましたが、信頼プロバイダーが信頼していないルート証明書で強制終了しました。

調査したところ、Azure側のVPNゲートウェイに使用される証明書が更新されたようでした。
最新のVPNクライアント構成パッケージをダウンロードし再設定したところ、再び接続することが出来ました。

おわりに

以上でオンプレミスのサーバーからAzureにVPN接続し、バックグラウンドで接続維持できる環境を構築出来ました。
突然接続出来なくなった事象については、Azure側の証明書が最短1年半で更新されるようで、Microsoft社から事前に通知されることは現状無いということです。
そのため、定期的に接続チェックするなど、留意する必要がありそうです。

参考

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

1人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です