Azure内でネットワーク仮想アプライアンスを利用する場合は、ルートテーブルと呼ばれる設定にも注意が必要です。ルートテーブルはstatic routeに近い概念で、どのパケットをどのマシンに転送するかの設定です。Express RouteやSite to Site VPNでBGPを使用したルーティングをする場合はprefixがAzure全体に広報されますが、それ以外の手法を採用する場合はルートテーブルの設定が必要です。
ルートテーブルの設定は非常に手間です。そもそもネットワーク技術者そのものが減少傾向というご時世もあり、ルートテーブルの初歩的な設定ミスすら見抜けずにトラブルに発展する事例をよく見ています。このようなトラブルを回避する手法としてvWANというマネージドサービスもあります。非常に高価なサービスなので、このサイトでは解説しませんが、vWANという名前くらいは頭の片隅に置くと良いかもしれません。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
事前設定
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
仮想ネットワークとサブネットを作成します。
az network vnet create \ --resource-group MyResourceGroup \ --name Vnet01 \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group MyResourceGroup \ --name Subnet01 \ --vnet-name Vnet01 \ --address-prefixes 172.16.1.0/24 az network vnet subnet create \ --resource-group MyResourceGroup \ --name Subnet02 \ --vnet-name Vnet01 \ --address-prefixes 172.16.2.0/24
構成図
以下の構成で動作確認をします。linux020にはグローバルIPアドレスが設定なく、router010(cisco CSR)を経由してインターネットに接続可能になるようにします。
| | 172.16.1.0/24 | (Subnet01) | G1 | .10 (グローバルIP設定あり) +------+------+ | router010 | | (cisco CSR) | +------+------+ G2 | .10 | | 172.16.2.0/24 | (Subnet02) | eth0 | .20 +------+------+ | linux020 | | (UbuntuLTS) | +-------------+
擬似Bastionサービス
マネージドサービスのAzure Bastion Serivceはやや高価ですので、同等機能を提供する仮想マシンを作成します。
az network vnet subnet create \ --resource-group MyResourceGroup \ --name MyBastionSubnet \ --vnet-name Vnet01 \ --address-prefixes 172.16.0.0/24 az vm create \ --resource-group MyResourceGroup \ --name bastion250 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name Vnet01 \ --subnet MyBastionSubnet \ --private-ip-address 172.16.0.250
仮想アプライアンスのデプロイ
仮想NICの作成
cisco CSRに対するネットワークセキュリティグループを定義します。sshのみ許可します。
az network nsg create -g MyResourceGroup -n MyNsg az network nsg rule create \ --resource-group MyResourceGroup \ --nsg-name MyNsg \ --name MyNsgRuleSsh \ --priority 100 \ --destination-port-ranges 22 \ --access Allow \ --protocol Tcp
cisco CSRに接続される1つ目のNICを作成します。1つ目のNICはCisco CSRからは「GigabitEthernet 1」として認識されます。
また、パケットが仮想アプライアンスを通過する場合は「IP転送」を有効にします。CLI操作ではaz network nic createコマンドでNICを作成する時にip-forwardingオプションを指定します。このオプションを指定しないと、パケットが仮想アプライアンスを通過できません。
az network public-ip create \ --resource-group MyResourceGroup \ --name router010-pip \ --sku Standard az network nic create \ --resource-group MyResourceGroup \ --name router010-nic01 \ --vnet-name Vnet01 \ --subnet Subnet01 \ --network-security-group MyNsg \ --ip-forwarding true \ --private-ip-address 172.16.1.10 \ --public-ip-address router010-pip
2つ目のNICを作成します。2つ目のNICはCisco CSRからは「GigabitEthernet 2」として認識されます。
az network nic create \ --resource-group MyResourceGroup \ --name router010-nic02 \ --vnet-name Vnet01 \ --subnet Subnet02 \ --network-security-group MyNsg \ --ip-forwarding true \ --private-ip-address 172.16.2.10 \ --public-ip-address ''
仮想マシンの作成
仮想マシンを作成します。
az vm create \ --resource-group MyResourceGroup \ --name router010 \ --image cisco:cisco-csr-1000v:17_3_3-byol:latest \ --size Standard_D2_v5 \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --priority Spot \ --nics router010-nic01
仮想マシンを1度deallocate(割り当て解除)し、2番目のNICを追加して起動します。2番目のNICはprimary=falseとなる事に注意ください。primary=trueとなるNICに対してデフォルトゲートウェイが設定されます。
azコマンドの場合はdeallocateのような手間のかかる操作をしていますが、ARM templateの場合は仮想マシンの作成と2つのNIC付与を同時に操作できます。
az vm deallocate \ --resource-group MyResourceGroup \ --name router010 NIC_ID=$(az network nic show \ --resource-group MyResourceGroup \ --name router010-nic02 \ --query 'id' \ --output tsv ) az vm update \ --name router010 \ --resource-group MyResourceGroup \ --add networkProfile.networkInterfaces primary=false id=${NIC_ID} az vm start \ --resource-group MyResourceGroup \ --name router010
no shutdown
仮想マシン作成時のログから、cisco CSRのグローバルIPアドレスを把握します。
$ az vm create \ --resource-group MyResourceGroup \ --name router010 \ --image cisco:cisco-csr-1000v:17_3_3-byol:latest \ --size Standard_D2_v5 \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --priority Spot \ --nics router010-nic01 { "fqdns": "", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/router010", "location": "japaneast", "macAddress": "00-0D-3A-50-0C-1D", "powerState": "VM running", "privateIpAddress": "172.16.1.10", "publicIpAddress": "52.253.96.9", "resourceGroup": "MyResourceGroup", "zones": "" }
初期設定の状態では以下のようにGigabitEthernet 2はshutdown状態です。
admin@mac19 ~ % ssh 52.253.96.9 -l azureuser <omitted> router010#show ip interface brief Interface IP-Address OK? Method Status Protocol GigabitEthernet1 172.16.1.10 YES DHCP up up GigabitEthernet2 unassigned YES unset administratively down down VirtualPortGroup0 192.168.35.101 YES TFTP up up router010#
GigabitEthernet 2をno shutdownし、dhcpによってIPアドレスを割り当てます。Azureはマネージドサービスの仕組みによってIPアドレスを割り当てますので、OSや仮想アプライアンスの設定でstaticにIPアドレスを割り当てないでください。
interface GigabitEthernet 2 ip address dhcp no shutdown
GigabitEthernet 2がup状態になった事、DHCPによってIPアドレスが割り当てられた事を確認します。
router010#show ip interface brief Interface IP-Address OK? Method Status Protocol GigabitEthernet1 172.16.1.10 YES DHCP up up GigabitEthernet2 172.16.2.10 YES DHCP up up VirtualPortGroup0 192.168.35.101 YES TFTP up up router010#
ルートテーブル
Subnet02(172.16.2.0/24)に属する仮想マシンは、デフォルトゲートウェイ(0.0.0.0/0)がrouter010(172.16.1.10)へ向くように設定します。
まずはルートテーブルを作成します。
az network route-table create \ --resource-group MyResourceGroup \ --name RouteTableSubnet02
ルートテーブルに0.0.0.0/0のエントリを追加します。
az network route-table route create \ --resource-group MyResourceGroup \ --address-prefix "0.0.0.0/0" \ --name "default gateway" \ --next-hop-type "VirtualAppliance" \ --route-table-name RouteTableSubnet02 \ --next-hop-ip-address 172.16.2.10
ルートテーブルとサブネットを紐づけます。
az network vnet subnet update \ --resource-group MyResourceGroup \ --vnet-name Vnet01 \ --name Subnet02 \ --route-table RouteTableSubnet02
疎通確認
疎通確認用の仮想マシン作成
疎通確認用の仮想マシンを作成します。
az vm create \ --resource-group MyResourceGroup \ --name linux020 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --admin-password P@ssw0rd1234 \ --vnet-name Vnet01 \ --subnet Subnet02 \ --private-ip-address 172.16.2.20 \ --public-ip-address ''
この仮想マシン(linux020)はグローバルIPアドレスが付与されていませんので、直接sshでログインする事はできません。擬似踏み台であるbastion250を経由してログインします。
まずは、bastion250作成時のログからグローバルIPアドレスを把握します。
$ az vm create \ --resource-group MyResourceGroup \ --name bastion250 \ --image UbuntuLTS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name Vnet01 \ --subnet MyBastionSubnet \ --private-ip-address 172.16.0.250 { "fqdns": "", "id": "/subscriptions/2e2f81a9-b030-410f-9784-c582580c932e/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/bastion250", "location": "japaneast", "macAddress": "00-22-48-E6-FF-FE", "powerState": "VM running", "privateIpAddress": "172.16.0.250", "publicIpAddress": "52.140.195.51", "resourceGroup": "MyResourceGroup", "zones": "" }
linux020へログインする操作例は以下の通りです。
admin@mac19 ~ % ssh 52.140.195.51 -l azureuser <omitted> azureuser@bastion250:~$ azureuser@bastion250:~$ azureuser@bastion250:~$ ssh 172.16.2.20 <omitted> azureuser@linux020:~$ azureuser@linux020:~$ azureuser@linux020:~$
cisco CSRへのping応答がある事を確認します。
azureuser@linux020:~$ ping 172.16.2.10 -c 3 PING 172.16.2.10 (172.16.2.10) 56(84) bytes of data. 64 bytes from 172.16.2.10: icmp_seq=1 ttl=255 time=2.88 ms 64 bytes from 172.16.2.10: icmp_seq=2 ttl=255 time=1.71 ms 64 bytes from 172.16.2.10: icmp_seq=3 ttl=255 time=1.69 ms --- 172.16.2.10 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 1.697/2.097/2.884/0.556 ms azureuser@linux020:~$
NAT設定
Cisco SCRにsource NATを設定しインターネットへ接続可能な状態にします。なお、NATを設定すると「GigabitEthernet 1」へのssh接続はできなくなりますので、再設定の必要に迫られた場合は「GigabitEthernet 2(172.16.2.10)」から接続ください。
NATの設定例は以下の通りです。
interface GigabitEthernet1 ip nat outside ! interface GigabitEthernet2 ip nat inside ! ip access-list standard ACL_NAT 10 permit any ! ip nat inside source list ACL_NAT interface GigabitEthernet 1 overload
疎通確認
linux020から8.8.8.8への疎通を確認します。
azureuser@linux020:~$ ping 8.8.8.8 -c 3 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=55 time=3.66 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=55 time=3.40 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=55 time=3.13 ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 3.139/3.402/3.663/0.224 ms azureuser@linux020:~$
想定通りの通信経路になっている事を確認するため、「確認くん」などの送信元IPアドレスが表示されるサイトへのcurlを試みます。確かに、送信元IPアドレスがcisco CSRに付与されたグローバルIPアドレスになっている事を確認します。
azureuser@linux020:~$ curl -s https://www.ugtop.com/spill.shtml | grep -i IPv4 -A 1 <th>あなたのIPアドレス(IPv4)</th> <td><font size=+2 color=blue>52.253.96.9</font></td> azureuser@linux020:~$