vMX on AWS と logical systemでお手軽ネットワークお勉強環境作成

もしあなたが突然、「明日からJUNOSで大規模ネットワーク頑張れ」となった場合、JUNOSを使ったネットワークのお勉強の選択肢はだいたい3つくらいあると思います。

・JUNOS o GNS3(エミュレータ) を使う
・仮想化環境で vMX or vSRX を使う
・実機でオラオラ

今回は AWS 上に vMX を起動して、logical system の機能を使ってネットワークのお勉強できまっせ！というご紹介をします。

# はじめに

vMX は Juniper Networks 製の仮想ルータです。Vyatta みたいなものですが、BGP/MPLS などを初めとしたかなり豊富な機能に対応しています。
logical system とは、すごく乱暴に言うとルータの中に仮想的にルータを作るような機能のことです。vMX では最大15個まで作成できるので、そこそこの規模のネットワークを1つの vMX 内に構成できます。
私が思うこの勉強法のメリットとしては、

・AWS を利用するのでしょっぼい PC でも勉強可能
・実機が要らないので部屋が狭くてもオッケー
・MX シリーズの JUNOS を使うのでかなり込み入った機能も検証可能
・イメージファイルの入手が不要

などかと思います。個人的には、ブラウザとターミナルツールだけで準備が完結するのが魅力です。
デメリットとしては、低レイヤ(L2 等)の機能の多くは実現ができない、EC2 インスタンス利用料がかかるなどでしょうか。
特に L2 周りの検証をガッツリやりたい場合には他の方法を検討する必要があります。
お金に関しては、必要な時だけインスタンスを起動するようにすればそんなにはかかりません。

### 想定読者
・ネットワークのお勉強をしたいひと
・JUNOSの操作の初歩の初歩がわかっている人

# vMX インスタンスの作成
下記の手順で vMX インスタンスを作成できます。(ほとんど AWS の操作ですが、、)

EC2 ダッシュボード画面でインスタンスの作成をクリックします。
AWS Marketplace で vMX Virtual Router(BYOL)を選択します。
BYOL版でないとライセンス費用が別途かかるので注意してください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/181140/99a6f67f-f386-5ce3-4abf-c6f50478fd04.jpeg" width=75%>

次のような画面がでますが、ここは Continue をクリックしてください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/181140/05d27fe5-f79a-63a5-758b-04ae4c56e4c4.jpeg" width=75%>

インスタンスタイプを選択します。
通常利用では要求するスループットに応じてスペックを上げる必要がありますが、今回は外部との通信はほぼ無いので選択可能な内で最も低いスペックのインスタンスタイプを選択します。
それでも m4.xlarge とけっこうでかいので、使わないときはインスタンスは停止するようにしましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/181140/d3b6433f-bf04-e975-86e0-fc194fd0b045.jpeg" width=75%>

インスタンスの詳細設定では必要な数のインターフェースをアタッチします。
といっても管理用ポート(fxp0)だけでいいのですが、なぜかもう一つアタッチしないと vFP が起動しないようだったのでもう一つアタッチします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/181140/95a607e2-6575-07e9-351b-7793d3122b87.jpeg" width=75%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/181140/2d69d01b-e339-0301-b946-47a94397a8bf.jpeg" width=75%>

ストレージやセキュリティグループは良しなに設定して起動します。
なぜか初回起動時は、起動完了までにかなりの時間を要しますので、気長に待ちます。(20~30分くらい)

立ち上がったら、外部からアクセスするために Elastic IP アドレスをインスタンスの eth0 に関連付けてください。
これで vMX インスタンス作成は完了です。

# vMX へのアクセス
起動直後は、jnpr というユーザ名で SSH アクセスします。
ターミナルツールを使って、作成時に指定した鍵でグローバル IP アドレスにアクセスします。

```bash
$ ssh jnpr@xx.xx.xx.xx -i .ssh/vmx.pem
```

# vMXの設定概要
vMX に対して投入するコンフィグの説明をします。

### 一般設定
vMX にリモートで接続して利用するにあたっての最低限のコンフィグを投入します。

・root パスワード設定
デフォルトでは設定されていないので設定します。(これをしないと commit が通りません)

