AzureでP2S接続してみる

# はじめに
AZ-104の勉強中にVPNGatewayに関する記述があり、理解が乏しかったので実践して理解を深めようと思った次第です。
今回は自分のPCからAzure VMにプライベート接続できることを確認します。
※以下を参考に実施します

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-rm-ps

# 環境
* Windows11
* Azure PowerShell Module
* PowerShell ver7以上

# VPNゲートウェイの使用方法
AzureでのVPNゲートウェイの使用方法は3つあります
1. S2S接続(他クラウド環境と接続したり、オンプレミスのデータセンターと接続したりする場合はこちらだと思います。)
1. VNet間接続(複数のAzure仮想ネットワークを接続します)
1. P2S接続(クライアントPCとAzureの仮想ネットワークとを接続します) <font color="red">★今回はこちら</font>


# ①Azure にサインインします
```powershell
Connect-AzAccount
```

# ②リソースグループの作成を行います
今回は初めに以下の変数を宣言をします
```powershell
# 変数の値は任意の値を入れてください
$VNetName  = "任意の名称"
$FESubName = "任意の名称"
$GWSubName = "任意の名称"
$VNetPrefix = "xxx.xxx.xxx.xxx/xx"
$FESubPrefix = "xxx.xxx.xxx.xxx/xx"
$GWSubPrefix = "xxx.xxx.xxx.xxx/xx"
$VPNClientAddressPool = "xxx.xxx.xxx.xxx/xx"
$RG = "任意の名称"
$Location = "任意の名称"
$GWName = "任意の名称"
$GWIPName = "任意の名称"
$GWIPconfName = "任意の名称"
$DNS = "xxx.xxx.xxx.xxx"
```

```powershell
# リソースグループの作成をします
New-AzResourceGroup -Name $RG -Location $Location
```

# ③VNetの作成
```powershell
try {
    $fesub = New-AzVirtualNetworkSubnetConfig -Name $FESubName `
                -AddressPrefix $FESubPrefix

    $gwsub = New-AzVirtualNetworkSubnetConfig -Name $GWSubName `
                -AddressPrefix $GWSubPrefix

    # VNetを作成します
    New-AzVirtualNetwork -Name $VNetName `
        -ResourceGroupName $RG `
        -Location $Location `
        -AddressPrefix $VNetPrefix `
        -Subnet $fesub, $gwsub `
        -DnsServer $DNS

    # 作成したVNetの変数を取得します
    $vnet = Get-AzVirtualNetwork -ResourceGroupName $RG -Name $VNetName
    $subnet = Get-AzVirtualNetworkSubnetConfig -Name "GatewaySubnet" -VirtualNetwork $vnet

    # クライアントPCから接続するときに参照するパブリックアドレスを作成します
    $pip = New-AzPublicIpAddress -Name $GWIPName `
            -ResourceGroupName $RG `
            -Location $Location `
            -AllocationMethod Dynamic `
            -Sku Standard
    $ipconf = New-AzVirtualNetworkGatewayIpConfig -Name $GWIPconfName `
                -Subnet $subnet `
                -PublicIpAddress $pip

    # VPNGatewayを作成します(最大45分かかるみたいです)
    New-AzVirtualNetworkGateway -Name $GWName `
        -ResourceGroupName $RG `
        -Location $Location `
        -IpConfigurations $ipconf `
        -GatewayType Vpn `
        -VpnType RouteBased `
        -EnableBgp $false `
        -GatewaySku VpnGw1AZ `
        -VpnClientProtocol "IKEv2" `
        -VpnGatewayGeneration "Generation1"
}
catch {
    Write-Host $_.Exception.Message -ForegroundColor Red
}
```

