Juniper MXを試してみたいが実機がないのでvMXでやってみる

17 min read読了の目安(約15600字

三行まとめ

今回はやや中途半端なエントリなので、三行まとめを先に:

  1. AWSでvMXを動かしてみた
  2. マネジメントのインターフェースに加えて、WANポートが一つまでだと問題なく動いた[1]
  3. 二つ目のWANポートをVMにattachするとWANポートが動かなくなる

WANポート複数動かす方法ご存知の方がいたら教えてください!

参考にした手順

https://www.juniper.net/documentation/us/en/software/vmx/vmx-aws/topics/concept/vmx-aws-overview.html

構成図

2台のvMX(J1とJ2)を二つのネットワークで繋ぐ。それぞれにマネジメントネットワークも。

           │                           │
          Mgmt                       Mgmt
           │                           │
   ┌───────┴───────┐           ┌───────┴───────┐
   │      P0       │  J1-J2-1  │       P0      │
   │          J1_P1├───────────┤J2_P1          │
   │               │           │               │
   │          J1_P2├───────────┤J2_P2          │
   │               │  J1-J2-2  │               │
   └───────────────┘           └───────────────┘
         J1                           J2

設定の流れ

設定の流れは以下のようになります。ほとんどがAWS側の手順です。

  1. 公開鍵のインポートなど、EC2使うのに共通的な設定
  2. VPCをつくって、CIDRブロックを決める
  3. 上記のCIDRブロックを分割してサブネットをつくる
  4. Internet Gatewayをつくる
  5. ネットワークインターフェースをつくる
  6. ネットワークインターフェースにIPアドレスを付与
  7. VMをラウンチ
  8. SSHする
  9. JUNOSでWANのIPアドレスを設定
  10. REST APIを設定

1. 公開鍵のインポート

AWSコンソールで EC2 > Key pairs > Import key pair でインポートしておく

2. VPCをつくる

VPC > Your VPCs > Create VPCにてVPCを作って、そのVPCで使うCIDRブロックとして10.0.0.0/16を割り当ておいた

3. サブネットをつくる

VPC > Subnets> Create subnet で以下のサブネットを作成

Name	Subnet
Mgmt	10.0.0.0/24 # いらなかった
J1-J1-1	10.0.1.0/24 
J1-J2-2	10.0.2.0/24 

マネジメントのインターフェース(fxp0)はインスタンス作成時につくられて、IPが振られるのでここでは作らなくてもよかったみたい

4. インターネット・ゲートウェイ

そとからvMXにアクセスするために必要

VPC > Internet gateways > Create internet gatewayでGWを作る
VPC > Internet gateways > Actionsボタンにて、上記のGWをVPCにAttach
VPC > Route Tables > Routesタブにて、デフォルトルート0.0.0.0/0をInternet Gatewayにむける

5. ネットワークインターフェースをつくる

EC2 > Network interfaces > Create network interface

作る時には、Descriptionにスイッチ名を入れておくべき。int1とかだと、どのスイッチのものかわからなくなる。また、Mgmtもスイッチの数分追加しておくことになる。

ひとまず試しに以下のインターフェースを作成して、それぞれサブネットをさっき作ったものに紐付ける

J1_Mgmt
J1_P1
J1_P2
J2_P1
J2_P2

参考にしているドキュメントには以下のように書かれているが、最近AWSのコンソールが変わったようで、Web intercaceでも、二つ以上のインターフェースをインスタンスに割り当てることができるようになっている

NOTE: You can only associate two interfaces when creating the EC2 instance using the Web interface. You must have at least one WAN interface.

ついでに、Network interfaces > Actions > Change source/dest. check
にてDisableにする。何をやっているかというと...

Source/destination checking
You can enable or disable source/destination checks, which ensure that the instance is either the source or the destination of any traffic that it receives. Source/destination checks are enabled by default. You must disable source/destination checks if the instance runs services such as network address translation, routing, or firewalls.

ということらしい

6. ネットワーク・インターフェースにElastic IPを付与する

あとで書くように、VM起動時にAuto-assign Public IPを指定しておけばいらないかもしれないが、マネジメントのインターフェースにElastic IPをつける場合は以下。Elastic IPはAllocateしてからAccociateする。

Allocate:

VPC > Elastic IP addresses > Allocate Elastic IP address

Accociate:

VPC > Elastic IP addresses > ***.***.***.*** > Associate Elastic IP address

7. VMをラウンチ

ドキュメントには以下のようにあるので、ひとまず、C5.2xlargeを選択してすすめる。

You can create following types of instances on AWS:
• m4.4xlarge
• C4.2xlarge
• C5.2xlarge and C5.4xlarge (from Junos OS Release 19.4R1 onwards)

AMIをvmxで検索して、コミュニティイメージの方から以下を選択

vmx-nested-19.4R1.9-c8e2662f-22aa-4cd4-99fe-90a1606d0970-ami-04c93b2ff5fe2f974.4

オフィシャルイメージの方がいいのかな...

以下のようにインスタンスを立ち上げる時に、Instance Detailsでさっき作ったVPCを指定する。またセキュリティグループはVPC毎に管理されているようなので、VPCを選んだ時点で、そのVPCに割り当てられたセキュリティグループしか選べない

セキュリティグループはマネジメントインターフェースはMy IPからのみ許可するやつを作って割り当て。WANインターフェースは通信できなくなりそうなので、defaultのフルオープンのものにしておいた

初めてのvMXのラウンチで怒られた。リソースのvalidateが必要らしい。

Launch Failed
Your request for accessing resources in this region is being validated, and you will not be able to launch additional resources in this region until the validation is complete. We will notify you by email once your request has been validated. While normally resolved within minutes, please allow up to 4 hours for this process to complete. If the issue still persists, please let us know by writing to aws-verification@amazon.com for further assistance.

しばらく待てばいいのか? > 10minくらいで、Acceptのメールきた

これでとりあえず立ち上がった

8. SSHしてみる

ssh jnpr@<ip-address>

これでJUNOSのシェルはつかえるようになった

$ ssh jnpr@<IP-address>
Last login: Sat Apr  3 00:56:31 2021 from <ip-address>
--- JUNOS 19.4R1.9 Kernel 64-bit  JNPR-11.0-20191115.14c2ad5_buil
jnpr@ip-10-0-0-140> show version   
Hostname: ip-10-0-0-140
Model: vmx
Junos: 19.4R1.9
JUNOS OS Kernel 64-bit  [20191115.14c2ad5_builder_stable_11]
JUNOS OS libs [20191115.14c2ad5_builder_stable_11]
JUNOS OS runtime [20191115.14c2ad5_builder_stable_11]
JUNOS OS time zone information [20191115.14c2ad5_builder_stable_11]
JUNOS network stack and utilities [20191213.231146_builder_junos_194_r1]
JUNOS libs [20191213.231146_builder_junos_194_r1]
JUNOS OS libs compat32 [20191115.14c2ad5_builder_stable_11]
JUNOS OS 32-bit compatibility [20191115.14c2ad5_builder_stable_11]
JUNOS libs compat32 [20191213.231146_builder_junos_194_r1]
JUNOS runtime [20191213.231146_builder_junos_194_r1]
JUNOS Packet Forwarding Engine Simulation Package [20191213.231146_builder_junos_194_r1]
JUNOS sflow mx [20191213.231146_builder_junos_194_r1]
JUNOS py extensions2 [20191213.231146_builder_junos_194_r1]
JUNOS py extensions [20191213.231146_builder_junos_194_r1]
JUNOS py base2 [20191213.231146_builder_junos_194_r1]
JUNOS py base [20191213.231146_builder_junos_194_r1]
JUNOS OS vmguest [20191115.14c2ad5_builder_stable_11]
JUNOS OS crypto [20191115.14c2ad5_builder_stable_11]
JUNOS na telemetry [19.4R1.9]
JUNOS mx libs compat32 [20191213.231146_builder_junos_194_r1]
JUNOS mx runtime [20191213.231146_builder_junos_194_r1]
JUNOS RPD Telemetry Application [19.4R1.9]
Redis [20191213.231146_builder_junos_194_r1]
JUNOS common platform support [20191213.231146_builder_junos_194_r1]
JUNOS Openconfig [19.4R1.9]
JUNOS mtx network modules [20191213.231146_builder_junos_194_r1]
JUNOS modules [20191213.231146_builder_junos_194_r1]
JUNOS mx modules [20191213.231146_builder_junos_194_r1]
JUNOS mx libs [20191213.231146_builder_junos_194_r1]
JUNOS SQL Sync Daemon [20191213.231146_builder_junos_194_r1]
JUNOS mtx Data Plane Crypto Support [20191213.231146_builder_junos_194_r1]
JUNOS daemons [20191213.231146_builder_junos_194_r1]
JUNOS mx daemons [20191213.231146_builder_junos_194_r1]
JUNOS appidd-mx application-identification daemon [20191213.231146_builder_junos_194_r1]
JUNOS Simulation Linux Package [20191213.231146_builder_junos_194_r1]
JUNOS Simulation Package [20191213.231146_builder_junos_194_r1]
JUNOS Simulation Package [20191213.231146_builder_junos_194_r1]
JUNOS Services URL Filter package [20191213.231146_builder_junos_194_r1]
JUNOS Services TLB Service PIC package [20191213.231146_builder_junos_194_r1]
JUNOS Services Telemetry [20191213.231146_builder_junos_194_r1]
JUNOS Services TCP-LOG [20191213.231146_builder_junos_194_r1]
JUNOS Services SSL [20191213.231146_builder_junos_194_r1]
JUNOS Services SOFTWIRE [20191213.231146_builder_junos_194_r1]
JUNOS Services Stateful Firewall [20191213.231146_builder_junos_194_r1]
JUNOS Services RTCOM [20191213.231146_builder_junos_194_r1]
JUNOS Services RPM [20191213.231146_builder_junos_194_r1]
JUNOS Services PCEF package [20191213.231146_builder_junos_194_r1]
JUNOS Services NAT [20191213.231146_builder_junos_194_r1]
JUNOS Services Mobile Subscriber Service Container package [20191213.231146_builder_junos_194_r1]
JUNOS Services MobileNext Software package [20191213.231146_builder_junos_194_r1]
JUNOS Services Logging Report Framework package [20191213.231146_builder_junos_194_r1]
JUNOS Services LL-PDF Container package [20191213.231146_builder_junos_194_r1]
JUNOS Services Jflow Container package [20191213.231146_builder_junos_194_r1]
JUNOS Services Deep Packet Inspection package [20191213.231146_builder_junos_194_r1]
JUNOS Services IPSec [20191213.231146_builder_junos_194_r1]
JUNOS Services IDS [20191213.231146_builder_junos_194_r1]
JUNOS IDP Services [20191213.231146_builder_junos_194_r1]
JUNOS Services HTTP Content Management package [20191213.231146_builder_junos_194_r1]
JUNOS Services Crypto [20191213.231146_builder_junos_194_r1]
JUNOS Services Captive Portal and Content Delivery Container package [20191213.231146_builder_junos_194_r1]
JUNOS Services COS [20191213.231146_builder_junos_194_r1]
JUNOS AppId Services [20191213.231146_builder_junos_194_r1]
JUNOS Services Application Level Gateways [20191213.231146_builder_junos_194_r1]
JUNOS Services AACL Container package [20191213.231146_builder_junos_194_r1]
JUNOS Extension Toolkit [20191213.231146_builder_junos_194_r1]
JUNOS Juniper Malware Removal Tool (JMRT) [1.0.0+20191213.231146_builder_junos_194_r1]
JUNOS J-Insight [20191213.231146_builder_junos_194_r1]
JUNOS Online Documentation [20191213.231146_builder_junos_194_r1]
JUNOS jail runtime [20191115.14c2ad5_builder_stable_11]
JUNOS FIPS mode utilities [20191213.231146_builder_junos_194_r1]

9. WANポートの設定

EC2 > Network interfaces からさっき作ったネットワーク・インターフェースを選択して、vMXインスタンスに割り当てる。まずはJ1_P1J2_P1のみをattachして、インスタンスを再起動

ここで、VMのインターフェースにPrivate IPが振られる

10. JunosにてWANのIPを設定

一つ目のインターフェースをVMにattachした時点で、10個のポートge-0/0/0からge-0/0/9が現れる

jnpr@ip-10-0-0-140> show interfaces terse | find ge 
ge-0/0/0                up    up
ge-0/0/0.0              up    up   inet     10.0.1.241/24   
                                   multiservice
lc-0/0/0                up    up
lc-0/0/0.32769          up    up   vpls    
pfe-0/0/0               up    up
pfe-0/0/0.16383         up    up   inet    
                                   inet6   
pfh-0/0/0               up    up
pfh-0/0/0.16383         up    up   inet    
pfh-0/0/0.16384         up    up   inet    
ge-0/0/1                up    down
ge-0/0/1.0              up    down
ge-0/0/2                up    down
ge-0/0/2.16386          up    down
ge-0/0/3                up    down
ge-0/0/3.16386          up    down
ge-0/0/4                up    down
ge-0/0/4.16386          up    down
ge-0/0/5                up    down
ge-0/0/5.16386          up    down
ge-0/0/6                up    down
ge-0/0/6.16386          up    down
ge-0/0/7                up    down
ge-0/0/7.16386          up    down
ge-0/0/8                up    down
ge-0/0/8.16386          up    down
ge-0/0/9                up    down
ge-0/0/9.16386          up    down
cbp0                    up    up
demux0                  up    up
dsc                     up    up
em1                     up    up
em1.0                   up    up   inet     10.0.0.4/8      
                                            128.0.0.1/2     
                                            128.0.0.4/2     
                                   inet6    fe80::5254:ff:fe12:bdfe/64
                                            fec0::a:0:0:4/64
                                   tnp      0x4             
esi                     up    up
fti0                    up    up
fti1                    up    up
fti2                    up    up
fti3                    up    up
fti4                    up    up
fti5                    up    up
fti6                    up    up
fti7                    up    up
fxp0                    up    up
fxp0.0                  up    up   inet     10.0.0.140/24   
gre                     up    up
ipip                    up    up
irb                     up    up
jsrv                    up    up
jsrv.1                  up    up   inet     128.0.0.127/2   
lo0                     up    up
lo0.16384               up    up   inet     127.0.0.1           --> 0/0
lo0.16385               up    up   inet    
lsi                     up    up
mif                     up    up
mtun                    up    up
pimd                    up    up
pime                    up    up
pip0                    up    up
pp0                     up    up
rbeb                    up    up
tap                     up    up
vtep                    up    up

JUNOSにログインして、VMに振られたものと同じPrivate IPを設定する。ge-0/0/0を指定しているが、他のポートでもいいはず。J1_P1J2_P1に同様に実施

jnpr@ip-10-0-0-140> configure 
Entering configuration mode
[edit]
jnpr@ip-10-0-0-140# set interfaces ge-0/0/0 unit 0 family inet address 10.0.1.241/24
jnpr@ip-10-0-0-140# commit          
commit complete

インターフェース名のge-0/0/0の読み方はtype-fpc/pic/portであり、それぞれの内容は以下。

  • fpc: DPC、FPC、または MPC が設置されているスロット
  • pic: PICが配置されているFPC上のスロット。DPC、MIC、16ポートMPCの場合、PIC値はポートの論理グループであり、プラットフォームにより異なります。
  • port: DPC、PIC、MPC、または MICのポート番号

https://www.juniper.net/documentation/ja/junos/topics/concept/junos-physical-interface-names-mxseries-router.html

https://www.infraeye.com/study/junos10.html

これでPingが通る。そして大抵のドキュメントはここで終わる...

jnpr@ip-10-0-0-140> ping 10.0.1.135 
PING 10.0.1.135 (10.0.1.135): 56 data bytes
64 bytes from 10.0.1.135: icmp_seq=0 ttl=64 time=51.158 ms
64 bytes from 10.0.1.135: icmp_seq=1 ttl=64 time=2.609 ms
64 bytes from 10.0.1.135: icmp_seq=2 ttl=64 time=2.270 ms
^C
--- 10.0.1.135 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 2.270/18.679/51.158/22.967 ms

二つ目のWANインターフェースをAttachすると動かなくなる...

ここで二つ目のWANインターフェースJ1_P2J2_P2をattachすると、J1_P1J2_P1間でのPingが飛ばなくなる。detouchすると通る、という状況に陥る。

VMにインターフェースつれけはAWS上にどんなネットワークでも作れるかと思ったが....二つ以上できないのであればできない...

そもそもAWSでインターフェースを一つattachすると、JUNOS上ではポートが10個できるので、VMのインターフェースはJUNOS上ではPICに対応しているのかもしれない。

となると、AWSのインターフェースとMXのポートは1:多の関係。JUNOS上のコンフィグとVMのネットワークインターフェースを対応づけるパラメータはIPアドレスしかないので、PIC内のポートは一つしか使えないのか?

VMに二つ目のネットワークインターフェースをattachしても、PICは増えないしなぁ...わからん...

11. REST APIを設定する

まけずにREST APIを設定します。

以下で、REST APIが有効になる。公式などでは https を含めた方法が書かれているが、とりあえず http 使うだけなら以下の3行でできる

jnpr@ip-10-0-0-140# set system services rest control allowed-sources <your-client-ip-here>
jnpr@ip-10-0-0-140# set system services rest http port 3000
jnpr@ip-10-0-0-140# set system services rest enable-explorer 

確認してみる

jnpr@ip-10-0-0-140> show configuration system services rest 
http {
    port 3000;
}
control {
    allowed-sources <your-client-ip-here>;
}
enable-explorer;

APIでアクセスするユーザーをつくる

jnpr@ip-10-0-0-140# set system login user apiuser class operator 
jnpr@ip-10-0-0-140# set system login user apiuser authentication plain-text-password 
New password:
Retype new password:

curl でアクセス

 curl -u "user:pass" http://ip-address:port/rpc/get-software-information -H "Content-Type: application/xml" -H "Accept: application/json"

{
    "software-information" : [
    {
        "host-name" : [
        {
            "data" : "vmx-1"
        }
        ], 
        "product-model" : [
        {
            "data" : "vmx"
        }
        ], 
        "product-name" : [
        {
            "data" : "vmx"
        }
        ], 
        "junos-version" : [
        {
            "data" : "18.3X3.2"
        }

     :
     : 長いので省略
     :

        {
            "name" : [
            {
                "data" : "jail-runtime"
            }
            ], 
            "comment" : [
            {
                "data" : "JUNOS jail runtime [20190907.2386fa2_builder_stable_11]"
            }
            ]
        }
        ]
    }
    ]
}

API Explorer

ブラウザで http:/juniper-vmx-ip-address:port/ にアクセスするだけ

image.png

一通り試せる。いろいろできる

脚注
  1. vMXの大抵の情報はここで終わっている。WANポートが一つだとvMXを動かす意味はあるのだろうか? ↩︎