AzureでIPv6対応VMを構築する方法(CLI使用)

AzureというのはMicrosoftが提供しているクラウドサービスです.
このAzureはIPv6に対応しているはずなのですが,実際にVMでIPv6通信を可能にするのに苦労したので,やり方をまとめておきます.

AzureにおけるIPv6の概要

AzureがIPv6に対応しているといっても構築したVMに直接グローバルなIPv6アドレスを付けることはできません.
Azure VMでIPv6を使うにはグローバルIPv6アドレスを付与したロードバランサを設置して,その下にVMを生成する必要が有ります(要はNATです).

Azure Load Balancer の IPv6 の概要

話だけ聞くと,全然難しくなさそうなのですが実際にやってみると

  • 日本語の情報が少ない
  • 情報があっても古いものが多い
  • Web上のインタフェースで設定できない
  • 手順が多い

等の理由で結構面倒くさいです.

今回はオーソドックスなIPv6対応VMのCLIを用いた構築方法についてまとめます.

今回構築する環境

今回は以下のようなロードバランサの下にVM一つの環境を構築します.
ロードバランサはNAT目的でのみ用い,負荷分散はしません.
またグローバルIPアドレスはIPv4・IPv6ともにロードバランサに付与し,VMにはプライベートアドレスのみを付けます.

構築手順

事前にAzureアカウントを取得していることを前提とします.
アカウントを持っていない人はこちらから登録してください.

Azure CLIのインストール

前述の通り,今回の設定はWebインタフェースではできないので,Azure CLIというコマンドラインツールをインストールします.
今回はDebian系について書きますが,WindowsやmacOSでもインストール可能です(Azure CLI のインストール).

1.aptのソースリストの追加

$ AZ_REPO=$(lsb_release -cs)
$ echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | \
    sudo tee /etc/apt/sources.list.d/azure-cli.list

2.Microsoftの署名キーを取得

$ curl -L https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

3.CLIをインストール

$ sudo apt-get update
$ sudo apt-get install apt-transport-https azure-cli

4.ログイン

$ az login

Webブラウザが開くので,Azureにログインしてください.
ログイン後にCLIに表示される情報のうち,“id”は後で使用するのでメモっておいてください

リソースグループ・ロードバランサ・仮想ネットワーク・サブネットの作成

1.変数の定義

$ subscriptionid="########-####-####-####-############"
$ location="westeurope"
$ rgName="pscontosorg1southctrlus09152016"
$ vnetName="contosoIPv4Vnet"
$ vnetPrefix="10.0.0.0/16"
$ subnetName="clicontosoIPv4Subnet"
$ subnetPrefix="10.0.0.0/24"
$ dnsLabel="contoso09152016"
$ lbName="myIPv4IPv6Lb"

subscriptionidは,先程ログインした際に表示された”id”を入れてください.
その他の項目は必要に応じて適当に設定してください.

選択可能なロケーション名は以下のコマンドで確認できます.

$ az account list-locations -o table

2.リソースグループの生成

$ az group create --name $rgName --location $location

3.ロードバランサの作成

$ az network lb create --resource-group $rgName --location $location --name $lbName

4.仮想ネットワークの作成

$ az network vnet create --resource-group $rgName --name $vnetName --location $location --address-prefixes $vnetPrefix

5.サブネットワークの作成

$ az network vnet subnet create --resource-group $rgName --name $subnetName --address-prefix $subnetPrefix --vnet-name $vnetName

ロードバランサに付与するグローバルIPアドレスの作成

1.変数の定義

$ publicIpv4Name="myIPv4Vip"
$ publicIpv6Name="myIPv6Vip"

2.グローバルIPアドレスの作成

$ az network public-ip create --resource-group $rgName --name $publicIpv4Name --location $location --version IPv4 --allocation-method Dynamic --dns-name $dnsLabel
$ az network public-ip create --resource-group $rgName --name $publicIpv6Name --location $location --version IPv6 --allocation-method Dynamic --dns-name $dnsLabel

フロントエンドプールとバックエンドプールの作成

1.変数の定義

$ frontendV4Name="FrontendVipIPv4"
$ frontendV6Name="FrontendVipIPv6"
$ backendAddressPoolV4Name="BackendPoolIPv4"
$ backendAddressPoolV6Name="BackendPoolIPv6"

2.パブリックIPとロードバランサを関連付けてフロントエンドIPプールを作成

$ az network lb frontend-ip create --resource-group $rgName --name $frontendV4Name --public-ip-address $publicIpv4Name --lb-name $lbName
$ az network lb frontend-ip create --resource-group $rgName --name $frontendV6Name --public-ip-address $publicIpv6Name --lb-name $lbName
$ az network lb address-pool create --resource-group $rgName --name $backendAddressPoolV4Name --lb-name $lbName
$ az network lb address-pool create --resource-group $rgName --name $backendAddressPoolV6Name --lb-name $lbName

NAT規則の作成

次の例では以下のNAT規則を生成します.

  • IPv4のTCPポート22(SSH)への接続をVMへ転送
  • IPv6のTCPポート22(SSH)への接続をVMへ転送

