Juniper から無料で利用できる新しいコンテナ版の Junos の cJunosEvolved がリリースされていて、Containerlab の version 0.69 から利用できるようになっていたので、その環境を作ったメモ
▼ cJunosEvolved
▼ Containerlab の version 0.69 のリリースノートの cJunosEvolved 説明部分
今回のやったこと
今回は Ubuntu サーバ上に Containerlab を構築して、cJunosEvolved と freeRouter で SR-MPLS・EVPN を構築してみました
以下の図のように 2 台の cJunosEvolved を EVPN の PE ルータとして利用して、freeRouter は SR-MPLS の P ルータと、エンドエンドの CE ルータとして利用の 3 台利用しています
各バージョンは以下となります
- Ubuntu 24.04.2 LTS
- Containerlab 0.69.0
- cJunosEvolved 25.2R1.8-EVO
- freeRouter-rare v23.10.11-cur
Containerlab
Containerlab とは
ChatGPTさんにざっくり説明したもらった内容は以下のとおりです
- Containerlabはネットワーク機器の仮想ラボ構築ツール
- DockerコンテナやVMでNOSを実行可能
- YAMLでトポロジーを定義し、CLIで操作
-
containerlab deployで簡単にラボ展開・削除が可能 - Juniper・Cisco・Aristaなど複数ベンダーに対応
- CI/CDやIaCとの連携に優れ、再現性のある検証環境が構築可能
Containerlab インストール
こちらのサイトにインストール方法は記載されています
手っ取り早くインストールしたい場合は、以下のコマンド一発で Containerlab と必要なソフトのインストールが完了します
curl -sL https://containerlab.dev/setup | sudo -E bash -s "all"
cJunosEvolved
ダウンロード
以下のサイトからダウンロードできます。無料でかつユーザ登録などもなしで利用できます
ダウンロードサイト内の「Container」-「Docker Tarball - AMD64」をダウンロードしてください
ダウンロード前に出てくる内容を確認・同意の上ダウンロードしてください
Docker イメージを使えるように準備
ダウンロードしたファイルを、Containerlab の Ubuntu サーバに保存し、Ubuntu 上で以下のコマンドを実行すると Docker イメージを使えるようになります
docker image load -i cJunosEvolved-25.2R1.8-EVO.tar.gz
docker imagesコマンドで以下のように表示されれば準備完了です
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cjunosevolved 25.2R1.8-EVO 6748aac28acd 3 weeks ago 2.01GB
Containerlab で cJunosEvolved の動作確認
Containerlab deploy
以下の 3 つの手順で簡単に今回の検証環境の接続とコンフィグが登録された状態で起動してきます
今回の構成やコンフィグを一式 GitHub からダウンロード
git clone --depth=1 https://github.com/katsumi2018/clab-cjunos-freertr-evpn.git
ディレクトリ移動
cd clab-cjunos-freertr-evpn
containerlab deployで検証環境が起動します。
- 初回は、FreeRTR のコンテナのダウンロードが自動で行われます
- FreeRTR は速攻で起動しますが、cJunosEvolved は結構時間がかかります。自分の環境だと 5 分くらいかかりました
containerlab deploy
環境の説明
今回は、以下のようにインターフェースやIPアドレスを設定しています
- ログインのユーザ名とパスワードは、cJunosEvolved・FreeRTR ともに、ユーザ名
admin、パスワードadmin@123としてます - 各インターフェースは、( )で囲まれた文字が Docker 上でのインターフェースで、( )で囲まれていない方が機器にログインしたときのコンフィグ上のインターフェース名
- マネージメントのIPアドレスは
cjunosfreertr.clab.yml内のmgmt-ipv4で指定 - コンフィグについては
cjunosfreertr.clab.ymlの以下の場所でノードごとに指定- cJunosEvolved :
startup-configでファイル指定 - FreeRTR :
bindsの部分でファイルをコンテナ内に読み取り専用(最後に:roをつける)でマウントさせる- Containerlab のこちらの説明では、読み取り専用ではありませんでしたが、自分の環境だと読み取り専用でないとデフォルトのコンフィグに上書きされてしまってうまくコンフィグが読み込まれなかったです
- cJunosEvolved :
cjunosfreertr.clab.yml の内容は以下となります
cjunosfreertr.clab.yml
name: cjunosfreertr
mgmt:
network: clab-mgmt # docker network 名
ipv4-subnet: 172.20.100.0/24
topology:
nodes:
cjunosevo-pe-1:
kind: juniper_cjunosevolved
mgmt-ipv4: 172.20.100.21
image: cjunosevolved:25.2R1.8-EVO
startup-config: cjunosevo-pe-1.cfg
env:
CPTX_COSIM: "BT"
cjunosevo-pe-2:
kind: juniper_cjunosevolved
mgmt-ipv4: 172.20.100.22
image: cjunosevolved:25.2R1.8-EVO
startup-config: cjunosevo-pe-2.cfg
env:
CPTX_COSIM: "BT"
freertr-p-1:
kind: rare
mgmt-ipv4: 172.20.100.11
image: ghcr.io/rare-freertr/freertr-containerlab:latest
binds:
- freertr-p-1-sw.txt:/rtr/run/conf/rtr-sw.txt:ro
freertr-ce-1:
kind: rare
mgmt-ipv4: 172.20.100.31
image: ghcr.io/rare-freertr/freertr-containerlab:latest
binds:
- freertr-ce-1-sw.txt:/rtr/run/conf/rtr-sw.txt:ro
freertr-ce-2:
kind: rare
mgmt-ipv4: 172.20.100.32
image: ghcr.io/rare-freertr/freertr-containerlab:latest
binds:
- freertr-ce-2-sw.txt:/rtr/run/conf/rtr-sw.txt:ro
links:
- endpoints: ["freertr-p-1:eth1", "cjunosevo-pe-1:eth4"]
- endpoints: ["freertr-p-1:eth2", "cjunosevo-pe-2:eth4"]
- endpoints: ["cjunosevo-pe-1:eth5", "freertr-ce-1:eth1"]
- endpoints: ["cjunosevo-pe-2:eth5", "freertr-ce-2:eth1"]
各機器のコンフィグは、以下を参照
動作確認
ssh admin@172.20.100.31 で freertr-ce-1 に SSH ログイン(パスワードはadmin@123)して、freertr-ce-2 のアドレスに PING (ping 192.168.0.1 vrf CORE) を打って、EVPNを経由してPING疎通できることを確認
freertr-ce-1# ping 192.168.0.2 vrf CORE
pinging 192.168.0.2, src=null, vrf=CORE, cnt=5, len=64, df=false, tim=1000, gap=0, ttl=255, tos=0, sgt=0, flow=0, fill=0, alrt=-1, sweep=false, multi=false
!!!!!
result=100.0%, recv/sent/lost/err=5/5/0/0, took 8, min/avg/max/dev rtt=1/1.6/2/0.2, ttl 255/255/255/0.0, tos 0/0.0/0/0.0
freertr-ce-1#
次に、ssh admin@172.20.100.21 で cjunosevo-pe-1 に SSH ログイン(パスワードはadmin@123)して動作確認
MAC アドレスが、EVPN で学習できていることを確認
admin@cjunosevo-pe-1> show mac-vrf forwarding mac-table
MAC flags (S - static MAC, D - dynamic MAC, L - locally learned, P - Persistent static, C - Control MAC
SE - statistics enabled, NM - non configured MAC, R - remote PE MAC, O - ovsdb MAC
GBP - group based policy, B - Blocked MAC)
Ethernet switching table : 2 entries, 2 learned
Routing instance : EVPN_MACVRF_100
Vlan MAC MAC Age GBP Logical NH MAC RTR
name address flags Tag interface Index property ID
VLAN100 aa:c1:ab:18:c4:e4 D - et-0/0/1.100 0 0
VLAN100 aa:c1:ab:67:bf:e0 DC - 8032 8032
MP-BGP で peer が接続できていることを確認
admin@cjunosevo-pe-1> show bgp summary
Warning: License key missing; requires 'BGP' license
Threading mode: BGP I/O
Default eBGP mode: advertise - accept, receive - accept
Groups: 1 Peers: 1 Down peers: 0
Table Tot Paths Act Paths Suppressed History Damp State Pending
bgp.evpn.0
5 5 0 0 0 0
Peer AS InPkt OutPkt OutQ Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
10.99.2.1 65000 16 15 0 0 4:13 Establ
bgp.evpn.0: 5/5/5/0
EVPN_MACVRF_100.evpn.0: 5/5/5/0
__default_evpn__.evpn.0: 0/0/0/0
OSPF の SR-MPLS で Node-SID が学習されていることを確認
admin@cjunosevo-pe-1> show ospf spring sid-database
Warning: License key missing; requires 'Segment Routing' license
OSPF database, Area 0.0.0.0
SID Prefix Advertised-by Route-type
1 10.99.0.1/32 10.99.0.1 Intra-Area
11 10.99.1.1/32 10.99.1.1 Intra-Area
21 10.99.2.1/32 10.99.2.1 Intra-Area
終了時の処理
終了してデプロイしたラボを落とす場合は、containerlab destroyで終了できます
containerlab destroy
最後に
今回は、Containerlab で cJunosEvolved を動かしてみました
2 台の cJunosEvolved だと結構メモリを使っていたので、1 台で試したい場合は公式サイトにあるこちらで試してみてもいいかもです
Githubから設定ファイルを落としてcontainerlab deployで速攻で環境つくれるのがすごく便利

