GNS3 y VirtualBox: Simulando redes TCP/IP

Publicado por Diego Córdoba en

En esta oportunidad veremos cómo es posible simular redes TCP/IP con routers, switches, y estaciones de trabajo virtualizadas con VirtualBox utilizando una genial herramienta: GNS3.

Hace tiempo que quería escribir esta entrada, pero no había tenido oportunidad de instalar y configurar correctamente el GNS3 en mi ArchLinux, cosa que resultó un poco complicada comparada con otras distros. Aquí el artículo tan esperado, y por supuesto, el video que grabé para el canal de youtube de @juncotic donde explico algunos ejemplos simples.

GNS3 (Graphical Network Simulator) es un software open source que permite simular redes de computadoras lo más cercano posible a la realidad, y sin tener la necesidad de hardware dedicado… todo virtualizado!

Sí, podemos montar redes tcp/ip en las que interactúen una variada cantidad de dispositivos activos como switches o routers de modelos específicos, con computadoras legacy que tengamos montadas en algunos mecanismos de simulación soportados por GNS3, tales como QEMU, VMWARE o VirtualBox, o incluso, contenedores Docker.

En este caso particular veremos un ejemplo simple de interconexión utilizando VirtualBox, que es lo que tengo más a mano, pero puede extenderse a otros mecanismos de simulación.

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Arquitectura: un vistazo

GNS3 se compone de varias partes, pero para los fines de este artículo práctico solamente analizaremos algunas.

Por un lado disponemos del servidor GNS3 que es el que oficia de backend de GNS3, y por otro, la GUI, desde la que podemos interactuar con todos los servicios y utilidades.

La llamada instalación «all-in-one» instala tanto el server como la GUI en el mismo equipo, y permite crear y simular gran variedad de topologías.

El servidor GNS3 corre localmente en la misma computadora en la que están andando, así tanto servidor como GUI comparten el mismo ordenador y sistema operativo. Además, procesos tales como los Dynamips, que permiten virtualizar routers y otros equipos activos, también corren en la misma computadora.

Emulación y simulación

GNS3 soporta tanto emulación como simulación de equipos activos.

  • Emulación: simula hardware de un equipo real utilizando las imágenes de los firmwares reales de los dispositivos, como pueden ser los IOS de Cisco, y los ejecuta virtualmente en el esquema de red.
  • Simulación: simula características de los equipos reales, y sus funcionalidades, pero no utiliza imágenes de firmware del dispositivo de hardware, no ejecuta realmente su sistema operativo, sino que utilizan dispositivos virtuales como los switches de capa 2 de GNS3.

Ambos esquemas tienen algunas coincidencias en la actualidad, ya que GNS3 permite correr imágenes virtuales de Cisco dentro de un hardware estándar virtualizado.

Instalando GNS3

Vamos a instalar GNS3 en nuestro GNU/Linux preferido, aunque también está disponible para Windows y MacOS, aunque para algunas configuraciones particulares resulta más flexible cualquier distro GNU/Linux 🙂

Voy a mostrar cómo instalar GNS3 en mis dos distros favoritas: Debian y ArchLinux, pero existe documentación para instalarlo en cualquier distro, incluida la instalación desde los fuentes.

GNS3 en ArchLinux

GNS3 usa algunas extensiones de python parchadas en ArchLinux, y necesitarán ser instaladas desde los repositorios AUR de ser necesario: python-aiohttp-cors-gns3 y python-yarl-gns3.

Esto puede traer problemas con otros programas… por lo que particularmente en ArchLinux resulta un poco inestable a veces (por lo menos en mi instalación).

Los paquetes necesarios para hacer andar GNS3 en ArchLinux son gns3-gui y gns3-server, ambos pertenecientes al repo AUR. En mi caso uso yay para gestionar el repo AUR, aquí usen el gestor que prefieran.

yay -S gns3-gui gns3-server

Adicionalmente puede instalarse libvirt para crear dispositivos «Cloud» y NAT, proveyendo una interfaz virtual WAN. Para que libvirt corra correctamente será necesario también instalar dnsmasq y ubridge (AUR). De ser así, pueden instalarse y ejecutar el daemon libvirtd antes de correr GNS3 para utilizar dispositivos Cloud y NAT.

Además, en mi caso tuve que instalar el paquete typing de python desde pip para que pueda correr el server GNS3 sin problemas:

