ネットワーク仮想アプライアンス(ルートテーブル設定例)

スポンサーリンク

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:~$ 
タイトルとURLをコピーしました