Proxmox: GNS3 Remote Server

GNS3 Remote Server

A while back, I began curating a list of free IT and Cybersecurity resources on my blog. And, among the list of computer networking resources, I have always wanted to see if I could get this GNS3 lab project running on Proxmox. Since I started running my Proxomx server, I haven't really used VirtualBox or VMware Player that much, so I can't follow along with it in its current form.

I have known about the GNS3 Remote Server option since a couple years ago, but didn't have the opportunity to experiment with it. This past year, I have achieved some of my certification goals and have a bit of free time for a small experiment, so no time like the present to check it out.

One GNS3 server, multiple clients | GNS3 Documentation
This documentation is only for GNS3 2.0 and later
     Proxmox
 ________________    
|  ____________  |                    ______________ [GNS3 Client 1: laptop]
| |            | |     <========>    |
| |    GNS3    |_|___________________|______________ [GNS3 client 2: laptop]
| | SERVER VM  | |                   |
| |            | |                   |______________ [GNS3 client 3: desktop]
|  ------------  |
 ----------------





Setting up the GNS3 VM

Ensure Nested Virtualization is Enabled

I believe that since PVE 7, nested virtualization is enabled by default, but you will want to double check this setting to be sure. This is because GNS3 will be emulating specific devices and in order for it to virtualize the devices, it will need to expose the host CPU to the guests.

Run one of these commands (depends on CPU) to check if nested hardware virtualization is enabled:

# For Intel processors
cat /sys/module/kvm_intel/parameters/nested

# For AMD processors
cat /sys/module/kvm_amd/parameters/nested



If Nesting is Not Enabled...

If the output from either command above is not 1 or Y , then nested hardware virtualization is not enabled.

To enable nested virtualization, run one of these commands and PAY ATTENTION that you are running it for the right CPU manufacturer.

# Enable nested virtualization for Intel
echo "options kvm-intel nested=Y" > /etc/modprobe.d/kvm-intel.conf
modprobe -r kvm_intel
modprobe kvm_intel

# Enable nested virtualization for AMD
echo "options kvm-amd nested=Y" > /etc/modprobe.d/kvm-amd.conf
modprobe -r kvm_amd
modprobe kvm_amd

Now, re-run the cat ... commands from above and you should see the output is now Y .



Create the VM Scaffolding

Name the VM and give it an ID
Do not use any media and assign a 2.6 Linux Kernel
Default settings are fine here
Click the trash icon next to the disk, as we will import disks later
Dual-core, set to "host" (nested hardware virtualization)
2048 MiB
Adjust your network settings accordingly, VirtIO is fine
⚠️
Click Finish but do not start the VM



Importing the ESXi VM Disks

You can download the ESXi VM image from here: https://gns3.com/software/download-vm

Right-click the Download button next to the ESXi image and choose Copy link address .

We will be using the ESXi VM image as the base for the Proxmox VM. We are going to complete the next few steps in the Proxmox server shell.

# Set your GNS3 VM ID from Proxmox
gns3_vm_id=105

# Set your guest disk storage volume/partition
# Default is "local-lvm", mine is "Guest_Disks"
guest_disk_storage='Guest_Disks'

cd /tmp
wget https://github.com/GNS3/gns3-gui/releases/download/v2.2.35.1/GNS3.VM.VMware.ESXI.2.2.35.1.zip
unzip GNS3.VM.VMware.ESXI.2.2.35.1.zip
mkdir GNS3_OVA_Files
tar -xvf 'GNS3 VM.ova' -C GNS3_OVA_Files/
cd GNS3_OVA_Files/

# The qemu-img commands don't produce output, so be patient
qemu-img convert -f vmdk -O qcow2 ./GNS3_VM-disk1.vmdk ./GNS3_VM-disk1.qcow2
qemu-img convert -f vmdk -O qcow2 ./GNS3_VM-disk2.vmdk ./GNS3_VM-disk2.qcow2
qm importdisk $gns3_vm_id ./GNS3_VM-disk1.qcow2 $guest_disk_storage --format qcow2
qm importdisk $gns3_vm_id ./GNS3_VM-disk2.qcow2 $guest_disk_storage --format qcow2

# Clean up files
cd /tmp
rm -rf GNS3*



Attaching the Disks to the VM

Back in the Proxmox web UI, you should now see two unused disks.

Double click on Unused Disk 0 .

Click Add

Double click on Unused Disk 1 .

Click on Options . We are going to change the boot order.

Double-click Boot Order
Set your boot order to look like this and click OK



Boot up and Verify VM Functionality