pip install typing

GNS3 en Debian / Ubuntu

Particularmente no lo he probado en Debian últimamente, pero sí en su versión anterior, y he utilizado el repositorio para hacerlo:

sudo apt install gns3

En el caso de que no se encuentre en los repositorios de nuestra distro, podemos agregar al archivo /etc/sources.list las siguientes líneas, dependiendo de la versión de Debian/Ubuntu que tengamos:

Debian Jessie / Ubuntu Trusty:

deb http://ppa.launchpad.net/gns3/ppa/ubuntu trusty main
deb-src http://ppa.launchpad.net/gns3/ppa/ubuntu trusty main

Debian Stretch / Ubuntu Xenial

deb http://ppa.launchpad.net/gns3/ppa/ubuntu xenial main
deb-src http://ppa.launchpad.net/gns3/ppa/ubuntu xenial main

Luego, en cualquiera de los dos casos, instalamos los paquetes necesarios de esta forma:

sudo apt-get install dirmngr
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F88F6D313016330404F710FC9A2FD067A2E3EF7B
sudo apt-get update
sudo apt-get install gns3-gui

Esta información está extraída de la documentación oficial de GNS3, y cabe aclarar que también tiene soporte para contenedores docker.

Otros paquetes…

Si bien GNS3 ya debería estar instalado y funcionando, requiere de otros paquetes para poder cumplir su función con normalidad.

Entre estos paquetes se encuentran VirtualBox, con alguna que otra máquina virtual que agregar al esquema. Y Qemu si es que queremos utilizarlo para virtualizar en vez de virtualbox.

Finalmente, las IOS de los routers y switches, por problemas de derechos de autor, no se distribuyen junto con GNS3, por lo que debemos descargarlas desde los proveedores oficiales como Cisco.

Configuración inicial

Para dejar andando nuestro GNS3 lo antes posible, vamos a hacer uso del asistente de configuración que provee la herramienta.

El asistente suele lanzarse inmediatamente cuando ejecutamos el GUI, si no en el menú Help/Ayuda lo veremos también:

Primer paso: seleccionamos correr las topologías en nuestra computadora:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Luego dejamos los datos por defecto en general. Tenemos la ubicación del binario del servidor, la dirección IP en la que atiende, y el puerto.

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Paso siguiente, la GUI intentará conectar con el servidor. Si el servidor se ejecutó correctamente, la GUI podrá linkear, y veremos una ventana como esta:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

En el caso de que no pueda conectar, será porque el servidor no está corriendo… deberemos analizarlo y depurarlo. Un consejo interesante en este punto: si no corre el servidor, tomar la línea del binario de la captura anterior (Server Path) y ejecutarlo por terminal… en general suelen faltar algunas dependencias de Python.

Si todo salió bien, en la siguiente pantalla veremos un resumen de la configuración:

Agregando appliances

Finalmente, al terminar el asistente nos preguntará si queremos cargar algún archivo template al sistema, que luego podremos utilizar en nuestros proyectos:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Yo por lo general en esta instancia cargo algún ISO de router Cisco para luego utilizar luego en el proyecto, aunque todo lo que puede cargarse desde acá puede cargarse después.

Primero, si tenemos alguna imagen IOS de, por ejemplo, un router o switch, podemos agregarla desde el archivo en este punto.

Como comenté arriba, estas imágenes no están provistas por GNS3 por una cuestión de copyright, pero podemos descargarlas desde los sitios de los proveedores.

Yo me tomé el atrevimiento de «rescatar» algunas IOS que he utilizado, y los colgué en mi cloud de Mega, pueden descargarlas desde este link.

Una vez que hayamos cargado la IOS, si seleccionamos, en la interfaz de GNS3, el ícono de router o switch (según qué hayamos cargado) en la columna de la izquierda, veremos nuestro equipo habilitado:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Agregando equipos VirtualBox

Si tenemos VirtualBox corriendo y queremos agregar alguna de sus máquinas a nuestra topología, deberemos hacer dos cosas.

Por un lado, entrar a la configuración de las interfaces de red del equipo virtual, y en la sección de red/network, configurar la interfaz de red como «no attached» (no se cómo figura en español xD):

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Esto es porque de esa forma GNS3 puede tomar el control de la interfaz de red, y luego que corramos la topología podremos configurar el direccionamiento en el equipo virtual, o configurar un router virtual que le de IP dinámica a las computadoras.

