Azure で Juniper vMX  - [1] とりあえず動かす 

# はじめに

いまのプロジェクトで、Juniper MX をポータルからコントロールするような、いわゆる SDN 的な話がでてきたので、試しに vMX を少し触ってみた。ルータ触るのめっちゃ久しぶり。

# 下調べ

- [Juniper MX の H/W](https://www.juniper.net/jp/jp/products-services/routing/mx-series/compare?p=MX10,MX10000,MX10003,MX104,MX150,MX2008,MX2010,MX2020,MX204,MX240,MX40,MX480,MX5,MX80,MX960) は弁当箱サイズから、冷蔵庫サイズみたいなのがあるみたいだが、当然 [VM版](https://www.juniper.net/jp/jp/dm/free-vmx-trial/) もあって、`vMX` というらしい
- `vMX` は AWS および Azure のマーケットプレイスにすでにイメージがある
- イメージのライセンスは他でもよくあるように、`PAYG` - Pay As You Go か `BYOL` - Bring Your Own License から選べる
    - `BYOL` だと 60日間無料お試しができそう
- Juniper が 提供している Azure でのチュートリアル的なドキュメントは [これ](https://www.juniper.net/documentation/en_US/vmx/topics/concept/vmx-azure-overview.html) をみつけた[^1]

[^1]: 最初は、vMX のインスタンスが立っている状態から始めてしまって、いろいろうまくいかなかった。事前にVMを立てておく必要はなく、Azureのアカウントがある状態からこのドキュメントに従うとうまくいくはず

# 今回の構成

先に出来上がりの様子を。公式の [Getting Started Guide for Microsoft Azure](https://www.juniper.net/documentation/en_US/vmx/topics/concept/vmx-azure-overview.html) のとおりにやると以下のような構成になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/3953b7bf-9a62-bddd-c188-0e23bdc3d94d.png)

この図は、Azure Portal から `Network Watcher` > `トポロジ` といくと確認できる。最近のクラウドはこういう可視化があたりまえになってるので助かる。ちなみにアイコンクリックするとアドレスとか詳細をみることができる

# 構築していきます

Azure アカウントがあって、Azure CLI （ `az` コマンド）が使えることが前提 

## vMX イメージのライセンスを有効にする

Junper ライセンスの Term & Conditions に合意しないといけない。`az` コマンドでできる

```
az vm image terms accept --urn juniper-networks:vmx-virtual-router:vmx-virtual-router-byol-image:18.3.x3
```

末尾の `18.3.x3` のところはイメージのバージョンなので、ここは使いたいイメージに合わせて変更する。現在使えるバージョン確認してみる

```
$ az vm image list --offer vMX --all --output table 
Offer                              Publisher         Sku                                Urn                                                                                          Version
---------------------------------  ----------------  ---------------------------------  -------------------------------------------------------------------------------------------  ---------
cisco-meraki-vmx100                cisco             vmx100                             cisco:cisco-meraki-vmx100:vmx100:0.0.1                                                       0.0.1
cisco-meraki-vmx100                cisco             vmx100                             cisco:cisco-meraki-vmx100:vmx100:0.0.2                                                       0.0.2
cisco-meraki-vmx100                cisco             vmx100                             cisco:cisco-meraki-vmx100:vmx100:1.0.0                                                       1.0.0
cisco-meraki-vmx100                cisco             vmx100                             cisco:cisco-meraki-vmx100:vmx100:1.0.1                                                       1.0.1
vmx-services-gateway-byol          juniper-networks  vmx-services-gateway-byol          juniper-networks:vmx-services-gateway-byol:vmx-services-gateway-byol:17.4.2                  17.4.2
vmx-services-gateway-byol          juniper-networks  vmx-services-gateway-byol          juniper-networks:vmx-services-gateway-byol:vmx-services-gateway-byol:17.4.3                  17.4.3
vmx-services-gateway-byol          juniper-networks  vmx-services-gateway-byol          juniper-networks:vmx-services-gateway-byol:vmx-services-gateway-byol:18.3.2                  18.3.2
vmx-services-gateway-byol-soltemp  juniper-networks  vmx-services-gateway-byol-soltemp  juniper-networks:vmx-services-gateway-byol-soltemp:vmx-services-gateway-byol-soltemp:17.4.3  17.4.3
vmx-virtual-router                 juniper-networks  vmx-virtual-router-payg-image      juniper-networks:vmx-virtual-router:vmx-virtual-router-payg-image:17.4.1                     17.4.1
```

とりあえず、`18.3.2` でよさそうなので、以下のように実行

```
$ az vm image terms accept --urn juniper-networks:vmx-services-gateway-byol:vmx-services-gateway-byol:18.3.2 
```

## スクリプトで一気に構築

ガイドどおりに `azure.config` と `azure_vmx_deploy.sh`  を使って、一気に図の構成をつくる。`azure.config` をきっちり設定しておけば、それを読んで、`azure_vmx_deploy.sh` が設定してくれる

```shell:azure.config
#
# Sample VMX deployment settings for Microsoft Azure
#

# Account config
account="your-account-id-is-here"
grpname="dcipoc"
location="japaneast"

# VM config
vmname="vmx-1"
admin="your-user-name-here"
vmximagename="juniper-networks:vmx-services-gateway-byol:vmx-services-gateway-byol:18.3.2"

# Network Config
number_of_nics=4
addressprefix="30.0.0.0/16"
PrivateIpAddress="30.0.0.10"
PrivateIpAddress2="30.0.1.10"
subnet_prefixes=( 30.0.0.0/24 30.0.1.0/24 30.0.2.0/24 30.0.3.0/24 )
```

```
$ ./azure_vmx_deploy.sh
Creating resource group
Location    Name
----------  ------
japaneast   dcipoc
Created group dcipoc
Creating storage account
CreationTime                      EnableHttpsTrafficOnly    Kind     Location    Name        PrimaryLocation    ProvisioningState    ResourceGroup    StatusOfPrimary
--------------------------------  ------------------------  -------  ----------  ----------  -----------------  -------------------  ---------------  -----------------
2020-05-24T00:32:34.803507+00:00  True                      Storage  japaneast   dcipocstor  japaneast          Succeeded            dcipoc           available
Created storage account dcipocstor
Created
---------
True
Created container dcipoccont
Creating Azure virtual network dcipoc-vnet1....

Done creating Azure virtual network dcipoc-vnet1
Creating virtual subnet dcipoc-vnet1-vsubnet0 30.0.0.0/24..
AddressPrefix    Name                   PrivateEndpointNetworkPolicies    PrivateLinkServiceNetworkPolicies    ProvisioningState    ResourceGroup
---------------  ---------------------  --------------------------------  -----------------------------------  -------------------  ---------------
30.0.0.0/24      dcipoc-vnet1-vsubnet0  Enabled                           Enabled                              Succeeded            dcipoc
Done creating subnet dcipoc-vnet1-vsubnet0 with prefix 30.0.0.0/24
Creating virtual subnet dcipoc-vnet1-vsubnet1 30.0.1.0/24..
AddressPrefix    Name                   PrivateEndpointNetworkPolicies    PrivateLinkServiceNetworkPolicies    ProvisioningState    ResourceGroup
---------------  ---------------------  --------------------------------  -----------------------------------  -------------------  ---------------
30.0.1.0/24      dcipoc-vnet1-vsubnet1  Enabled                           Enabled                              Succeeded            dcipoc
Done creating subnet dcipoc-vnet1-vsubnet1 with prefix 30.0.1.0/24
Creating virtual subnet dcipoc-vnet1-vsubnet2 30.0.2.0/24..
AddressPrefix    Name                   PrivateEndpointNetworkPolicies    PrivateLinkServiceNetworkPolicies    ProvisioningState    ResourceGroup
---------------  ---------------------  --------------------------------  -----------------------------------  -------------------  ---------------
30.0.2.0/24      dcipoc-vnet1-vsubnet2  Enabled                           Enabled                              Succeeded            dcipoc
Done creating subnet dcipoc-vnet1-vsubnet2 with prefix 30.0.2.0/24
Creating virtual subnet dcipoc-vnet1-vsubnet3 30.0.3.0/24..
AddressPrefix    Name                   PrivateEndpointNetworkPolicies    PrivateLinkServiceNetworkPolicies    ProvisioningState    ResourceGroup
---------------  ---------------------  --------------------------------  -----------------------------------  -------------------  ---------------
30.0.3.0/24      dcipoc-vnet1-vsubnet3  Enabled                           Enabled                              Succeeded            dcipoc
Done creating subnet dcipoc-vnet1-vsubnet3 with prefix 30.0.3.0/24
Creating routing tables...
DisableBgpRoutePropagation    Location    Name                  ProvisioningState    ResourceGroup
----------------------------  ----------  --------------------  -------------------  ---------------
False                         japaneast   dcipoc-rt-to-subnet2  Succeeded            dcipoc
DisableBgpRoutePropagation    Location    Name                  ProvisioningState    ResourceGroup
----------------------------  ----------  --------------------  -------------------  ---------------
False                         japaneast   dcipoc-rt-to-subnet3  Succeeded            dcipoc
AddressPrefix    Name                   PrivateEndpointNetworkPolicies    PrivateLinkServiceNetworkPolicies    ProvisioningState    ResourceGroup
---------------  ---------------------  --------------------------------  -----------------------------------  -------------------  ---------------
30.0.2.0/24      dcipoc-vnet1-vsubnet2  Enabled                           Enabled                              Succeeded            dcipoc
AddressPrefix    Name                   PrivateEndpointNetworkPolicies    PrivateLinkServiceNetworkPolicies    ProvisioningState    ResourceGroup
---------------  ---------------------  --------------------------------  -----------------------------------  -------------------  ---------------
30.0.3.0/24      dcipoc-vnet1-vsubnet3  Enabled                           Enabled                              Succeeded            dcipoc

Creating public IP addresses and NICs...
Created NIC vmx-1-vfp-nic with public IP...
Created NIC vmx-1-vcp-nic with public IP...
Created NIC vmx-1-wan-nic2...
Created NIC vmx-1-wan-nic3...

Adding routes to routing tables
AddressPrefix    Name       NextHopIpAddress    NextHopType       ProvisioningState    ResourceGroup
---------------  ---------  ------------------  ----------------  -------------------  ---------------
30.0.3.0/24      ToSubnet3  30.0.2.4            VirtualAppliance  Succeeded            dcipoc
AddressPrefix    Name       NextHopIpAddress    NextHopType       ProvisioningState    ResourceGroup
---------------  ---------  ------------------  ----------------  -------------------  ---------------
30.0.2.0/24      ToSubnet2  30.0.3.4            VirtualAppliance  Succeeded            dcipoc
Creating vMX VM...
ResourceGroup    PowerState    PublicIpAddress              Fqdns    PrivateIpAddress                       MacAddress                                                               Location    Zones
---------------  ------------  ---------------------------  -------  -------------------------------------  -----------------------------------------------------------------------  ----------  -------
dcipoc           VM running    your-pu-ip-1, your-pub-ip-2           30.0.0.10,30.0.1.10,30.0.2.4,30.0.3.4  00-0D-3A-CD-49-85,00-0D-3A-CD-48-20,00-0D-3A-CD-49-49,00-0D-3A-CD-47-A1  japaneast
vMX deployment complete
```

ここらで、Azure Portal でリソースグループ `dcipoc` をみると、いろいろできあがっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/ed0ec7f5-50c8-5b57-9703-5c293109a620.png)

`vMX` に `SSH` する IPアドレスを取得して

```
$ az network public-ip show --name vMX-1-vcp-public-ip -g dcipoc --query "{address: ipAddress}"
{
  "address": "<you-public-ip-address-here>"
}
```

`ssh` したら JUNOS のシェルがお出迎え

```
$ ssh gdc@<you-public-ip-address-here>
Last login: Sun May 24 00:57:49 2020 from your-ip-address
--- JUNOS 18.3X3.2 Kernel 64-bit  JNPR-11.0-20190907.2386fa2_buil
gdc@vmx-1> 
```
試しに `show int` うん、JUNOS だ

```
gdc@vmx-1> show interfaces ge-0/0/0     
Physical interface: ge-0/0/0, Enabled, Physical link is Up
  Interface index: 148, SNMP ifIndex: 526
  Link-level type: Ethernet, MTU: 1514, MRU: 1522, LAN-PHY mode, Speed: 1000mbps, BPDU Error: None, Loop Detect PDU Error: None,
  Ethernet-Switching Error: None, MAC-REWRITE Error: None, Loopback: Disabled, Source filtering: Disabled, Flow control: Enabled,
  Auto-negotiation: Enabled, Remote fault: Online
  Pad to minimum frame size: Disabled
  Device flags   : Present Running
  Interface flags: SNMP-Traps Internal: 0x4000
  Link flags     : None
  CoS queues     : 8 supported, 8 maximum usable queues
  Current address: 00:0d:3a:cd:49:49, Hardware address: 00:0d:3a:cd:49:49
  Last flapped   : 2020-05-24 00:52:05 UTC (00:06:28 ago)
  Input rate     : 0 bps (0 pps)
  Output rate    : 0 bps (0 pps)
  Active alarms  : None
  Active defects : None
  PCS statistics                      Seconds
    Bit errors                             0
    Errored blocks                         0
  Ethernet FEC statistics              Errors
    FEC Corrected Errors                    0
    FEC Uncorrected Errors                  0
    FEC Corrected Errors Rate               0
    FEC Uncorrected Errors Rate             0
  Interface transmit statistics: Disabled
```

# セキュリティをちゃんとしとこう

このあたりで、セキュリティをちゃんとしたほうがいいと思う。Azure Portal から `ネットワーク セキュリティ グループ` を設定し、自分の `Src IP` からのみ `SSH` できるようにしておいた

セキュリティグループを作成して、FWルールを書くだけではダメで、グループにインターフェースまたはサブネットを **`関連付け`** する必要がある。今回は `Public IP` をもつインターフェースを対象にした

二つの `Public IP` があるが以下のようになっているので二つとも関連付けする

- `vmx-1-vfp-nic` に SSH すると `Linux` のシェル
- `vmx-1-vcp-nic` に SSH すると `vMX` のシェル

また、関連付けしても、1分くらいは FW が有効にならないので確認するときはしばらく待つ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/19a77f01-483d-73c7-7783-0386f669469a.png)

うまくいくと、トポロジにもシールドのマークが表れた

# シリーズ
- [Azure で Juniper vMX - [1] とりあえず動かす](https://qiita.com/narutaro/items/35b16016a6621fc626a3)
- [Azure で Juniper vMX - [2] REST APIを使う](https://qiita.com/narutaro/items/8cc490fe99439fca7e35)