Young Leaves

Azure NAT Gateway で外部ネットワークに接続する

今回は仮想ネットワーク内の内部リソース通信を変換しインターネットへの通信を行うAzure NAT Gateway を使い、仮想マシンからNAT Gateway を経由しインターネットに接続する方法について説明します。

実施環境

Azure CloudShell

2.45.0

前提条件

今回はAzure Portal からAzure CloudShell を使用しコマンドを実行するため、事前にAzure CloudShell の作成をお願いします。

Azure NAT Gateway とは

Azure NAT Gateway は仮想ネットワーク内のアウトバウンド通信のアドレスを変換するサービスです。NAT Gateway を使用することで、仮想ネットワーク内のリソースがインターネットに接続する際、特定のIP アドレスで通信ができます。Azure NAT Gateway はIPv4 のみ関連付けが可能であり、IPv6 を関連付けることはできません。また、NAT Gateway は同じリージョンの仮想ネットワークにのみ関連付けることができます。リージョンが同じであればリソースグループが異なっていても関連付けは可能です。

NAT Gateway で変換されるIP アドレスは、NAT Gateway に割り当てているパブリックIP アドレスまたはパブリックIP アドレスプレフィックス内のIP アドレスとなります。NAT Gateway は最大16個のパブリックIP アドレスを割り当てることができるため、IP アドレスによるスケーリングも可能です。また、NAT Gateway は複数の障害ドメインや可用性ゾーンの設置も可能です。

NAT Gateway は仮想ネットワークのサブネットに関連付けることで使用できます。1つのサブネットに関連付けられるNAT Gateway は1つのため、1つの仮想ネットワーク内に複数のサブネットがあれば異なる定義のNAT Gateway を割り当てることも可能です。ただし、NAT Gateway はゲートウェイサブネットに割り当てることはできません。

NAT Gateway の通信は同じ仮想ネットワーク内のロードバランサーやインスタンスレベルのIP アドレスより優先されます。例えば、1つの仮想ネットワーク内でパブリックIP アドレスを付与した仮想マシンとロードバランサー、NAT Gateway が混在する場合に仮想マシンからインターネットへの通信を行うと、NAT Gateway を経由して接続されます。

その他、NAT Gateway はロードバランサーと統合することで、バックエンドプールに対するアウトバウンドSNAT への規則が不要となります。

Azure NAT Gateway の制限

NAT Gateway はリージョンのサブスクリプションごとに最大1000 まで作成できます。また、NAT Gateway では最大16個のパブリックIP アドレスを使用できます。データのスループットなどのその他制限については以下URL を参照してください。

NAT Gateway の制限

Azure NAT Gateway の料金

Azure NAT Gateway はリソース作成時から課金が開始され、リソースの稼働時間と処理されたデータ量に応じて課金されます。詳細な料金につきましては、以下URL を参照してください。

Virtual Network の価格

今回の構成

今回はパブリックIP アドレスを持たない仮想マシンからNAT Gateway を経由しインターネットに接続する構成を作成します。リージョンは東日本リージョンを使用します。

リソースグループ、仮想ネットワークの作成

初めに今回使用する変数の定義とリソースグループ、仮想ネットワーク、Azure Bastion 用サブネットを作成します。

# リソース作成用の変数を定義する
RESOURCE_GROUP="test-rg"
VNET_NAME="test-vnet"
VM_SUBNET="vm-subnet"
BASTION_SUBNET="AzureBastionSubnet"
VM_NAME="test-vm"
BASTION_NAME="test-bastion"
BASTION_PUBIP="bastion-pubip"
NAT_PUBIP="nat-pubip"
NAT_NAME="test-natgw"
VM_USER="azureuser"
LOCATION="japaneast"

# リソースグループを作成する
az group create -n $RESOURCE_GROUP -l $LOCATION

# 仮想ネットワークを作成する
az network vnet create \
    -n $VNET_NAME \
    -g $RESOURCE_GROUP \
    -l $LOCATION \
    --address-prefixes 10.0.0.0/16 \
    --subnet-name $VM_SUBNET \
    --subnet-prefixes 10.0.100.0/24

