A virtual network has many great uses. It can be indispensable when testing device configurations before applying to your production network, and it also can be beneficial for training purposes when studying for the Cisco and Juniper certification exams.
GNS3 is a graphical network simulator. It's an impressive tool that ties together the Dynamips
, VirtualBox
, and QEMU
hypervisors abstracted to the user as a modular and flexible graphical user interface for network design and testing.
Download the Software
You can grab the components needed for this tutorial from their respective websites:
- GNS3
- TunTap
- Cisco IOS image
Install the Software
# TunTap
The TunTap package will provide us with a collection of virtual network interfaces for the Mac operating system. The TAP drivers allow us to bridge our GNS3 virtual network with the physical Mac host. Unpack and install the downloaded TunTap package.
Verify the TunTap package installed successfully. Run this command from
Terminal.app
:
$ ls -l /dev | grep tap
You should see the device files listed (tap0 - tap15).
crw-rw---- 1 root wheel 33, 0 Oct 5 07:27 tap0 crw-rw---- 1 root wheel 33, 1 Oct 5 07:27 tap1 crw-rw---- 1 root wheel 33, 10 Oct 5 07:27 tap10 crw-rw---- 1 root wheel 33, 11 Oct 5 07:27 tap11 crw-rw---- 1 root wheel 33, 12 Oct 5 07:27 tap12 crw-rw---- 1 root wheel 33, 13 Oct 5 07:27 tap13 crw-rw---- 1 root wheel 33, 14 Oct 5 07:27 tap14 crw-rw---- 1 root wheel 33, 15 Oct 5 07:27 tap15 crw-rw---- 1 root wheel 33, 2 Oct 5 07:27 tap2 crw-rw---- 1 root wheel 33, 3 Oct 5 07:27 tap3 crw-rw---- 1 root wheel 33, 4 Oct 5 07:27 tap4 crw-rw---- 1 root wheel 33, 5 Oct 5 07:27 tap5 crw-rw---- 1 root wheel 33, 6 Oct 5 07:27 tap6 crw-rw---- 1 root wheel 33, 7 Oct 5 07:27 tap7 crw-rw---- 1 root wheel 33, 8 Oct 5 07:27 tap8 crw-rw---- 1 root wheel 33, 9 Oct 5 07:27 tap9
A reboot of the computer may be required if the virtual devices are not listed in the output.
# GNS3
Open the GNS3 DMG image file, and move the GNS3.app to the
Applications
folder.
We also need to change the ownership and permissions for the Dynamips binary file(s). The Dynamips process will need to run with elevated privileges (root) to "attach" the TAP devices.
Change the ownership of the Dynamips binary file(s) to the
root
user. Run this command from
Terminal.app
:
$ sudo chown root /Applications/GNS3.app/Contents/Resources/dynamips*.bin
Modify the setuid
attribute for the Dynamips binary file(s). Run this command from
Terminal.app
:
$ sudo chmod 4755 /Applications/GNS3.app/Contents/Resources/dynamips*.bin
Verify the new configuration. Run this command from
Terminal.app
:
$ ls -oh /Applications/GNS3.app/Contents/Resources/dynamips*.bin -rwsr-xr-x@ 1 root 1.0M Sep 9 21:01 /Applications/GNS3.app/Contents/Resources/dynamips-0.2.10-OSX.intel64.bin -rwsr-xr-x@ 1 root 958K Sep 9 21:01 /Applications/GNS3.app/Contents/Resources/dynamips-0.2.8-RC3-community-OSX.intel64.bin
Note
: Recent versions of GNS3 include multiple versions of the Dynamips binary file.
GNS3 Base Configuration
# Create the GNS3 Folders
Create the main
GNS3
folder as well as the
GNS3/Projects
,
GNS3/Images
, and
GNS3/Tmp
subfolders in your
Documents
folder. Feel free to use the Finder, but I will use the command line method in my example.
Create the main GNS3 folder and subfolders. Run this command from
Terminal.app
:
$ mkdir -p $HOME/Documents/GNS3/{Projects,Images,Tmp}
# Cisco IOS Image File
Let's now unpack the image file and move it to the
Images
folder. I will be using the
c3725-adventerprisek9-mz.124-15.T10.bin
image file in my example. I will first navigate to the directory where I have it saved (
/Users/marc/Downloads/Labs
), so I would run this command from
Terminal.app
:
$ cd $HOME/Downloads/Labs
Now uncompress the IOS image. Run this command from
Terminal.app
:
$ unzip c3725-adventerprisek9-mz.124-15.T10.bin Archive: c3725-adventerprisek9-mz.124-15.T10.bin warning [c3725-adventerprisek9-mz.124-15.T10.bin]: 28328 extra bytes at beginning or within zipfile (attempting to process anyway) inflating: C3725-AD.BIN
You can safely ignore the warning message. It should have uncompressed successfully.
From the output, you will notice the unpacked IOS image filename is
C3725-AD.BIN
. Rename it back to original filename substituting the extension with
.image
(e.g. c3725-adventerprisek9-mz.124-15.T10.bin -> c3725-adventerprisek9-mz.124-15.T10.image). Run this command from
Terminal.app
:
$ mv C3725-AD.BIN c3725-adventerprisek9-mz.124-15.T10.image
Then move the
c3725-adventerprisek9-mz.124-15.T10.image
file to the GNS3
Images
folder. Run this command from
Terminal.app
:
$ mv c3725-adventerprisek9-mz.124-15.T10.image $HOME/Documents/GNS3/Images
We will now map the GNS3 settings with the new folders we just created.
# GNS3 Preferences (General)
- Open the GNS3 Preferences. [Command-, (Command key plus the comma key)]
- Select the General node on the left.
- Select the General Settings tab.
- Set the directory path for both Projects and OS images.
- Click the Apply button to save the settings.
# GNS3 Preferences (Dynamips)
- Select the Dynamips node on the left.
- Select the Dynamips tab.
- Set the directory path for both Executable path to Dynamips and Working directory for Dynamips.
What value should we enter in the
Executable path to Dynamips
field? As stated previously, GNS3 now includes multiple versions of the Dynamips binary file. Run the following command from
Terminal.app
to see our options:
$ ls /Applications/GNS3.app/Contents/Resources/dynamips*.bin /Applications/GNS3.app/Contents/Resources/dynamips-0.2.10-OSX.intel64.bin /Applications/GNS3.app/Contents/Resources/dynamips-0.2.8-RC3-community-OSX.intel64.bin
I decide to use the latest version, so I would enter the value
/Applications/GNS3.app/Contents/Resources/dynamips-0.2.10-OSX.intel64.bin
in the
Executable path to Dynamips
field.
- Click the Apply button to save the settings.
- Then click the Test Settings button to verify the configuration is valid.
- Click the OK button to close the window.
# IOS images and hypervisors
- Open the IOS images and hypervisors settings window. [Shift-Command-I]
- Select the IOS Images tab.
- Set the directory path for the Image file.
- Verify the Platform and Model fields coincide with the Cisco IOS image file.
- Verify/Set the Default RAM value for the image.
- Click the Auto calculation button to start the operation to retrieve the IDLE PC value for the image.
- Click the Close button in the foreground window after the message Working Idle PC value found. is displayed.
- Click the Save button.
- Then click the Close button to close the window.
Basic Lab Setup
Our sample lab will consist of a Router, an Ethernet Switch, and a Cloud node type. Drag the objects from the Node Types dock onto the Workspace window. It should look similar to this once we get everything configured:
We need to configure the Cloud object before we wire it to the switch. The object will be using a
TAP
virtual network interface.
- Right-click the Cloud object.
- Select Configure.
- Select the subnode (ex. C1).
- Select NIO TAP.
- Enter /dev/tap0 into the top field.
- Select the Add button to add the interface.
- Select the Apply button to save the setting.
- Then select the OK button to close the window.
Connect all objects with Fast Ethernet links.
- Start the router. [Right-click (or Control-click) -> Start] on the router object.
- Find the console port for the virtual router by entering the list command in the Dynagen management console.
Emulate a console connection to the router by establishing a telnet session. Run this command from
Terminal.app
:
$ telnet localhost 2103
Let the router load until it presents the prompt. Take note you may need to press the
return
key multiple times to "capture" the prompt in the terminal window.
# Save the Project
I prefer to save the GNS3 project at this point before I continue with the rest of the configuration.
File
->
Save project as...
# Configure IOS for the Router
Set the IP configuration for the network interface that is connected to the switch.
R1# conf t R1(config)# int fa0/0 R1(config-if)# ip address 10.11.1.1 255.255.255.0 R1(config-if)# no shut R1(config-if)# end
Let's verify the configuration of the interfaces by executing the following commands:
R1# sh run int fa0/0 Building configuration... Current configuration : 94 bytes ! interface FastEthernet0/0 ip address 10.11.1.1 255.255.255.0 duplex auto speed auto end
R1# sh ip int br Interface IP-Address OK? Method Status Protocol FastEthernet0/0 10.11.1.1 YES manual up up FastEthernet0/1 unassigned YES unset administratively down down
Copy the current running configuration to the startup configuration in the "virtual" NVRAM, so we don't have to repeat the preceding steps the next time we start this lab in GNS3.
R1# copy run start Destination filename [startup-config]? <enter> Building configuration... [OK]
# TAP Interface
By linking the Cloud with the switch, it should have brought up the
TAP
network interface on the physical Mac host. Let's check. Run the following command from
Terminal.app
:
$ ifconfig tap0 tap0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether ce:d1:be:72:33:67 open (pid 34415)
Set the IP configuration for the
tap0
interface. The IP address will need to be in the same subnet as the one we configured for the network interface on the router. You will be requested for your user account password because modifying the logical network configuration for a network interface requires superuser privilege. Run this command from
Terminal.app
:
$ sudo ifconfig tap0 inet 10.11.1.254/24 up
Verify the IP configuration on the interface. Run this command from
Terminal.app
:
$ ifconfig tap0 tap0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether ce:d1:be:72:33:67 inet 10.11.1.254 netmask 0xffffff00 broadcast 10.11.1.255 open (pid 34415)
Test the Connectivity
Ping from our Mac (tap0) to the virtual router. Run this command from
Terminal.app
:
$ ping -c 3 10.11.1.1 PING 10.11.1.1 (10.11.1.1): 56 data bytes 64 bytes from 10.11.1.1: icmp_seq=0 ttl=255 time=3.223 ms 64 bytes from 10.11.1.1: icmp_seq=1 ttl=255 time=1.316 ms 64 bytes from 10.11.1.1: icmp_seq=2 ttl=255 time=1.328 ms
Ping from the virtual router to our Mac (tap0).
R1# ping 10.11.1.254 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.11.1.254, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 8/10/16 ms
Automate
I don't want to manually configure the TAP interface(s) every time I load a GNS3 project, so I created a simple script to take care of this.
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016
|
#!/usr/bin/env bash
# Topology file located in GNS3/Projects directory
TOPFILE=
$HOME/Documents/GNS3/Projects/
test/topology.net
# tap0 interface IP configuration
TAP0IP=10.11.1.254/
24
# Open GNS3 with topology file /Applications/GNS3.app/Contents/MacOS/GNS3
"
$TOPFILE
" &
# Number of seconds to wait before assigning IP configuration to tap0
sleep
5
# Set the IP configuration for the the tap0 interface sudo ifconfig tap0 inet
$TAP0IP up
|
Copy and paste the text into your preferred text editor, then save the file as
launch-gns3-with-test-project.sh
.
Give the file the execute permission. Run this command from
Terminal.app
:
$ chmod u+x launch-gns3-with-test-project.sh
Run the script. You will be requested for your user account password because modifying the logical network configuration for a network interface requires superuser privilege via the
sudo
command. Run this command from
Terminal.app
:
$ ./launch-gns3-with-test-project.sh