```
[edit]
jnpr# set system root-authentication plain-text-password
New password:   <<< パスワード入力
Retype new password:   <<< パスワード再入力

[edit]
jnpr# commit
```


・network-services モードの変更
vMX で変更が必要なのかわかりませんが、一応 network-service モードは enhanced-ip にしておきます。

```
[edit]
jnpr# set chassis network-services enhanced-ip

[edit]
jnpr# commit
```


・評価用ライセンスの投入
[Juniper 公式サイト](https://www.juniper.net/us/en/dm/free-vmx-trial/)から60日間の評価版ライセンスキーを取得して、vMX 投入します。

```
jnpr> request system license add terminal
[Type ^D at a new line to end input,
 enter blank line between each license key]

###
ここにライセンスキー張り付けて Ctl + D 
###

E435890758: successfully added
add license complete (no errors)

jnpr> show system license
License usage:
                                 Licenses     Licenses    Licenses    Expiry
  Feature name                       used    installed      needed
  scale-subscriber                      0           10           0    permanent
  scale-l2tp                            0         1000           0    permanent
  scale-mobile-ip                       0         1000           0    permanent
  VMX-BANDWIDTH                    500000       500000           0    18 days
  VMX-SCALE                             3            3           0    18 days
  vmx-subscriber-accounting             0            1           0    60 days
  vmx-subscriber-authentication         0            1           0    60 days
  vmx-subscriber-address-assignment        0         1           0    60 days
  vmx-service-dc                        0            1           0    60 days
  vmx-service-accounting                0            1           0    60 days
  vmx-subscriber-secure-policy          0            1           0    60 days
  vmx-service-qos                       0            1           0    60 days
  vmx-service-ancp                      0            1           0    60 days
  vmx-service-cbsp                      0            1           0    60 days

Licenses installed:
  License identifier: E435890758
  License version: 4
  Software Serial Number: 20180209
  Customer ID: vMX-JuniperEval
  Features:
    vmx-bandwidth-500g - vmx-bandwidth-500g
      count-down, Original validity: 60 days
    vmx-feature-premium - vmx-feature-premium
      count-down, Original validity: 60 days

```

検証するだけならあとは基本的にデフォルトのままで良いと思います。
必要に応じて syslog や ログインユーザの追加等を変更ください。

### Logical system の設定
Logical system を有効化するのは非常に簡単で、単に普通の JUNOS のコンフィグを [edit logical-systems XXX] という階層の配下で実施するだけです。
これで各種のプロセスが分離されるので、あたかも仮想的に内部にルータを作ったかのように扱えます。

```
jnpr> configure
Entering configuration mode

[edit]
jnpr# edit logical-systems Router1

[edit logical-systems Router1]
jnpr#
```

プロンプトが [edit logical-systems Router1] のようになっているので、ここで各種コンフィグを投入していきます。

### Logical Tunnel インターフェースの設定
Logical system の作成は難しくないですが、Logical system 同士を接続するには少し普通と違うやり方を知る必要があります。これを実現するには、ルータの内部に仮想的なインターフェースをこしらえて、それらを使って接続する必要があります。
この用途で使う仮想的なインターフェースは Logical Tunnel インターフェースと呼ばれるもので、JUNOS では lt-x/x/x と表示されます。
これを利用するためにはまず、下記のコマンドで vMX で Tunnel サービスを有効化します。

```
[edit]
jnpr# set chassis fpc 0 pic 0 tunnel-services bandwidth 1g

[edit]
jnpr# commit
```

こうすることで、vMX上に lt インターフェースを作成することができます。

```
jnpr> show interfaces terse
Interface               Admin Link Proto    Local                 Remote
ge-0/0/0                up    up
...(中略)...
lt-0/0/10               up    up
```

次に Logical system 配下で lt インターフェースを設定します。
lt インターフェースの論理 unit を分割して、それ自体を1つのインターフェースと見たたて利用することができます。
例えば次のように設定します。

```
[edit]
jnpr# edit logical-systems Router1

[edit logical-systems Router1]
jnpr# set interfaces lt-0/0/10 unit 10 encapsulation ethernet

[edit logical-systems Router1]
jnpr# set interfaces lt-0/0/10 unit 10 peer-unit 11 family inet address 10.0.0.0/31

[edit logical-systems Router1]
jnpr# commit
commit complete
```

注意点として、必ず encapsulation と peer-unit(対抗インターフェースの指定) の設定をする必要があります。
設定が有効化されると、新しい仮想インターフェースが作成されます。

```
[edit logical-systems Router1]
jnpr# run show interfaces terse |match lt
lt-0/0/10               up    up
lt-0/0/10.10            up    down inet     10.0.0.0/31
```

例えば、2台のLogical system 同士を接続して Ping 打ってみるまでをやると次のようになります。

```
[edit]
jnpr# edit logical-systems Router1

[edit logical-systems Router1]
jnpr# set interfaces lt-0/0/10 unit 10 encapsulation ethernet

[edit logical-systems Router1]
jnpr# set interfaces lt-0/0/10 unit 10 peer-unit 11 family inet address 10.0.0.0/31

[edit logical-systems Router1]
jnpr# top edit logical-systems Router2

[edit logical-systems Router2]
jnpr# set interfaces lt-0/0/10 unit 11 encapsulation ethernet

[edit logical-systems Router2]
jnpr# set interfaces lt-0/0/10 unit 11 peer-unit 10 family inet address 10.0.0.1/31

[edit logical-systems Router2]
jnpr# commit
commit complete

[edit logical-systems Router2]
jnpr# run ping 10.0.0.1 logical-system Router1
PING 10.0.0.1 (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: icmp_seq=0 ttl=62 time=24.111 ms
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=1.085 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=1.062 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=1.255 ms
^C
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.062/6.878/24.111/9.950 ms

```

### 設定例

参考に、ルータ4台で L3VPN 構成の動作確認をした際の設定例を下記にコピペします。
こんな感じでL3以上の機能ならかなり色々遊べるので、ネットワークのお勉強を手を動かしてやりたいという人にはお勧めできるのではと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/181140/9156d750-f4c1-13e8-c99d-7d8a0199c905.png" width=75%>

```
[edit]
jnpr@ip-172-31-5-127# show logical-systems | display set

# P1 ルータの設定
set logical-systems P1 interfaces lt-0/0/10 unit 1 encapsulation ethernet
set logical-systems P1 interfaces lt-0/0/10 unit 1 peer-unit 0
set logical-systems P1 interfaces lt-0/0/10 unit 1 family inet address 10.0.0.1/31
set logical-systems P1 interfaces lt-0/0/10 unit 1 family mpls
set logical-systems P1 interfaces lt-0/0/10 unit 2 encapsulation ethernet
set logical-systems P1 interfaces lt-0/0/10 unit 2 peer-unit 3
set logical-systems P1 interfaces lt-0/0/10 unit 2 family inet address 10.0.0.2/31
set logical-systems P1 interfaces lt-0/0/10 unit 2 family mpls
set logical-systems P1 interfaces lo0 unit 2 family inet address 10.255.255.2/32
set logical-systems P1 protocols mpls interface lt-0/0/10.1
set logical-systems P1 protocols mpls interface lt-0/0/10.2
set logical-systems P1 protocols bgp family inet-vpn unicast
set logical-systems P1 protocols bgp group internal type internal
set logical-systems P1 protocols bgp group internal local-address 10.255.255.2
set logical-systems P1 protocols bgp group internal neighbor 10.255.255.1
set logical-systems P1 protocols bgp group internal neighbor 10.255.255.3
set logical-systems P1 protocols bgp group internal neighbor 10.255.255.4
set logical-systems P1 protocols ospf area 0.0.0.0 interface lt-0/0/10.1 interface-type p2p
set logical-systems P1 protocols ospf area 0.0.0.0 interface lo0.2
set logical-systems P1 protocols ospf area 0.0.0.0 interface lt-0/0/10.2 interface-type p2p
set logical-systems P1 protocols ldp interface lt-0/0/10.1
set logical-systems P1 protocols ldp interface lt-0/0/10.2
set logical-systems P1 routing-options router-id 10.255.255.2
set logical-systems P1 routing-options autonomous-system 65000

# P2 ルータの設定
set logical-systems P2 interfaces lt-0/0/10 unit 3 encapsulation ethernet
set logical-systems P2 interfaces lt-0/0/10 unit 3 peer-unit 2
set logical-systems P2 interfaces lt-0/0/10 unit 3 family inet address 10.0.0.3/31
set logical-systems P2 interfaces lt-0/0/10 unit 3 family mpls
set logical-systems P2 interfaces lt-0/0/10 unit 4 encapsulation ethernet
set logical-systems P2 interfaces lt-0/0/10 unit 4 peer-unit 5
set logical-systems P2 interfaces lt-0/0/10 unit 4 family inet address 10.0.0.4/31
set logical-systems P2 interfaces lt-0/0/10 unit 4 family mpls
set logical-systems P2 interfaces lo0 unit 3 family inet address 10.255.255.3/32
set logical-systems P2 protocols mpls interface lt-0/0/10.3
set logical-systems P2 protocols mpls interface lt-0/0/10.4
set logical-systems P2 protocols bgp family inet-vpn unicast
set logical-systems P2 protocols bgp group internal type internal
set logical-systems P2 protocols bgp group internal local-address 10.255.255.3
set logical-systems P2 protocols bgp group internal neighbor 10.255.255.1
set logical-systems P2 protocols bgp group internal neighbor 10.255.255.2
set logical-systems P2 protocols bgp group internal neighbor 10.255.255.4
set logical-systems P2 protocols ospf area 0.0.0.0 interface lt-0/0/10.3 interface-type p2p
set logical-systems P2 protocols ospf area 0.0.0.0 interface lo0.3
set logical-systems P2 protocols ospf area 0.0.0.0 interface lt-0/0/10.4 interface-type p2p
set logical-systems P2 protocols ldp interface lt-0/0/10.3
set logical-systems P2 protocols ldp interface lt-0/0/10.4
set logical-systems P2 routing-options router-id 10.255.255.3
set logical-systems P2 routing-options autonomous-system 65000

# PE1 ルータの設定
set logical-systems PE1 interfaces lt-0/0/10 unit 0 encapsulation ethernet
set logical-systems PE1 interfaces lt-0/0/10 unit 0 peer-unit 1
set logical-systems PE1 interfaces lt-0/0/10 unit 0 family inet address 10.0.0.0/31
set logical-systems PE1 interfaces lt-0/0/10 unit 0 family mpls
set logical-systems PE1 interfaces lt-0/0/10 unit 10 encapsulation ethernet
set logical-systems PE1 interfaces lt-0/0/10 unit 10 peer-unit 11
set logical-systems PE1 interfaces lt-0/0/10 unit 10 family inet address 10.0.0.9/30
set logical-systems PE1 interfaces lo0 unit 1 family inet address 10.255.255.1/32
set logical-systems PE1 protocols mpls interface lt-0/0/10.0
set logical-systems PE1 protocols bgp family inet-vpn unicast
set logical-systems PE1 protocols bgp group internal type internal
set logical-systems PE1 protocols bgp group internal local-address 10.255.255.1
set logical-systems PE1 protocols bgp group internal export test
set logical-systems PE1 protocols bgp group internal neighbor 10.255.255.2
set logical-systems PE1 protocols bgp group internal neighbor 10.255.255.3
set logical-systems PE1 protocols bgp group internal neighbor 10.255.255.4
set logical-systems PE1 protocols ospf area 0.0.0.0 interface lt-0/0/10.0 interface-type p2p
set logical-systems PE1 protocols ospf area 0.0.0.0 interface lo0.1
set logical-systems PE1 protocols ldp interface lt-0/0/10.0
set logical-systems PE1 policy-options policy-statement test term 1 from protocol static
set logical-systems PE1 policy-options policy-statement test term 1 then accept
set logical-systems PE1 routing-instances VRF1 instance-type vrf
set logical-systems PE1 routing-instances VRF1 interface lt-0/0/10.10
set logical-systems PE1 routing-instances VRF1 route-distinguisher 65000:1
set logical-systems PE1 routing-instances VRF1 vrf-target target:65000:1
set logical-systems PE1 routing-instances VRF1 protocols bgp group CE type external
set logical-systems PE1 routing-instances VRF1 protocols bgp group CE neighbor 10.0.0.10 peer-as 100
set logical-systems PE1 routing-options router-id 10.255.255.1
set logical-systems PE1 routing-options autonomous-system 65000

# PE2 ルータの設定
set logical-systems PE2 interfaces lt-0/0/10 unit 5 encapsulation ethernet
set logical-systems PE2 interfaces lt-0/0/10 unit 5 peer-unit 4
set logical-systems PE2 interfaces lt-0/0/10 unit 5 family inet address 10.0.0.5/31
set logical-systems PE2 interfaces lt-0/0/10 unit 5 family mpls
set logical-systems PE2 interfaces lt-0/0/10 unit 20 encapsulation ethernet
set logical-systems PE2 interfaces lt-0/0/10 unit 20 peer-unit 21
set logical-systems PE2 interfaces lt-0/0/10 unit 20 family inet address 10.0.0.21/30
set logical-systems PE2 interfaces lo0 unit 4 family inet address 10.255.255.4/32
set logical-systems PE2 protocols mpls interface lt-0/0/10.5
set logical-systems PE2 protocols bgp family inet-vpn unicast
set logical-systems PE2 protocols bgp group internal type internal
set logical-systems PE2 protocols bgp group internal local-address 10.255.255.4
set logical-systems PE2 protocols bgp group internal export test
set logical-systems PE2 protocols bgp group internal neighbor 10.255.255.1
set logical-systems PE2 protocols bgp group internal neighbor 10.255.255.2
set logical-systems PE2 protocols bgp group internal neighbor 10.255.255.3
set logical-systems PE2 protocols ospf area 0.0.0.0 interface lo0.4
set logical-systems PE2 protocols ospf area 0.0.0.0 interface lt-0/0/10.5 interface-type p2p
set logical-systems PE2 protocols ldp interface lt-0/0/10.5
set logical-systems PE2 policy-options policy-statement test term 1 from protocol static
set logical-systems PE2 policy-options policy-statement test term 1 then accept
set logical-systems PE2 routing-instances VRF1 instance-type vrf
set logical-systems PE2 routing-instances VRF1 interface lt-0/0/10.20
set logical-systems PE2 routing-instances VRF1 route-distinguisher 65000:1
set logical-systems PE2 routing-instances VRF1 vrf-target target:65000:1
set logical-systems PE2 routing-instances VRF1 protocols bgp group CE type external
set logical-systems PE2 routing-instances VRF1 protocols bgp group CE neighbor 10.0.0.22 peer-as 100
set logical-systems PE2 routing-options router-id 10.255.255.4
set logical-systems PE2 routing-options autonomous-system 65000

# カスタマールータ見立ての routing-instance の設定
[edit]
jnpr@ip-172-31-5-127# show routing-instances | display set
set routing-instances CE1 instance-type virtual-router
set routing-instances CE1 interface lt-0/0/10.11
set routing-instances CE1 interface lo0.10
set routing-instances CE1 routing-options static route 0.0.0.0/0 next-hop 10.0.0.9
set routing-instances CE1 routing-options router-id 10.255.255.10
set routing-instances CE1 routing-options autonomous-system 100
set routing-instances CE1 protocols bgp group external type external
set routing-instances CE1 protocols bgp group external export ce1-export
set routing-instances CE1 protocols bgp group external neighbor 10.0.0.9 peer-as 65000
set routing-instances CE2 instance-type virtual-router
set routing-instances CE2 interface lt-0/0/10.21
set routing-instances CE2 interface lo0.20
set routing-instances CE2 routing-options static route 0.0.0.0/0 next-hop 10.0.0.21
set routing-instances CE2 routing-options router-id 10.255.255.20
set routing-instances CE2 routing-options autonomous-system 100
set routing-instances CE2 protocols bgp group external type external
set routing-instances CE2 protocols bgp group external export ce2-export
set routing-instances CE2 protocols bgp group external neighbor 10.0.0.21 peer-as 65000
```