NAT規則は後からWebインタフェースで編集できるので,最低限の設定でいいと思います.

1.変数の定義

$ natRule1V4Name="NatRule-For-SSH"
$ natRule1V6Name="NatRule-For-SSHv6"

2.NAT規則の作成

$ az network lb inbound-nat-rule create --resource-group $rgName --name $natRule1V4Name --frontend-ip-name $frontendV4Name --protocol Tcp --frontend-port 22 --backend-port 22 --lb-name $lbName
$ az network lb inbound-nat-rule create --resource-group $rgName --name $natRule1V6Name --frontend-ip-name $frontendV6Name --protocol Tcp --frontend-port 22 --backend-port 22 --lb-name $lbName

NICの作成

NICを作成し,それらをNAT規則に関連付けます.

1.変数の定義

$ nicName="myIPv4IPv6Nic"
$ subnetId="/subscriptions/$subscriptionid/resourceGroups/$rgName/providers/Microsoft.Network/VirtualNetworks/$vnetName/subnets/$subnetName"
$ backendAddressPoolV4Id="/subscriptions/$subscriptionid/resourceGroups/$rgName/providers/Microsoft.Network/loadbalancers/$lbName/backendAddressPools/$backendAddressPoolV4Name"
$ backendAddressPoolV6Id="/subscriptions/$subscriptionid/resourceGroups/$rgName/providers/Microsoft.Network/loadbalancers/$lbName/backendAddressPools/$backendAddressPoolV6Name"
$ natRule1V4Id="/subscriptions/$subscriptionid/resourceGroups/$rgName/providers/Microsoft.Network/loadbalancers/$lbName/inboundNatRules/$natRule1V4Name"
$ natRule1V6Id="/subscriptions/$subscriptionid/resourceGroups/$rgName/providers/Microsoft.Network/loadbalancers/$lbName/inboundNatRules/$natRule1V6Name"

2.バックエンドにNICを作成し,IPv6構成を追加

$ az network nic create --name $nicName --resource-group $rgName --location $location --private-ip-address-version "IPv4" --subnet $subnetId --lb-address-pools $backendAddressPoolV4Id --lb-inbound-nat-rules $natRule1V4Id
$ az network nic ip-config create --resource-group $rgName --name "IPv6IPConfig" --private-ip-address-version "IPv6" --lb-address-pools $backendAddressPoolV6Id --lb-inbound-nat-rules $natRule1V6Id --nic-name $nicName

バックエンドのVMリソースの作成およびNICの関連付け

1.変数の定義

$ availabilitySetName="myIPv4IPv6AvailabilitySet"
$ vmName="myIPv4IPv6VM"
$ nicId="/subscriptions/$subscriptionid/resourceGroups/$rgName/providers/Microsoft.Network/networkInterfaces/$nicName"
$ imagerun="Canonical:UbuntuServer:16.04-LTS:latest"
$ vmUserName="vmUser"

imagerunにはVMにインストールするOSのイメージを指定します.
使用可能OSイメージ一覧は以下のコマンドで確認することができます.

$ az vm image list --output table

またvmUserNameにはVM内で使用するユーザ名を指定します.

2.可用性セットを作成

$ az vm availability-set create --name $availabilitySetName --resource-group $rgName --location $location

3.関連付けられたNICを使用して仮想マシンを作成

$ az vm create --resource-group $rgName --name $vmName --image $imagerun --admin-username $vmUserName --ssh-key-value ~/.ssh/id_rsa.pub --nics $nicId --location $location --availability-set $availabilitySetName --size "Standard_A1"

指定できるvmのサイズは以下のコマンドで確認することができます.
(今回はStandard_A1を指定しています)

$ az vm list-sizes --location $location --output table

また,ここでは公開鍵認証によるSSH接続のために--ssh-key-valueオプションで公開鍵ファイルを指定しています.パスワード認証にするためには--admin-passwordオプションを使いましょう.

ここまででIPv6対応のVMの構築は完了です.
あとはWebインタフェースで追加の設定を行ったり,SSH接続してサーバの設定を行ったりしてください.

なお作成した環境のFQDNは$dnsLabel.$location.cloudapp.azure.comになります.
アクセスする際はこのFQDNを使用しましょう.

おわりに

手順が多かったり,クラウド初心者には聞き慣れない単語が多く出てきて複雑になっていますが,各ステップでやっていることを理解できれば問題なく作成できると思います.
コマンドがわからない場合は--helpオプションを上手く使えば解決できることが多いです(例:az --helpaz vm --helpaz vm list --help).その都度コマンドの説明と後に続く引数の説明が表示されます.

本記事は2018年11月時点での構築方法になります.アップデート等により本記事の手順が使えなくなった場合は,ご指摘いただければ対応したいと思います.

IPv6はエンドホストに直接割り振っていけるように開発されたプロトコルのはずなのに,なんでこんな面倒くさいことをする必要があるんでしょうね……

参考にしたサイト

シェアする

  • このエントリーをはてなブックマークに追加

フォローする