はじめに
GMOコネクトの永田です。
ネットワークトポロジを組んでルーターで遊んでみたい!と、ふと思う時が、みなさんもよくあるかと思います。
仮想ルーターでトポロジーを組むのに便利なツールとしてContainerlabがありますが、「x86_64 Linuxを準備するのが面倒だなー」と思っていました。
最近、macOS(Apple Silicon)上でもcontainerlabが動くよ!(コンテナNOSがARM対応していれば)という話を見かけましたので、試してみました。
手元の開発環境(MacBook M4)でもContainerlabが利用できるなら、debugがとても快適になりますね!
まとめ
- macOS(Apple Silicon)でも、containerlabがお手軽に利用可能
- 稼働させるNOS(Network Operating System)は、ARM64対応のものが必要
Containerlabとは
仮想ネットワークを構築するツールで、ネットワークトポロジーをyamlで定義できます。
トポロジー定義yamlがあれば、誰でもすぐに同じトポロジーを構築できちゃいます!
昔は物理的なルータを購入して結線してと試すのも大変でしたが、便利な時代になりました😊
Containerlabの詳細については、以下の公式ページや記事が参考になります。
macOS上でのContainerlabの実行方法の比較
公式ページにも記載があるのですが、macOS上でContainerlabを実行する方法は3通りあります。
- OrbStackのarm64 Linux VM上で実行
- devcontainerのDocker In Docker (dind)で実行
- devcontainerのDocker Outside Of Docker (dood)で実行
OrbStackの商用利用が有償であることから、devcontainer方式を今回は試します。
今回はその中でもパフォーマンスも良さそうな、Docker Outside Of Docker (dood)を試します。
devcontainer自体については、こちらの記事などを参照してください。
Devcontainerのセットアップ
では、VSCode上でdevcontainerを構築していきます。
試した環境は以下になります。
- MacBook Pro Apple M4 Max メモリ36GB
- VSCode Version: 1.105.0 (Universal)
- Plugin
- Dev Containers: 0.427.0
- Docker Desktop: 4.48.0 (207573)
.devcontainer/devcontainer.json を作成します。
公式doodサンプルを元に以下を修正しています。
- image versionの最新化
- mountsの1行目の削除
- この記載があると起動時エラーとなったため
- こちらのBlog参照
{
"image": "ghcr.io/srl-labs/containerlab/devcontainer-dood-slim:0.71.0",
"runArgs": [
"--network=host",
"--pid=host",
"--privileged"
],
"mounts": [
"type=bind,src=/var/lib/docker,dst=/var/lib/docker",
"type=bind,src=/lib/modules,dst=/lib/modules"
],
"workspaceFolder": "${localWorkspaceFolder}",
"workspaceMount": "source=${localWorkspaceFolder},target=${localWorkspaceFolder},type=bind"
}
この後、VSCode左下の青いアイコン(Open a Remote Window)を押して、「Reopen in Container」を選択すると裏でDockerが起動します。
(初回は docker pull で時間がかかります)
起動したVSCodeのTerminalで、containerlabが利用できれば準備完了です!
❯ containerlab version
____ ___ _ _ _____ _ ___ _ _ _____ ____ _ _
/ ___/ _ \| \ | |_ _|/ \ |_ _| \ | | ____| _ \| | __ _| |__
| | | | | | \| | | | / _ \ | || \| | _| | |_) | |/ _` | '_ \
| |__| |_| | |\ | | |/ ___ \ | || |\ | |___| _ <| | (_| | |_) |
\____\___/|_| \_| |_/_/ \_\___|_| \_|_____|_| \_\_|\__,_|_.__/
version: 0.71.0
commit: 7ef796f07
date: 2025-10-10T17:36:13Z
source: https://github.com/srl-labs/containerlab
rel. notes: https://containerlab.dev/rn/0.71/
シンプルなトポロジーの作成
では、Topologyを組んでいきましょう。
今回は最小サンプルということで、Router(FRRouting)1台に、PC(Linux)2台の構成とします。
トポロジー図
containerlab yaml
-
mini-topo.clab.yml- frrのimageはtag名を明にいれること。省略するとlatestからdocker pullしようとするが、latest tagは存在しないため
name: clab-mini-topo
topology:
nodes:
r1:
kind: linux
image: quay.io/frrouting/frr:10.4.1
binds:
- r1/daemons:/etc/frr/daemons
- r1/frr.conf:/etc/frr/frr.conf
src:
kind: linux
image: praqma/network-multitool:latest
exec:
- "ip link set eth1 up"
- "ip addr add 192.168.1.11/24 dev eth1"
- "ip route add 192.168.0.0/16 via 192.168.1.1 dev eth1"
dst:
kind: linux
image: praqma/network-multitool:latest
exec:
- "ip link set eth1 up"
- "ip addr add 192.168.2.11/24 dev eth1"
- "ip route add 192.168.0.0/16 via 192.168.2.1 dev eth1"
links:
- endpoints: [src:eth1, r1:eth1]
- endpoints: [dst:eth1, r1:eth2]
FRRouting Config
FRRoutingの設定はこちらを参考にしました。
r1/daemons
zebra=yes
bgpd=no
ospfd=yes
ospf6d=no
ripd=no
ripngd=no
isisd=no
pimd=no
ldpd=yes
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
staticd=no
pbrd=no
bfdd=no
fabricd=no
vtysh_enable=yes
zebra_options=" -s 90000000 --daemon -A 127.0.0.1"
bgpd_options=" --daemon -A 127.0.0.1"
ospfd_options=" --daemon -A 127.0.0.1"
ospf6d_options=" --daemon -A ::1"
ripd_options=" --daemon -A 127.0.0.1"
ripngd_options=" --daemon -A ::1"
isisd_options=" --daemon -A 127.0.0.1"
pimd_options=" --daemon -A 127.0.0.1"
ldpd_options=" --daemon -A 127.0.0.1"
nhrpd_options=" --daemon -A 127.0.0.1"
eigrpd_options=" --daemon -A 127.0.0.1"
babeld_options=" --daemon -A 127.0.0.1"
sharpd_options=" --daemon -A 127.0.0.1"
staticd_options=" --daemon -A 127.0.0.1"
pbrd_options=" --daemon -A 127.0.0.1"
bfdd_options=" --daemon -A 127.0.0.1"
fabricd_options=" --daemon -A 127.0.0.1"
r1/frr.conf
frr version 10.4.1_git
frr defaults traditional
hostname router1
no ipv6 forwarding
!
interface eth1
ip address 192.168.1.1/24
!
interface eth2
ip address 192.168.2.1/24
!
interface lo
ip address 10.10.10.1/32
!
line vty
!
containerlabでのデプロイ、疎通確認
❯ containerlab deploy -t mini-topo.clab.yml
23:28:59 INFO Containerlab started version=0.71.0
23:28:59 INFO Parsing & checking topology file=mini-topo.clab.yml
23:28:59 INFO Creating docker network name=clab IPv4 subnet=172.20.20.0/24 IPv6 subnet=3fff:172:20:20::/64 MTU=0
23:28:59 INFO Creating lab directory path=/clab-mini-topo/clab-clab-mini-topo
23:28:59 INFO unable to adjust Labdir file ACLs: operation not supported
23:28:59 INFO Creating container name=src
23:28:59 INFO Creating container name=r1
23:28:59 INFO Creating container name=dst
23:28:59 INFO Created link: src:eth1 ▪┄┄▪ r1:eth1
23:28:59 INFO Created link: dst:eth1 ▪┄┄▪ r1:eth2
23:28:59 INFO Executed command node=src command="ip link set eth1 up" stdout=""
23:28:59 INFO Executed command node=src command="ip addr add 192.168.1.11/24 dev eth1" stdout=""
23:28:59 INFO Executed command node=src command="ip route add 192.168.0.0/16 via 192.168.1.1 dev eth1" stdout=""
23:28:59 INFO Executed command node=dst command="ip link set eth1 up" stdout=""
23:28:59 INFO Executed command node=dst command="ip addr add 192.168.2.11/24 dev eth1" stdout=""
23:28:59 INFO Executed command node=dst command="ip route add 192.168.0.0/16 via 192.168.2.1 dev eth1" stdout=""
23:28:59 INFO Adding host entries path=/etc/hosts
23:28:59 INFO Adding SSH config for nodes path=/etc/ssh/ssh_config.d/clab-clab-mini-topo.conf
You are on the latest version (0.71.0)
╭─────────────────────────┬─────────────────────────────────┬─────────┬───────────────────╮
│ Name │ Kind/Image │ State │ IPv4/6 Address │
├─────────────────────────┼─────────────────────────────────┼─────────┼───────────────────┤
│ clab-clab-mini-topo-dst │ linux │ running │ 172.20.20.3 │
│ │ praqma/network-multitool:latest │ │ 3fff:172:20:20::3 │
├─────────────────────────┼─────────────────────────────────┼─────────┼───────────────────┤
│ clab-clab-mini-topo-r1 │ linux │ running │ 172.20.20.4 │
│ │ quay.io/frrouting/frr:10.4.1 │ │ 3fff:172:20:20::4 │
├─────────────────────────┼─────────────────────────────────┼─────────┼───────────────────┤
│ clab-clab-mini-topo-src │ linux │ running │ 172.20.20.2 │
│ │ praqma/network-multitool:latest │ │ 3fff:172:20:20::2 │
╰─────────────────────────┴─────────────────────────────────┴─────────┴───────────────────╯
3台稼働していれば、デプロイは完了です!
では、src --> dstにpingを試してみましょう。
❯ containerlab exec -t mini-topo.clab.yml --label clab-node-name=src --cmd 'ping -c 4 192.168.2.11'
23:29:42 INFO Parsing & checking topology file=mini-topo.clab.yml
23:29:45 INFO Executed command node=clab-clab-mini-topo-src command="ping -c 4 192.168.2.11"
stdout=
│ PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.
│ 64 bytes from 192.168.2.11: icmp_seq=1 ttl=63 time=0.070 ms
│ 64 bytes from 192.168.2.11: icmp_seq=2 ttl=63 time=0.140 ms
│ 64 bytes from 192.168.2.11: icmp_seq=3 ttl=63 time=0.317 ms
│ 64 bytes from 192.168.2.11: icmp_seq=4 ttl=63 time=0.169 ms
│
│ --- 192.168.2.11 ping statistics ---
│ 4 packets transmitted, 4 received, 0% packet loss, time 3106ms
│ rtt min/avg/max/mdev = 0.070/0.174/0.317/0.090 ms
無事に疎通しましたね😊
NOS(Network Operating System)がARM64にさえ対応していれば、問題なく使えそうです。
ARM64対応のNOS一覧
公式ページを見る限り、以下はRosetta無しで(将来的にRosetta無くなるらしいので・・・)、ARM64版が提供されているようです。
- Nokia SR Linux
- Arista cEOS
- FRRouting
- https://quay.io/repository/frrouting/frr?tab=tags
- linux on arm64がついているもの
種類は少ないものの有名どころはあるため、ある程度はmacOSでも試せそうですね。
(再掲)まとめ
- macOS(Apple Silicon)でも、containerlabがお手軽に利用可能
- 稼働させるNOS(Network Operating System)は、ARM64対応のものが必要
最後に、GMOコネクトでは研究開発や国際標準化に関する支援や技術検証をはじめ、幅広い支援を行っておりますので、何かありましたらお気軽にお問合せください。