Azure Virtual NetworkでIPv6がPreviewになったので試す

はじめに

2019/7/18にAzure Virtual NetworkでIPv6の対応がPreviewで始まりましたので、試します。

https://azure.microsoft.com/en-us/updates/microsoft-adds-new-features-to-ipv6-support-for-azure-vnets/

できそうなこと

こちらの概要ページにもありますが、以下の条件(制限)が今はあります(抜粋)。

https://docs.microsoft.com/ja-jp/azure/virtual-network/ipv6-overview

  • Azure CLI若しくはAzure Powershellから操作可能
  • VMにデュアルスタック(IPv4/IPv6)のPublic IPを付与できない
  • Load Balancer(BASIC)にデュアルスタックのPublic IPを付与する

なので、InternetからIPv6で仮想マシンにアクセスする場合にはLoad Balancer経由になるようです。逆にVMからInternetに対しては多分IPv6サイトに対しても直接接続できるようになると思いますので、このへんを調査したいと思います。

この構成ができると、以下の図のように、自宅のサーバ(Raspberry PI)にAzure VMを踏み台にしてIPv6で接続ができるはずです(赤線)。
(自宅NW環境はv6プラスサービスを利用しているのでIPv4でのサーバ外部公開ができない。IPv6だったらルータ設定をちょちょっと変えるだけで外部から接続可能)

他にNetwork Watcher関連、NSG関連の機能追加や制約もありますが、今回はそのへんはパスします。また次回試します。

Azure環境のデプロイ

基本的に以下のサイトにかかれているチュートリアルを実施しただけですが、検証用にVMは2台も要らないのと、Ubuntuで試したかったので色々スクリプト修正しました。。

https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-ipv4-ipv6-dual-stack-cli

まずはPreviewの利用登録。

$ az feature register --name AllowIPv6VirtualNetwork --namespace Microsoft.Network
$ az feature register --name AllowIPv6CAOnStandardLB --namespace Microsoft.Network

なかなか反映されません。ドキュメントによると最大30分かかるというのでお茶でも飲みながら待ちましょう。

$ az feature show --name AllowIPv6VirtualNetwork --namespace Microsoft.Network -o table
Name                                       RegistrationState
-----------------------------------------  -------------------
Microsoft.Network/AllowIPv6VirtualNetwork  Registering
$ az feature show --name AllowIPv6CAOnStandardLB --namespace Microsoft.Network -o table
Name                                       RegistrationState
-----------------------------------------  -------------------
Microsoft.Network/AllowIPv6CAOnStandardLB  Registering

やはり20分くらい待ったら、Registeredになりましたので次に進みます。

$ az feature show --name AllowIPv6VirtualNetwork --namespace Microsoft.Network -o table
Name                                       RegistrationState
-----------------------------------------  -------------------
Microsoft.Network/AllowIPv6VirtualNetwork  Registered
$ az feature show --name AllowIPv6CAOnStandardLB --namespace Microsoft.Network -o table
Name                                       RegistrationState
-----------------------------------------  -------------------
Microsoft.Network/AllowIPv6CAOnStandardLB  Registered

つづいてですが、既に自分のAzureサブスクリプションでは大量の仮想ネットワークを作成しまくっているので不要かとは思いますが、念の為以下を実行しておきます。

$ az provider register --namespace Microsoft.Network

さて、作っていきましょう。

環境変数の設定

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

#!/bin/bash
rgname=ipv6-rg
location=japaneast
lbname=ds-lb
vmname=bastionvm01
nsgname=ds-nsg
vnetname=ds-vnet
subnetname=default
avsetname=ds-avset
vmid=azureuser
vmpassword=******** (任意の文字列)

リソースグループの作成

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

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

Load Balancer用Public IPの作成

IPv4, IPv6それぞれのPublic IPを作成します。

# Create an IPV4 IP address
az network public-ip create \
    --name ${lbname}-pip-v4  \
    --resource-group $rgname  \
    --location $location  \
    --sku BASIC  \
    --allocation-method dynamic  \
    --version IPv4
# Create an IPV6 IP address
az network public-ip create \
    --name ${lbname}-pip-v6  \
    --resource-group $rgname  \
    --location $location \
    --sku BASIC  \
    --allocation-method dynamic  \
    --version IPv6

VM用Public IPの作成

IPv4もLoad Balancer経由でアクセスできるので不要なのですが、Load Balancerの設定をしくじった時の為に作成しておきます。

# Create Public IP(v4) for VM
az network public-ip create \
    --name ${vmname}-pip  \
    --resource-group $rgname \
    --location $location  \
    --sku BASIC  \
    --allocation-method dynamic  \
    --version IPv4

Load Balancerの作成

Dual StackなLoad Balancer(BASIC)を作成して、フロントエンドプール、バックエンドプール、正常性プローブ、負荷分散ルールを作成します。

# Create Dual Stack LB
az network lb create \
    --name $lbname  \
    --resource-group $rgname \
    --sku Basic \
    --location $location \
    --frontend-ip-name dsLbFrontEnd_v4  \
    --public-ip-address ${lbname}-pip-v4  \
    --backend-pool-name dsLbBackEndPool_v4
az network lb frontend-ip create \
    --lb-name $lbname  \
    --name dsLbFrontEnd_v6  \
    --resource-group $rgname  \
    --public-ip-address ${lbname}-pip-v6
az network lb address-pool create \
    --lb-name $lbname  \
    --name dsLbBackEndPool_v6  \
    --resource-group $rgname
# Create LB Probe
az network lb probe create \
    --name ${lbname}-probe \
    --resource-group $rgname \
    --lb-name $lbname \
    --protocol Tcp \
    --port 22 \
    --interval 5 \
    --threshold 2
# Create LB Rule
az network lb rule create \
    --lb-name $lbname  \
    --name dsLBrule_v4  \
    --resource-group $rgname  \
    --frontend-ip-name dsLbFrontEnd_v4  \
    --protocol Tcp  \
    --frontend-port 22  \
    --backend-port 22  \
    --probe-name ${lbname}-probe \
    --backend-pool-name dsLbBackEndPool_v4
az network lb rule create \
    --lb-name $lbname  \
    --name dsLBrule_v6  \
    --resource-group $rgname \
    --frontend-ip-name dsLbFrontEnd_v6  \
    --protocol Tcp  \
    --frontend-port 22 \
    --backend-port 22  \
    --probe-name ${lbname}-probe \
    --backend-pool-name dsLbBackEndPool_v6

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な仮想ネットワークを作成します。

# Create the virtual network
az network vnet create \
    --name $vnetname \
    --resource-group $rgname \
    --location $location  \
    --address-prefixes "10.0.0.0/16" "ace:cab:deca::/48"
# Create a single dual stack subnet
az network vnet subnet create \
    --name $subnetname \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --address-prefixes "10.0.0.0/24" "ace:cab:deca:deed::/64" \
    --network-security-group $nsgname

NICの作成

Duak StackなNICを作成します。これは仮想マシン用です。

# Create NICs
az network nic create \
    --name ${vmname}-nic  \
    --resource-group $rgname \
    --vnet-name $vnetname  \
    --subnet $subnetname  \
    --private-ip-address-version IPv4 \
    --lb-address-pools dsLbBackEndPool_v4  \
    --lb-name $lbname  \
    --public-ip-address ${vmname}-pip
az network nic ip-config create \
    --name dsIp6Config_NIC0  \
    --nic-name ${vmname}-nic  \
    --resource-group $rgname \
    --vnet-name $vnetname \
    --subnet $subnetname \
    --private-ip-address-version IPv6 \
    --lb-address-pools dsLbBackEndPool_v6 \
    --lb-name $lbname

可用性セットの作成

VMは一台だけですが、Load Balancer配下に入れるために可用性セットを作成します。

# Create availability set
az vm availability-set create \
    --name $avsetname \
    --resource-group $rgname \
    --location $location

VMの作成

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

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

Azureポータルからの確認

一応Azureポータルからも作成や操作は出来ませんが、参照はできるみたいです。

Load BalancerのフロントエンドIP構成

Load Balancerのバックエンドプール

仮想ネットワークの接続デバイス

接続確認

まずは外部のPCからIPv4で仮想マシンに接続します。

Load BalancerのIPv4アドレスでも良いですし、仮想マシンのIPv4アドレスでもつながるでしょう。
[外部PC → (IPv4)AzureVM]

これは普通の今までのIPv4による接続なので問題ないですね。

今回作成した仮想マシンはIPv4/IPv6のDual Stackなので、IPv6の外部サーバへの接続もできるはず。
[外部PC → (IPv4)AzureVM → (IPv6)自宅サーバ]

自宅のRaspberry PIはIPv6によるssh接続をopenにしているので、普通につながりました。

最後に自宅サーバから先に作成したAzure Load Balancer経由で仮想マシンにIPv6で接続します。
[外部PC → (IPv4)AzureVM → (IPv6)自宅サーバ → (IPv6)Azure VM]

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

おわりに

Azureも今まではTraffic ManagerやCDNではIPv6の利用が出来たのですが、今回のPreview発表でさらに幅が広がりました。

早くVMのNICに直接IPv6のPublic IPが付与できるといいですね。

とりあえずこれで、自宅サーバ(IPv6)にもAzure VM経由でsshできるようになったので、各種リモートメンテも捗りそうです。

今回の記事ではNSGがTCP/22をフルオープンにしているので、実際には接続元を絞るなどのセキュリティ対策は実施したほうがいいと思います。