GMO Connect的永田。
有時,我們都會想要組建一個網路拓撲並在路由器上進行測試。
為組建虛擬路由器拓撲提供便利的工具是Containerlab,但是我一直覺得「準備x86_64 Linux好麻煩啊」。
最近我看到有消息提到Containerlab可以在macOS(Apple Silicon)上運行!(前提是容器NOS需支援ARM)我便試了一下。
如果手頭的開發環境(MacBook M4)也能使用Containerlab,那麼除錯將會非常舒服!
這是一個構建虛擬網路的工具,可以用yaml定義網路拓撲。
只要有拓撲定義的yaml,任何人都可以迅速構建相同的拓撲!
過去購買物理路由器並進行連接的嘗試非常麻煩,但現在真是便利的時代了😊
有關Containerlab的詳細資訊,可以參考以下的官方頁面或文章。
官方頁面中也有說明,但是在macOS上運行Containerlab的方法有三種:
由於OrbStack的商業使用是有償的,這次我們將試用devcontainer方式。
這次我們測試的將是性能看起來相當不錯的Docker Outside Of Docker (dood)。
有關devcontainer本身,請參考這篇文章。
那麼,讓我們在VSCode上構建devcontainer。
測試的環境如下:
我們將創建 .devcontainer/devcontainer.json
。
根據官方的dood示例進行了以下修改:
{
"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左下角的藍色圖標(打開遠程窗口),選擇「在容器中重新打開」,這時Docker會在後台啟動。
(首次運行會因docker pull而耗時較長)
在啟動的VSCode終端中,如果能使用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吧。
這次我們將使用一台路由器(FRRouting)和兩台PC(Linux)的最小示例構成。
mini-topo.clab.yml
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的設置參考了這裡的內容。
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 │
╰─────────────────────────┴─────────────────────────────────┴─────────┴───────────────────╯
如果三台設備運行正常,則部署完成!
接下來,我們嘗試從src ping到dst。
❯ 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
- [https://learn.srlinux.dev/blog/2024/sr-linux-container-image-for-arm64/](https://learn.srlinux.dev/blog/2024/sr-linux-container-image-for-arm64/)
- Arista cEOS
- [https://marcstech.blog/archives/add-arista-ceos-containerlab-macos/](https://marcstech.blog/archives/add-arista-ceos-containerlab-macos/)
- FRRouting
- [https://quay.io/repository/frrouting/frr?tab=tags](https://quay.io/repository/frrouting/frr?tab=tags)
- 附有linux on arm64的映像
雖然種類不多,但還是有一些知名的選項,因此在macOS上應該還是能嘗試的。
# (重申)總結
- 在macOS(Apple Silicon)上,Containerlab可以輕鬆使用
- 運行的NOS(Network Operating System)需要支援ARM64
最後,GMO Connect在研究開發及國際標準化相關的支援以及技術驗證等方面提供廣泛的支援,如有任何疑問,請隨時聯繫我們。
聯繫方式: [https://gmo-connect.jp/contactus/](https://gmo-connect.jp/contactus/)
---
原文出處:https://qiita.com/ntaka329/items/ed5d8b0b9de27893e0a7