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

Diagram

I drew a diagram to give you an overview of what we are going to do here.

image-20250129212031966

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-host

Verify the machine is running.

$ orb list
NAME       STATE    DISTRO  VERSION   ARCH
----       -----    ------  -------   ----
gns3-host  running  ubuntu  oracular  amd64

That’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 8000

On the Linux machine

Install GNS3 Server

From Mac, login into the machine.

$ orb -m gns3-host -u root

Install 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 pipx

Create a GNS3 user: gns3-server.

root@gns3 # mkdir /opt/gns3
root@gns3 # adduser --system --group --home /opt/gns3 gns3-server

In the middle way, select “yes” when you prompted with something like this.

image-20250129214423431

If you missed it, run the following.

root@gns3 # sudo usermod -aG ubridge,libvirt gns3-server

Perform GNS3 server installation.

root@gns3 # sudo -u gns3-server pipx install gns3-server==2.2.54 --system-site-packages

GNS3 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:

gns3_server.conf
[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 = False

Save 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.

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.target

Create 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-server

Start GNS3 server and verify if it’s running

root@gns3 # systemctl start gns3-server
root@gns3 # systemctl status gns3-server

GNS3 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

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

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.

image-20260305223453028

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

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 Appliance

And 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.

gns3_server.conf
...
; 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

Accessing MikroTik appliance

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

image-20250201140538579

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

image-20250202135153641

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

image-20250201163513432

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!

References