# Azure Bastion用サブネットを作成する
az network vnet subnet create \
    -n $BASTION_SUBNET \
    -g $RESOURCE_GROUP \
    --vnet-name $VNET_NAME \
    --address-prefixes 10.0.10.0/26

Azure Bastion の作成

リソースグループ、仮想ネットワーク作成後、Azure Bastion を作成します。Azure Bastion 作成時にパブリックIP アドレスが必要となるため併せて作成します。

# Azure Bastion用のパブリックIPアドレスを作成する
az network public-ip create \
    -n $BASTION_PUBIP \
    -g $RESOURCE_GROUP \
    --sku Standard

# Azure Bastionを作成する
# 「The command requires the extension bastion. Do you want to install it now?」と聞かれた「Y」を入力する
az network bastion create \
    -n $BASTION_NAME \
    -g $RESOURCE_GROUP \
    --public-ip-address $BASTION_PUBIP \
    --vnet-name $VNET_NAME

仮想マシンの作成

Azure Bastion 作成後、仮想マシンを作成します。仮想マシン作成後、Azure Bastion で使用する秘密鍵を作成するため、CloudShell 上で秘密鍵の値を表示し控えます。秘密鍵の値を控えたら、ローカルPC 上で控えた値を基に秘密鍵のファイルを作成します。今回は「id_rsa」のファイル名で秘密名を作成しています。

# 仮想マシンを作成する
az vm create --name $VM_NAME \
    --resource-group $RESOURCE_GROUP \
    --image UbuntuLTS \
    --vnet-name $VNET_NAME \
    --subnet $VM_SUBNET \
    --public-ip-address "" \
    --admin-username $VM_USER \
    --generate-ssh-keys

# 秘密鍵を表示する
# 表示された文字列を控える
cat .ssh/id_rsa

Azure NAT Gateway の作成

仮想マシンのインターネット通信をNAT Gateway 経由とするため、NAT Gateway を作成します。NAT Gateway は作成時にパブリックIP アドレスを必要とするため、事前にパブリックIP アドレスを作成します。NAT Gateway 作成後、VM 用サブネットに関連付けます。

# NAT Gateway用のパブリックIPアドレスを作成する
# ipAddressの値を控える
az network public-ip create \
    -n $NAT_PUBIP \
    -g $RESOURCE_GROUP \
    --sku Standard

# NAT Gatewayを作成する
az network nat gateway create \
    -g $RESOURCE_GROUP \
    -n $NAT_NAME \
    -l $LOCATION \
    --public-ip-addresses $NAT_PUBIP \
    --idle-timeout 4

# NAT GatewayをVM用サブネットに関連付ける
az network vnet subnet update \
    -g $RESOURCE_GROUP \
    -n $VM_SUBNET \
    --vnet-name $VNET_NAME \
    --nat-gateway $NAT_NAME

動作確認

NAT Gateway の設定後、Azure Portal から作成した仮想マシンを選択し、「接続 > Bastion」で仮想マシンにSSH 接続を行います。各項目に以下の値を入力し「接続」をクリックします。

ユーザー名

azureuser

認証の種類

ローカルファイルからのSSH 秘密キー

ローカルファイル

ローカルで作成した秘密鍵 (id_rsa)

仮想マシンに接続後、以下コマンドを実行しパブリックIP アドレスがNAT Gateway のパブリックIP アドレスであることを確認します。

# インターネットへの通信を確認する
curl https://whatsmyip.com/ | grep "<NAT GatewayのパブリックIPアドレス>"

動作確認完了後、リソースグループをクリーンアップします。

# リソースグループをクリーンアップする
az group delete -n test-rg

まとめ

  • Azure NAT Gateway は仮想ネットワーク内のアウトバウンド通信を変換するサービス。
  • NAT Gateway は同じリージョンの仮想ネットワークにのみ関連付けられる。リージョンが同じであれば異なるリソースグループでも関連付けは可能。
  • NAT Gateway は仮想ネットワーク内のサブネットに関連付けて使用する。1つのサブネットに関連付けられるNAT Gateway は1つ。
  • NAT Gateway の通信は同じ仮想ネットワーク内のロードバランサーやインスタンスレベルのIP アドレスより優先される。

参考資料