1 つの VNET に複数の CIDR アドレス空間を登録して相互に通信できるか試してみた

## 背景と目的

既存の VNET がある前提で、既存のアドレス空間に隣接する CIDR が使えるとしたら、アドレス空間を拡張してサブネットを追加すると思います。では隣接しない CIDR なら使える場合は、別の VNET を作成して VNET ピアリングでしょうか？別リージョンに VNET を作成してピアリングしたい場合は良いのですが、同じリージョン内の VNET ピアリングでも送信と受信のデータ転送料金が発生します。そんな勿体無いことをせずとも、1 つの VNET に複数の CIDR アドレス空間を登録して相互に通信できるはずなので、実際に試してみました。

## 検証用 VNET を作成

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrvnet

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# VNET を作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet \
  --address-prefixes 10.0.0.0/24 \
  --subnet-name subnet1 \
  --subnet-prefix 10.0.0.0/24

# アドレス空間に 172.16.0.0/24 を追加します
az network vnet update \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet \
  --add addressSpace.addressPrefixes 172.16.0.0/24

# アドレス空間に 192.168.0.0/24 を追加します
az network vnet update \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet \
  --add addressSpace.addressPrefixes 192.168.0.0/24

# アドレス空間を確認します
az network vnet show \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet \
  --query addressSpace

{
  "addressPrefixes": [
    "10.0.0.0/24",
    "172.16.0.0/24",
    "192.168.0.0/24"
  ]
}
```

## 各サブネットに共通の NSG を作成し 2 つのサブネットを追加

```bash:bash
# NSG を作成します
az network nsg create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-nsg

# NSG ルールを作成します
az network nsg rule create \
  --resource-group ${prefix}-rg \
  --name Allow-SSH \
  --nsg-name ${prefix}-nsg \
  --priority 100 \
  --source-address-prefixes $(curl -s inet-ip.info) \
  --destination-port-ranges 22 \
  --access Allow \
  --protocol Tcp

# NSG をサブネットに紐付けます
az network vnet subnet update \
  --resource-group ${prefix}-rg \
  --vnet-name ${prefix}-vnet \
  --name subnet1 \
  --network-security-group ${prefix}-nsg

# 2 つ目サブネットを作成します
az network vnet subnet create \
  --vnet-name ${prefix}-vnet \
  --resource-group ${prefix}-rg \
  --name subnet2 \
  --address-prefix 172.16.0.0/24 \
  --network-security-group ${prefix}-nsg

# 3 つ目サブネットを作成します
az network vnet subnet create \
  --vnet-name ${prefix}-vnet \
  --resource-group ${prefix}-rg \
  --name subnet3 \
  --address-prefix 192.168.0.0/24 \
  --network-security-group ${prefix}-nsg
```

## 検証用の仮想マシンをそれぞれのサブネットに作成

```bash:bash
# 仮想マシン作成します
for i in {1..3}; do
  az vm create \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i} \
    --os-disk-name ${prefix}-vm${i}OSDisk \
    --image UbuntuLTS \
    --size Standard_B1ls \
    --admin-username azureuser \
    --generate-ssh-keys \
    --vnet-name ${prefix}-vnet \
    --subnet subnet${i} \
    --nsg "" \
    --public-ip-address-dns-name ${prefix}${i} \
    --storage-sku Standard_LRS
done
```

## それぞれの仮想マシンに SSH 接続して別の VM と通信できるか試す

```bash:bash
$ ssh azureuser@${prefix}1.$region.cloudapp.azure.com "ping -c 4 172.16.0.4; ping -c 4 192.168.0.4"

PING 172.16.0.4 (172.16.0.4) 56(84) bytes of data.
64 bytes from 172.16.0.4: icmp_seq=1 ttl=64 time=1.57 ms
64 bytes from 172.16.0.4: icmp_seq=2 ttl=64 time=1.31 ms
64 bytes from 172.16.0.4: icmp_seq=3 ttl=64 time=0.974 ms
64 bytes from 172.16.0.4: icmp_seq=4 ttl=64 time=1.29 ms

--- 172.16.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.974/1.291/1.577/0.213 ms

PING 192.168.0.4 (192.168.0.4) 56(84) bytes of data.
64 bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=2.16 ms
64 bytes from 192.168.0.4: icmp_seq=2 ttl=64 time=0.869 ms
64 bytes from 192.168.0.4: icmp_seq=3 ttl=64 time=1.96 ms
64 bytes from 192.168.0.4: icmp_seq=4 ttl=64 time=1.70 ms

--- 192.168.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3014ms
rtt min/avg/max/mdev = 0.869/1.676/2.167/0.494 ms

$ ssh azureuser@${prefix}2.$region.cloudapp.azure.com "ping -c 4 10.0.0.4; ping -c 4 192.168.0.4"

PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.
64 bytes from 10.0.0.4: icmp_seq=1 ttl=64 time=1.27 ms
64 bytes from 10.0.0.4: icmp_seq=2 ttl=64 time=1.07 ms
64 bytes from 10.0.0.4: icmp_seq=3 ttl=64 time=1.76 ms
64 bytes from 10.0.0.4: icmp_seq=4 ttl=64 time=1.61 ms

--- 10.0.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.074/1.434/1.768/0.274 ms

PING 192.168.0.4 (192.168.0.4) 56(84) bytes of data.
64 bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=0.995 ms
64 bytes from 192.168.0.4: icmp_seq=2 ttl=64 time=1.40 ms
64 bytes from 192.168.0.4: icmp_seq=3 ttl=64 time=2.16 ms
64 bytes from 192.168.0.4: icmp_seq=4 ttl=64 time=1.63 ms

--- 192.168.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.995/1.550/2.163/0.421 ms

$ ssh azureuser@${prefix}3.$region.cloudapp.azure.com "ping -c 4 10.0.0.4; ping -c 4 172.16.0.4"

PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.
64 bytes from 10.0.0.4: icmp_seq=1 ttl=64 time=1.73 ms
64 bytes from 10.0.0.4: icmp_seq=2 ttl=64 time=1.20 ms
64 bytes from 10.0.0.4: icmp_seq=3 ttl=64 time=1.04 ms
64 bytes from 10.0.0.4: icmp_seq=4 ttl=64 time=1.22 ms

--- 10.0.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 1.043/1.302/1.736/0.261 ms

PING 172.16.0.4 (172.16.0.4) 56(84) bytes of data.
64 bytes from 172.16.0.4: icmp_seq=1 ttl=64 time=2.42 ms
64 bytes from 172.16.0.4: icmp_seq=2 ttl=64 time=2.04 ms
64 bytes from 172.16.0.4: icmp_seq=3 ttl=64 time=1.89 ms
64 bytes from 172.16.0.4: icmp_seq=4 ttl=64 time=2.17 ms

--- 172.16.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.896/2.133/2.427/0.203 ms
```

## 検証環境を削除

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes
```

## 参考

https://azure.microsoft.com/ja-jp/pricing/details/virtual-network/