# ④証明書の生成
クライアントPCに証明書の生成を行います
```powershell
# 自己署名ルート証明書の作成
$cert = New-SelfSignedCertificate -Type Custom `
            -KeySpec Signature `
            -Subject "CN=P2SRootCert" `
            -KeyExportPolicy Exportable `
            -HashAlgorithm sha256 `
            -KeyLength 2048 `
            -CertStoreLocation "Cert:\CurrentUser\My" `
            -KeyUsageProperty Sign `
            -KeyUsage CertSign

# クライアント証明書の作成
New-SelfSignedCertificate -Type Custom `
    -DnsName P2SRootCert `
    -KeySpec Signature `
    -Subject "CN=P2SChildCert" `
    -KeyExportPolicy Exportable `
    -HashAlgorithm sha256 `
    -KeyLength 2048 `
    -CertStoreLocation "Cert:\CurrentUser\My" `
    -Signer $cert `
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2")
```

作成後はAzureにアップロードする証明書のアップロードを行います
1. ユーザ証明書の管理を開きます(ファイル名を指定して実行で「certmgr.msc」を入力してEnterで開きます)
1. 先ほど作成した自己署名ルート証明書を探し、右クリックしてエクスポートを選択します
1. 次へをクリックします
1. いいえ、秘密キーをエクスポートしませんをクリックします
1. Base 64 encoded X.509をクリックします
1. エクスポート先を選択してクリックします
1. エクスポートした証明書をメモ帳で開き、②で作成したVNetGatewayに設定します

![スクリーンショット 2022-12-24 152127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819390/bde5cf14-eb27-d303-24e5-96f08719ca68.png)

![スクリーンショット 2022-12-24 152157.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819390/acb40e0c-4efa-1181-bbdd-bb0fe26b337a.png)

![スクリーンショット 2022-12-24 152231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819390/72a1ae8b-4c36-07e4-6d3d-1a17e9a89cbc.png)

![スクリーンショット 2022-12-24 161824.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819390/362d8a39-0cd8-82b3-55f3-e4b2be8940ff.png)


# ⑤VPNクライアントの設定を行います
VNetGatewayからVPNクライアントをダウンロードします
![スクリーンショット 2022-12-31 233800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819390/b983208d-18d7-a69b-4f5a-22f500f0ef23.png)

ダウンロードしたファイルからインストールを行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819390/de6f0e06-1824-f503-87cf-294f41e74e80.png)

インストール後は以下が追加されるので接続をクリックしてVPN接続を行います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819390/5a3c427d-03a7-6415-b3a7-6f1acaf6d02d.png)

以下参考

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/point-to-site-how-to-vpn-client-install-azure-cert

# ⑥VM作成
確認用にVMを作成します。
```powershell
$UserName = "azureuser";
$Password = ConvertTo-SecureString "azureP@assword123" -AsPlainText -Force;
$Cred = New-Object System.Management.Automation.PSCredential ($UserName, $Password);
$SSHKeyName = "mySSHKeyName01";

New-AzVM -ResourceGroupName $RG `
    -Name "TestVM" `
    -Location $Location `
    -Image UbuntuLTS `
    -Size "Standard_D2s_v3" `
    -Credential $Cred `
    -OpenPorts 22 `
    -GenerateSshKey `
    -SshKeyName $SSHKeyName `
    -VirtualNetworkName $VNetName `
    -SubnetName $FESubName `
    -PublicIpAddressName "TestVMIP"
```

# ⑦接続確認
```powershell
# プライベートアドレスの確認
$VM = Get-AzVM -ResourceGroup $RG
Get-AzNetworkInterface -ResourceId $VM.NetworkProfile.NetworkInterfaces.Id

# VPN接続状態でVMプライベートアドレスに接続できれば成功です
ssh -i <key_path> azureuser@<プライベートアドレス>
```


# 最後に
検証後はリソースの削除を行います
```powershell
Remove-AzResourceGroup -Name $RG -Force
```

証明書の削除は以下参考

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-rm-ps

# 所感
実際に作成してみることで理解が深まった気がします。
機会があれば今度はS2Sの接続にも挑戦してみたいと思います。