Azure Virtual NetworkでIPv6がPreviewになったので試す
はじめに
2019/7/18にAzure Virtual NetworkでIPv6の対応がPreviewで始まりましたので、試します。
できそうなこと
こちらの概要ページにもありますが、以下の条件(制限)が今はあります(抜粋)。
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をフルオープンにしているので、実際には接続元を絞るなどのセキュリティ対策は実施したほうがいいと思います。