Before we work our way through the steps, I will start by pointing out GNS3 server has the following constraints when running on Apple Silicon:
- Lack of Linux KVM for x86_64 virtualized guests
- Slight performance penalty with emulated x86_64 Linux binaries (Rosetta )
GNS3 is viable even with these limitations. I’m amazed with the stability and performance considering the Linux operating system and virtual network devices are running on a different CPU architecture.
I’m never CPU-bound running labs with Cisco images and Docker containers. System memory on my Mac is usually the limiting factor. And let’s face it: connecting to a dedicated x86_64 GNS3 compute server with ample CPU cores and RAM is the ideal solution for running large labs.
The following are my results from testing a number of different Cisco device types:
Device | Working? | Information |
---|---|---|
IOL (XE) | ✅ | - |
IOL L2 (XE) | ✅ | - |
IOSv | ✅ | - |
IOSv L2 | ✅ | - |
ASAv | ❌ | Requires SSSE3 CPU instructions for cryptographic operations |
Catalyst 8000V | ❌ | Requires vmx or svm CPU flag for Linux KVM |
Nexus 9000v | ❌ | Requires vmx or svm CPU flag for Linux KVM |
You’re golden if your primary interest is to run Cisco route and switch labs locally on your Mac. Like a teaser? Guess how long it takes for 40 Cisco IOL nodes to be up and ready on a Mac mini (M2) Pro.
Prerequisites
Steps
- Download OrbStack and open it.
An OrbStack Linux machine with seamless Rosetta integration is the magic sauce for hosting our GNS3 server and components.
- Open your favorite terminal emulator.
We will be working from the command line for the majority of the following steps.
- Change to the
Downloads
directory.
cd ~/Downloads
- Clone the gns3-server-orbstack repo from GitHub.
git clone https://github.com/mweisel/gns3-server-orbstack.git
- Change to the
gns3-server-orbstack
directory.
cd gns3-server-orbstack
- Create a Python virtual environment for Ansible.
source init_venv.sh
- Verify Ansible is installed.
ansible --version
- Start OrbStack (if not already started).
orb status || orb start
- Create the
gns3
Linux machine.
orb create --arch amd64 ubuntu:noble gns3
This process should take less than a minute depending on your internet connection speed.
- Verify the
gns3
Linux machine is listed and running.
orb list
output:
NAME STATE DISTRO VERSION ARCH
---- ----- ------ ------- ----
gns3 running ubuntu noble amd64
- Test Ansible connectivity to the
gns3
Linux machine.
ansible all -m ping
output:
gns3@orb | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3.12"
},
"changed": false,
"ping": "pong"
}
- Deploy the latest stable release of GNS3 server and components.
ansible-playbook server.yml
Sit back and relax. The automated process should take less than 10 minutes.
- Check availability after the Ansible playbook completes.
Verify the GNS3 server is up and ready with a HTTP GET request.
curl -s http://gns3.orb.local:3080/v2/version
- Open the GNS3 WebUI with your default web browser.
open http://gns3.orb.local:3080
- Deactivate the Python virtual environment.
deactivate
- Attach your GNS3 client to the GNS3 server.
- Open the GNS3 client application.
- Click the Settings button.
- Select Server on the left side menu.
- Select the Main server tab.
- Enter the following values for the Remote main server section:
- Protocol:
HTTP
- Host:
gns3.orb.local
- Port:
3080 TCP
- Protocol:
- Click the OK button to save.
Workflow
- Start OrbStack from the command line or open the OrbStack GUI.
orb status || orb start
- Start the
gns3
Linux machine from the command line or the OrbStack GUI.
orb start gns3
- Open the GNS3 client application or WebUI.
open http://gns3.orb.local:3080
Start the devices within GNS3.
Happy Labbing!
Save the configuration at the device-level (e.g.,
copy run start
,wr mem
, etc.).Stop the devices within GNS3.
Close the GNS3 client application.
Stop the
gns3
Linux machine from the command line or the OrbStack GUI.
orb stop gns3
Q&A
- How do I install a specific GNS3 server version?
The Ansible playbook will install the latest stable version by default. You can override this by explicitly setting the gns3_version
variable.
ansible-playbook server.yml -e 'gns3_version=3.0.0b2'