オンプレミスのサーバーから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を選択し、「接続」をクリックして接続を開始
以上で、通常手順によるVPN設定は完了です。
設定後、困ったこと
上記手順で設定を行うと、VPN接続の際に必ずポップアップが表示され、「接続」を押さないと接続開始されません。
また、ユーザーのサインアウトで切断されてしまい、バックグラウンドで接続し続けることが出来ません。
VPNを常時接続しておきたい場合など、このままでは接続を維持することが難しいです。
解決方法
下記サイト記事を参考に設定を行うことで、サインアウト後も接続を維持することが出来ます。
- https://buchizo.wordpress.com/2013/04/30/windows-azure-point-to-site-vpn%E3%82%92%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E3%81%99%E3%82%8B/
- https://buchizo.wordpress.com/2013/05/08/point-to-site-vpn%E3%82%92%E8%87%AA%E5%8B%95%E6%8E%A5%E7%B6%9A%E3%81%95%E3%81%9B%E3%82%8B/
以下、設定手順です。
- コンピューターアカウントの「信頼されたルート証明機関」に、下記2つの証明書をインポート
- VPN構成時にAzureに登録したルート証明書
- 1を使用して作成したクライアント証明書
- VPNクライアントインストーラーを展開
.\XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.exe /C /T:{展開先ディレクトリ}
- 展開されたディレクトリの”.cer”ファイルを証明書ストアにインポート
※VPNクライアントインストール済みの際は、既にストアにある旨表示されますcertutil -addstore root .\XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.cer
- 展開されたディレクトリの”.pbk”ファイルを開き、下記項目の値を確認
- PhoneNumber
- 「新しい接続またはネットワークのセットアップ」を選択
-
「職場に接続します」を選択
-
「新しい接続を作成します」を選択
-
「インターネット接続(VPN)を使用します」を選択
-
「インターネットアドレス」に、.pbkファイルで確認した値を入力
-
「ネットワーク接続」から作成したVPN設定を右クリックし、「プロパティ」を選択
-
「セキュリティ」タブを選択
- 「VPNの種類」を「Secure Socket トンネリング プロトコル(SSTP)」に変更
- 「拡張認証プロトコル」を「スマートカードまたはその他の証明書(暗号化は有効)」に変更
- 「プロパティ」を選択
- 「このコンピューターの証明書を使う」を選択
- 「証明書を検証してサーバーのIDを検証する」を選択
- VPNゲートウェイの証明書を選択
- 認証方法の「詳細設定」を選択
- 「証明書発行者」を選択
- 「ルート証明機関」から、下記2つの証明書を選択
- VPN構成時にAzureに登録したルート証明書
- 1を使用して作成したクライアント証明書
- 「ネットワーク」タブを選択
- 「インターネットプロトコル バージョン 4」⇒「プロパティ」⇒「詳細設定」⇒「リモートネットワークでデフォルトゲートウェイを使う」のチェックを外す
- 「インターネットプロトコル バージョン 4」⇒「プロパティ」⇒「詳細設定」⇒「リモートネットワークでデフォルトゲートウェイを使う」のチェックを外す
- 「OK」を押して保存
-
自動起動の設定
- タスクスケジューラを起動
- 新しいタスクを作成
- 「全般」タブ
- 「ユーザーがログオンしているかどうかに関わらず実行する」にチェック
- 「最上位の権限で実行する」にチェック
- 「構成: Windows Server 2012 R2」を選択
- 「トリガー」タブ
- タスクの開始「スタートアップ時」を作成
- タスクの開始「スタートアップ時」を作成
- 「操作」タブ
- 「操作: プログラムの開始」を選択
- 「プログラム/スクリプト: rasdial」を入力
- 「引数の追加」に作成したVPN設定名を入力
- 「設定」タブ
- 「タスクを停止するまでの時間」のチェックを外す
- 「要求時に実行中のタスクが終了しない場合、タスクを強制的に停止する」のチェックを外す
- 「OK」を押して保存
- タスクを実行し、作成したVPN設定が「接続済み」になれば設定完了
-
サインアウト、再ログインし、VPNが切断されていないことを確認
以上で、設定は完了です。
稼働後、困ったこと
上記設定で1年ほど問題なく稼働していたのですが、ある日突然、下記のエラーが発生してVPN接続が失敗するようになりました。
0x800B0109: 証明書チェーンは処理されましたが、信頼プロバイダーが信頼していないルート証明書で強制終了しました。
調査したところ、Azure側のVPNゲートウェイに使用される証明書が更新されたようでした。
最新のVPNクライアント構成パッケージをダウンロードし再設定したところ、再び接続することが出来ました。
おわりに
以上でオンプレミスのサーバーからAzureにVPN接続し、バックグラウンドで接続維持できる環境を構築出来ました。
突然接続出来なくなった事象については、Azure側の証明書が最短1年半で更新されるようで、Microsoft社から事前に通知されることは現状無いということです。
そのため、定期的に接続チェックするなど、留意する必要がありそうです。
参考
- https://azure.microsoft.com/ja-jp/documentation/articles/vpn-gateway-howto-point-to-site-rm-ps/
- https://buchizo.wordpress.com/2013/04/30/windows-azure-point-to-site-vpn%E3%82%92%E3%81%84%E3%82%8D%E3%81%84%E3%82%8D%E3%81%99%E3%82%8B/
- https://buchizo.wordpress.com/2013/05/08/point-to-site-vpn%E3%82%92%E8%87%AA%E5%8B%95%E6%8E%A5%E7%B6%9A%E3%81%95%E3%81%9B%E3%82%8B/