Acto seguido, en la columna de la izquierda de GNS3 vamos a seleccionar los end-devices (el iconito de la computadora), y en la parte inferior veremos un botón que nos permitirá agregar nuevos equipos a la configuración:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Si damos clic vamos a ver la misma ventana de carga de templates que mostré arriba, en la que vamos a seleccionar «Máquina virtual Virtual Box», y damos «OK», con lo que veremos lo siguiente:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

En el desplegable veremos todos los equipos virtuales que tenemos en VirtualBox… no tenemos más que seleccionar el que configuramos recién, y terminar con «Finish».

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Y listo, ya podremos utilizar ese equipo en una topología!

Un ejemplo simple…

Veamos ahora un pequeño ejemplo de una mini-red corriendo en GNS3.

Para el caso utilizaré el IOS de un router Cisco c3600, y dos hosts virtuales (VirtualBox) corriendo Debian… vamos a configurar las interfaces en los hosts, las interfaces en el router, correremos un ping de un host a otro, y capturaremos tráfico en algún «cable» para analizarlo.

Una vez que tenemos los hosts de VirtualBox y el IOS del router cargado al GNS3, no tenemos mas que crear los nodos, y conectarlos utilizando el ícono correspondiente al enlace.

El esquema final queda así:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

El direccionamiento que utilicé es el siguiente:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

En mi caso particular tengo configuradas las IP’s automáticamente en forma estática en los equipos GNU/Linux, y he configurado a mano (aunque también se puede guardar en la configuración automática) las direcciones IP en las bocas del router.

En el caso de que quisiéramos hacerlo manualmente en todos los casos: (el nombre de la interfaz de red en cada equipo depende de cada instalación)

#DebianSAX-1
ip a flush dev eth0
ip a add 10.0.0.10/24 dev eth0 brd +
ip r add default via 10.0.0.100 dev eth0

#Debian8-64b-1
ip a flush dev eth0
ip a add 10.0.1.10/24 dev eth0 brd +
ip r add default via 10.0.1.100 dev eth0

Y finalmente en el router, clic derecho -> console y pasamos a la consola de comandos de Cisco. En mi caso las interfaces de red se denominan Ethernet0/0 (conectada al DebianSAX-1) y Ethernet0/1 (conectada al Debian8-64b-1)… por lo que una configuración posible sería la siguiente:

# configure terminal
(config)# interface ethernet 0/0
(config-if)# ip address 10.0.0.100 255.255.255.0
(config-if)# no shutdown
(config-if)# exit
(config)# interface ethernet 0/1
(config-if)# ip address 10.0.1.100 255.255.255.0
(config-if)# no shutdown
(config-if)# end

Y con esto ya deberíamos estar haciendo ping entre los equipos Debian. Además, GNS3 permite utilizar automáticamente Wireshark en un cable para capturar paquetes y analizarlos!

Cabe aclarar que hay algunos bugs en este punto, y que a veces no dejan levantar el sniffer, por lo que siempre es recomendable tener todas las configuraciones, tanto de servidores, hosts y equipos activos de manera persistente, puesto que resulta mucho más sencillo apagar el entorno completo y ejecutarlo nuevamente sin necesidad de configurar a mano (como hice yo) los nodos.

Conclusiones

Este ha sido un extremadamente breve artículo en el que intenté explicar desde la instalación de GNS3 hasta la creación de un entorno sencillo, pero las posibilidades son muchas, y todas con la misma base.

Por ejemplo, si quisiéramos testear unas reglas de iptables, simplemente tendríamos que montar un router/firewall GNU/Linux en vez de hacer uso de un router cisco como hicimos acá. Luego configurar las interfaces de red, y listo! Por supuesto, habrá que instalar algún servidor de algún servicio particular si queremos probar más cosas, pero a nivel de networking, un esquema como este bastaría para testear un firewall iptables:

red, redes, network, gns3, linux, gnu, virtualbox, virtualizacion

Como se ve en la misma captura, entrando en la configuración del equipo debemos habilitarle dos interfaces de red, ya que necesitará una para cada nodo de la red. Este paso hay que hacerlo ANTES de colocar la máquina virtual en el entorno.

Espero que este artículo ayude a quienes necesiten probar y practicar servicios de red en forma virtualizada! Cualquier duda o consulta quedo en los comentarios del aquí debajo! Hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador