Azure仮想マシンをIPv4/IPv6のデュアルスタックで構築する

2020年8月19日

はじめに

2019/7/18にAzure Virtual NetworkでIPv6の対応のPreviewが始まりましたが、当時は仮想マシン上のNICに直接IPv6のPublic IP addressの割当は行えず、インバウンドについてはAzure Load Balancer経由となっていました。

Preview当時の記事はこちら

最近は(多分)Standard Public IP addressが登場してから、仮想マシンのNICに直接IPv6のPublic IP addressが付与できます。

色々細かいことは以下の公式サイトに書かれていますが、今回はさくっとAzure CLIで環境を作成して確認しました。

Azure Virtual Network の IPv6 の概要

Azure環境のデプロイ

実は本当は全てAzureポータルで確認したかったのですが、以下の制限があるっぽかったのでAzure CLIを選びました。。

  • 仮想マシン作成時、Public IP addressにIPv6が指定出来ない(IPv4とIPv6の2つのPublic IP addressを指定したい)
  • NICに対して後からIPv6のPublic IP addressの追加ができない(IP構成で追加ができない)

環境変数の設定

とりあえず環境変数を設定しておきます。

#!/bin/bash

rgname=ipv6-ds-rg
location=japaneast
vmname=vm01
nsgname=ds-nsg
vnetname=ds-vnet
subnetname=default
subnetname2=subnet2
vmid=azureuser
vmpassword=(任意の文字列)

リソースグループの作成

以下のコマンドでリソースグループを作成します。

# Create Resource Group
az group create \
    --name $rgname \
    --location $location

Public IPの作成

IPv4, IPv6それぞれのPublic IPを作成します。Standard SKUで、Allocation methodはstatic(静的)割当とします。

# Create an IPV4 IP address
az network public-ip create \
    --name ${vmname}-pip-v4  \
    --resource-group $rgname  \
    --location $location  \
    --sku standard  \
    --allocation-method static  \
    --version IPv4

# Create an IPV6 IP address
az network public-ip create \
    --name ${vmname}-pip-v6  \
    --resource-group $rgname  \
    --location $location \
    --sku standard  \
    --allocation-method static  \
    --version IPv6

NSGの作成

外部からTCP/22を許可するためにNSGとルールを作成します。

# Create NSG
az network nsg create \
    --name $nsgname  \
    --resource-group $rgname  \
    --location $location

# Create inbound rule for port 22
az network nsg rule create \
    --name allowSSHIn  \
    --nsg-name $nsgname  \
    --resource-group $rgname  \
    --priority 100  \
    --description "Allow SSH In"  \
    --access Allow  \
    --protocol "Tcp"  \
    --direction Inbound  \
    --source-address-prefixes "*"  \
    --source-port-ranges "*"  \
    --destination-address-prefixes "*"  \
    --destination-port-ranges 22

仮想ネットワークの作成

Dual Stackな仮想ネットワークを作成します。

今回はサブネットを2つ作り、IPv4とIPv6のCIDR/Prefixをそれぞれ設定します。

これでいいのか自信はないですけど、IPv6のリンクローカルアドレスのPrefix「fc00::/7」を配慮して、サブネットそれぞれのPrefixをfc00::/64, fc01::/64にしました。

※こちらについて、有識者の方コメント頂けると助かります。

# Create the virtual network
az network vnet create \
    --name $vnetname \
    --resource-group $rgname \
    --location $location  \
    --address-prefixes "192.168.10.0/24" "fc00::/48" "fc01::/48"

# Create a single dual stack subnet
az network vnet subnet create \
    --name $subnetname \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --address-prefixes "192.168.10.0/25" "fc00::/64" \
    --network-security-group $nsgname

# Create a single dual stack subnet
az network vnet subnet create \
    --name $subnetname2 \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --address-prefixes "192.168.10.128/25" "fc01::/64" \
    --network-security-group $nsgname

NICの作成

NICを作成して、後からIPv6のPublic IP addressを追加しています。(この操作がAzureポータルから出来ない)

# Create NICs
az network nic create \
    --name ${vmname}-nic  \
    --resource-group $rgname \
    --location $location  \
    --vnet-name $vnetname  \
    --subnet $subnetname  \
    --private-ip-address-version IPv4 \
    --public-ip-address ${vmname}-pip-v4

az network nic ip-config create \
    --name ifconfig-v6  \
    --nic-name ${vmname}-nic  \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --subnet $subnetname \
    --private-ip-address-version IPv6 \
    --public-ip-address ${vmname}-pip-v6

VMの作成

最後に仮想マシンを作成します。

# Create VM
az vm create \
    --name $vmname \
    --resource-group $rgname \
    --location $location  \
    --nics ${vmname}-nic \
    --size Standard_A2 \
    --admin-username $vmid \
    --admin-password $vmpassword \
    --image UbuntuLTS

Azureポータルからの確認

作成後はAzureポータルからも設定内容の確認は行なえます。

Virtual Networkのsubnet

Public IP address

NIC

接続確認

まずは外部のPCからIPv4で仮想マシンに接続しますが、当然繋がります。

今度はIPv6のアドレスでsshしてみます。当然ですが、クライアントPCの環境もIPv6でインターネットの利用ができる環境が必要です。

ちなみに、作成した仮想マシン上から、自宅にあるRaspberry PIにもIPv6でsshが可能です。

こちらも問題ないですね。

おわりに

まだAzureのサービス全てがIPv6に対応しているわけではありませんが、着実に追いついてきていますね。

また、色々AzureのIPv6周りを試していきたいと思います。