This article is a part of:
Lately, I’ve been switching from my Windows laptop to MacBook M2 for daily driver. It was smooth until I needed to migrate my virtual networking lab that relies on GNS3. It’s for my preparation before taking another Mikrotik’s certification. I was initially hesitant about whether I could run GNS3 on my M2 machine. After some research, I discovered that the GNS3 client is indeed available for macOS. To host the GNS3 server, I learned that I could set it up from scratch on a Linux machine using Orbstack.
[Update]
I’ve updated this guide. I will now using GNS3 pipx version instead of the PPA repository. The reason is it’s more isolated and get faster update.
Goals
- Get GNS3 server running on M2 Apple Silicon CPU.
- Get GNS3 appliance installed on the GNS3 server.
Prerequisites
- Orbstack installed.
- GNS3 GUI/client installed.
Diagram
I drew a diagram to give you an overview of what we are going to do here.

On Mac
Create a Linux Machine on Orbstack
With Orbstack, create a new Linux machine with the latest Ubuntu distro.
$ orb create --arch amd64 ubuntu gns3-hostVerify the machine is running.
$ orb list
NAME STATE DISTRO VERSION ARCH
---- ----- ------ ------- ----
gns3-host running ubuntu oracular amd64That’s it. Such an easy deployment, isn’t it? The Linux machine we just installed will act as the GNS3 server host.
Allocating Resources
We can allocate CPU and memory resources to limit how much Orbstack machine can use with:
#Show current configuration
$ orb config show
#Set maximum CPU cores for Orbstack to 4 cores
$ orb config set cpu 4
#Set maximum memory for Orbstack to 8 GB
$ orb config set memory_mib 8000On the Linux machine
Install GNS3 Server
From Mac, login into the machine.
$ orb -m gns3-host -u rootInstall the tools.
root@gns3 # apt update
root@gns3 # apt install software-properties-common
root@gns3 # apt install qemu-system-x86
root@gns3 # apt install telnet
root@gns3 # apt install pipxCreate a GNS3 user: gns3-server.
root@gns3 # mkdir /opt/gns3
root@gns3 # adduser --system --group --home /opt/gns3 gns3-serverIn the middle way, select “yes” when you prompted with something like this.

If you missed it, run the following.
root@gns3 # sudo usermod -aG ubridge,libvirt gns3-serverPerform GNS3 server installation.
root@gns3 # sudo -u gns3-server pipx install gns3-server==2.2.54 --system-site-packagesGNS3 will be installed under /opt/gns3/.local/share/pipx/venvs/gns3-server/.
Configure GNS3 Server
Since KVM is not supported, we need to make some adjustments for GNS3 server config. Edit or create a config file as follows:
[Server]
host = 0.0.0.0
port = 3080
images_path = /opt/gns3/images
appliances_path = /opt/gns3/appliances
configs_path = /opt/gns3/configs
projects_path = /opt/gns3/projects
symbols_path = /opt/gns3/symbols
report_errors = True
; First console port of the range allocated to devices
console_start_port_range = 5000
; Last console port of the range allocated to devices
console_end_port_range = 10000
; First VNC console port of the range allocated to devices.
; The value MUST BE >= 5900 and <= 65535
vnc_console_start_port_range = 5900
; Last VNC console port of the range allocated to devices
; The value MUST BE >= 5900 and <= 65535
vnc_console_end_port_range = 10000
; First port of the range allocated for inter-device communication. Two ports are allocated per link.
udp_start_port_range = 10000
; Last port of the range allocated for inter-device communication. Two ports are allocated per link
udp_end_port_range = 20000
; Only allow these interfaces to be used by GNS3, for the Cloud node for example (Linux/OSX only)
; Do not forget to allow virbr0 in order for the NAT node to work
allowed_interfaces = virbr0
; Enable the built-in templates
enable_builtin_templates = True
; check if hardware virtualization is used by other emulators (KVM, VMware or VirtualBox)
hardware_virtualization_check = False
[Dynamips]
allocate_aux_console_ports = False
mmap_support = True
sparse_memory_support = True
ghost_ios_support = True
[IOU]
iourc_path = /opt/gns3/iourc
license_check = True
[Qemu]
enable_kvm = False
require_kvm = False
enable_hardware_acceleration = False
require_hardware_acceleration = FalseSave it under /opt/gns3/.config/GNS3/2.2/gns3_server.conf.
Start and Daemonize GNS3
Create a GNS3 service file under /etc/systemd/system/gns3_server.service.
[Unit]
Description=GNS3 server
Wants=network-online.target
After=network.target network-online.target
[Service]
User=gns3-server
Group=gns3-server
ExecStart=/usr/bin/gns3server --config /opt/gns3/.config/GNS3/2.2/gns3_server.conf
#Restart=on-failure
[Install]
WantedBy=multi-user.targetCreate a symlink for /usr/bin/gns3server.
root@gns3 # ln -s /opt/gns3/.local/share/pipx/venvs/gns3-server/bin/gns3server /usr/bin/gns3server We enable GNS3 server on boot
root@gns3 # systemctl enable gns3-serverStart GNS3 server and verify if it’s running
root@gns3 # systemctl start gns3-server
root@gns3 # systemctl status gns3-serverGNS3 Client
Setup GNS3 Server
GNS3 Client should detect the server automatically, but if it’s not, grab the Linux machine IP from OrbStack GUI.

