ARM環境で P2S VPN を構築する

旧ポータルではできた P2S VPN ですが、ARM環境でもちゃんとサポートされております。

以下ページに、そのための手順が記載されております。

 ・PowerShell を利用し、仮想ネットワークへのポイント対サイト接続を構成する

上記ページでは P2S VPN の構成だけではなく、VNETの作成からパブリックIPの確保から、全てを PowerShell でおこなってる非常に頑張った構成ですが、既にVNETがある場合は、以下の手順だけで大丈夫です。

  1. ・証明書の構成
    1. 自己署名ルート証明書を作成
    2. クライアント証明書を必要分発行する
    3. ルート証明書のCER形式(Base64)のファイルを書き出す
  2. ・管理ポータルから必要なリソースを準備する
    1. VNET に GatewaySubnet という名称のサブネットを作っておく(名称が固定なのに注意!!)
    2. パブリックIPを取得(動的でないと行けないことに注意)
  3. ・以下 PowerShell を実行する

#準備したリソースの取得$pip = Get-AzureRmPublicIpAddress -Name "パブリックIPの名称" -ResourceGroupName "リソースグループ名"

$vnet = Get-AzureRmVirtualNetwork -Name "VNETの名称" -ResourceGroupName "リソースグループ名"
$subnet = Get-AzureRmVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet

# 自己署名ルート証明書を準備$texts = Get-Conent "ルート証明書のCERファイルへのパス"$texts[0] = ""

$texts[$texts.length-1]= ""
$certstring = $texts -join ""
$rootcert = New-AzureRmVpnClientRootCertificate -Name "証明書名称" -PublicCertData $certstring 

#Gatewayの作成$ipconfig = New-AzureRmVirtualNetworkGatewayIpConfig -Name "設定名称" `
-Subnet $subnet `

    -PublicIpAddress $pip
New-AzureRmVirtualNetworkGateway -Name "ゲートウェイ名" `
-ResourceGroupName "リソースグループ名" `
-IpConfigurations $ipconfig `

    -GatewayType Vpn `
    -VpnType RouteBased `
    -EnableBgp $false `
    -GatewaySku Standard `
    -VpnClientAddressPool "172.16.201.0/24" `
    -VpnClientRootCertificates $rootcert ` -Location ($pip.Location)

さて、これから仮想ネットワークゲートウェイを新規に作成するなら上記の手順でも構わないのですが、S2S接続や ExpressRoute による接続で既に仮想ネットワークゲートウェイを作成してしまっている場合、ここに P2S接続を兼ねさせることは出来るのでしょうか?

はい、これは可能です。その場合は、以下のスクリプトになります。

# 自己署名ルート証明書を準備$texts = Get-Conent "ルート証明書のCERファイルへのパス"$texts[0] = ""

$texts[$texts.length-1]= ""
$certstring = $texts -join ""

# 既存の仮想ネットワークゲートウェイを取得$gw = Get-AzureRmVirtualNetworkGateway -Name "ゲートウェイ名" -ResourceGroupName "リソースグループ名"

# ゲートウエイにP2SVPNの設定を追加Set-AzureRmVirtualNetworkGatewayVpnClientConfig -VirtualNetworkGateway $gw `
-VpnClientAddressPool 172.16.201.0/24

# ルート証明書を登録
Add-AzureRmVpnClientRootCertificate -VirtualNetworkGatewayName $gw.Name `
    -ResourceGroupName $gw.ResourceGroupName `
    -VpnClientRootCertificateName '証明書名称' `
    -PublicCertData $certstring

必ず、Set-AzureRmVirtualNetworkGatewayVpnClientConfig  を先に、その後で Add-AzureRmVpnClientRootCertificate を実施してください。
先にAdd-AzureRmVpnClientRootCertificate を実施すると、登録先がまだ存在しないためエラーなります。

二つの PowerShell のスクリプトを紹介しましたがいづれもヘルプなどに記載されている、以下の証明書データの読み込み方とは異なる方法で証明書データを文字列にしています。

$text = Get-Conent .¥rootcert.cer
$certificatedtext = for ($i=1; $i -lt $Text.Length -1 ; $i++){$Text[$i]}

これは何故かというと、蒸気の作り方をした場合、$certificatedtext は1行1文字列を束ねた配列で文字列ではないのでその旨のエラーが出ること、単純に [string]$certifictedtext とキャストして文字列にすると今度は行と行の間に空白文字が入ってしまいこれまたエラーになるためです。上記の方法でしたら、例えば以下のように -replace で空白文字を潰しておけば使えます。

$text = Get-Conent .¥rootcert.cer 
$text2 = for ($i=1; $i -lt $Text.Length -1 ; $i++){$Text[$i]}
$certstring = [string]$text2 -replace ' ',''