Go ahead and start up the VM and make sure that everything is working.

You should see something akin to this on the VM's console. At your next opportunity, take a moment to verify the settings here, change passwords, and harden any settings as necessary.



Connect to the Web UI

As indicated in the welcome screen:

  • We can SSH to the server using the gns3 user and the password gns3 (default)
  • The Web UI is running at http://10.148.148.21 (in my case)
  • Any device images and projects will be remotely stored on the VM in /opt/gns3

Let's open a web browser and connect to the GNS3 Web UI. In my case, I'll be connecting to http://10.148.148.21 . By default, there is no authentication, so you'll be routed to the Servers landing page.

The default server name is local, listening on TCP/80

If you'd like to enable authentication on the web server, you can do that from the VM's console here under the Security menu.

The local server is where we will connect with our GNS3 client.

⚠️
This is is a shared server space. There is no user isolation, so if multiple GNS3 clients connect to the same server, all resources stored on local will be available to all users.





Configuring the GNS3 Client on Windows

I am using a Windows PC, so please consult the documentation for your operating system. You can find the latest GNS3 applications here: https://www.gns3.com/software/download

Start the installer
Install GNS3 Desktop

Finish the installation and override any prompts – choosing the default options for all additional installs (except for the SolarPutty install, don't enter your email and don't accept the license).

Run appliances on a remote server
Our server is running on TCP/80 and there is no authentication, press Next
ℹ️
If you get a websocket error, close GNS3 and reopen it. Upon reopening, the TCP connection should be successful.



Change the Default Console Handler

Go to Edit > Preferences
Click the Edit button
Change this to Putty > Click OK > Click OK





Create a Test Project

Click the New Project button
I'm naming my project Test, click OK

Now, let's see if the GNS3 client pushed the project to the remote server.

Click local
Success!



Add a Simple Topology

Click the "Browse all devices" button

Right now, we don't have many devices to choose from, because we haven't uploaded any device images to GSN3. That's perfectly fine for this test project, as we just want to have a simple test drive.

Use your mouse to drag and drop devices onto the workbench and create this topology.

One Ethernet switch and two VPCs
Click the "Add a link" button
Click PC1, then click Ethernet0
Drag it up to the switch and click Ethernet0
Do the same thing for PC2 and click Ethernet1
Click the play button to power on all nodes at the same time
All links are green

Now that we have connected our nodes in a simple switched topology, we need to configure them with IP addresses before they can communicate.

Right-click PC1 and choose Console
Demonstrating an unconfigured host

Let's configure PC1 with a static IP address.

ip 172.16.10.10/24 172.16.10.1

Now, let's do the same thing on PC2 .

ip 172.16.10.15/24 172.16.10.1

Finally, let's do a simple ping test between both hosts.

Perfect!

The ping test succeeded between both hosts. We have created our first topology using GNS3 hosted on a remote server.



Verify the Project State Server Side

Click the "Test" project in the Web UI

You can even control aspects of the project in the web UI. If you right click one of the nodes, you'll see the option to open a console in your web browser. Let's give it a try.

Click "Web console"
Anything done here...
...is reflected over here



Test Project Conclusions

  • Projects created on the GNS3 client are pushed to the remote server
  • Any actions taken on the remote server are reflected on the client
  • The server dictates the state of the project
  • If a GNS3 client goes offline, and you make changes to the project server-side, the client will pull those changes from the server
Add a blank project on the "local" server in the web UI
Add a node
Drag and drop onto the canvas
Add 2 VPCs
Add links to the switch
Power on the nodes
All links green

Right click the VPCs and open a web console. Configure their IP addresses.

ip 192.168.10.10/24 192.168.10.1

PC1

ip 192.168.10.20/24 192.168.10.1

PC2

Now, go back to your GNS3 client on your Windows/Mac/Linux host.

Open project
Double-click "server-side"
Open a console on PC1 and run "show ip"





Up Next: Pacific.edu COMP177 Labs

Since I've got GNS3 up and running in Proxmox, I am going to start at Lab 1, Step 5, and get the Mikrotik router OS added to my GNS3 templates.

Lab 1 - GNS3 Setup | Pacific Cybersecurity

I'll be linking my work through the labs in my GNS3 VM hosted in Proxmox in a computer networking mini-series. The first and beginning post of that mini-series can be found here:

Proxmox: GNS3 Lab 1
This is the first post in a computer networking mini-series of posts following the University of the Pacific COMP 177 labs, using GNS3 hosted on my Proxmox server. In this post, we set up a very rudimentary network to test GNS3’s functionality.