OrbStack Machine IP
Open the GNS3 Client > Settings > Server and point the GNS3 server to the Linux machine IP or its DNS.

Set GNS3 Server
Verify Client Setup
First, we create a project (you name it) and then check the project path we created in the Project > Projects Library.

Make sure the project paths display /opt/gns3/* , this means we have pointed the GNS3 client to GNS3 Server on the OrbStack machine correctly. If somehow you see path filled with something like /Users/[username]/GNS3/projects, try repeating the steps.
Appliances Installation
The network appliances now can be installed normally.
The results
Testing a SOHO project
I’ve tested the basic appliances by creating a simple SOHO project,everything works as expected.

Simple SOHO
Everything runs smoothly and fast, with no choppy performance at all.
Network Limitation Issue
Accessing GNS3 Appliances from Mac LAN
Since I do most networking work with MikroTik and its GUI config tool called WinBox, I want the GNS3 network appliances to be able to communicate directly with the LAN on my Mac.
Orbstack Linux machines are connected to the same network bridge with a fixed IPv4 address of 198.19.249.0/24 or 192.168.139.0/24 in my case. On my Mac, this network bridge displayed as bridge100 and the GNS3 machine connected to that bridge via its eth0.
Macbook [bridge100]-------[eth0] GNS3 Server (host machine)
|
Cloud Node
|
[ethX] MikroTik ApplianceAnd to bridge GNS3 server network (host interfaces) with GNS3 virtual network, I would have to configure the allowed_interfaces option in the GNS3 configuration file.
...
; Only allow these interfaces to be used by GNS3, for the Cloud node for example (Linux/OSX only)
; Do not forget to allow virbr0 in order for the NAT node to work
allowed_interfaces = virbr0,eth0
...Logically, my WinBox can now reach the MikroTik appliance through the Cloud node acting as a network bridge.

Accessing MikroTik appliance
Indeed, pinging from Mac (192.19.249.3) to the Mikrotik appliance (192.19.249.150, assigned manually) is reachable.

However, I’m still unable to access any services such as MikroTik Winbox on port 8291 or even WebFig on port 80.

Inspecting the traffic with Wireshark, I saw that no TCP handshake was performed between my Mac and the Mikrotik appliance.

At this point, I just gave up.
Orbstack network implementation is beyond my understanding or it seems I have to wait for Orbstack to fully support bridged networking.
While I personally liked Orbstack more because of the experience it offers similar to WSL, in the meantime, I will look into other options like UTM or PNETLab (check this out).
Workaround
To make this case possible, I used L2TP VPN to bridge the GNS3 virtual network environment with my mac LAN with OSPF routing as a workaround.
Conclusion
I’m so impressed by how easy it is to deploy a Linux machine using OrbStack. It’s like running a headless vm but in container ways. If we put the network limitation issue aside, this is more than enough for simulating networking projects locally in your Apple Silicon Mac.
That’s all, see you in the next post!