23 agosto 2013

Creación de laboratorios virtuales con GNS3

La necesidad de crear laboratorios virtuales es común a todos los ingenieros de seguridad que quieran experimentar técnicas y configuraciones nuevas. De hecho, ya exploramos la posibilidad de crear este tipo de laboratorios utilizando Netkit (artículo 1 y artículo 2).

Netkit es tremendamente potente, pero cuenta con una serie de limitaciones a tener en cuenta:

  • Su configuración es compleja.
  • Sólo hay versión para Linux (para los que estamos saltando continuamente de Linux a Windows, eso es un problema).
  • Sólo emula máquinas Debian.
Sin embargo, hace poco comencé a trastear con GNS3 y he de reconocer que los resultados han sido más que satisfactorios:
  • Emula equipos Cisco y Juniper (este último mediante Olive, así que sólo de manera parcial).
  • Permite incluir en los laboratorios máquinas virtuales preexistentes de VirtualBox y QEmu.
  • Cuenta con versiones para Windows, Linux y Mac OS.
  • Su interfaz gráfica es bastante intuitiva.
GNS3 es "open source" y se puede descargar gratuitamente. Su modelo de negocio se basa en ofrecer anuncios de cursos para la preparación de las certificaciones CCNA, CCNP, etc. Como GNS3 también se puede utilizar para preparar esas certificaciones dicha publicidad está dentro de contexto y como los anuncios se limitan a una pantalla emergente al arrancar el programa (que se puede cerrar sin problemas) tampoco es que moleste en absoluto.

Cuando abrimos GNS3 vemos un interfaz muy visual. La pantalla principal está ocupada principalmente por la zona de diseño, acompañada por una ventana de consola para ver el logging de la aplicación, y dos ventanas a la derecha, una con el listado de elementos que iremos añadiendo a la zona de diseño y otra con las capturas de tráfico que tengamos activas. Gracias a las ventanas de la derecha se pueden sacar capturas de tráfico de cualquiera de los puertos del laboratorio y visualizarlas en wireshark con sólo un par de clicks.



A la izquierda se pueden ver los distintos elementos que podemos arrastrar a la zona de diseño. Al principio veremos que la mayor parte de los iconos referentes a routers están sombreados y no se pueden incorporar al esquema. Esto es así porque cada uno de esos iconos representa un modelo concreto de equipo y para poder usarlo hay que asociar una imagen de firmware a cada uno de ellos (las famosas IOS de Cisco). GNS3 no trae esos firmware ya que son propietarios de Cisco y esta cobra por ellos. Sólo podremos cargar esos firmware si trabajamos en una empresa que sea partner de Cisco y tenga acceso a ellos o bien si los hemos conseguido por otros medios (Internet, amigos, etc. allá cada uno con su conciencia).

Supongamos que tenemos IOS compatibles con cada uno de los modelos que GNS3 puede emular, para asociarlos a los diferentes dispositivos deberemos acceder a: "Edit -> IOS Images and Hipervisors" o simplemente pulsar Control+Shif+I. 



Allí nos limitaremos a elegir una plataforma, un modelo concreto y cargarle el fichero .bin o .image de la IOS que tengamos para él. Por lo que he visto en las pruebas que he realizado no todas las IOS parecen funcionar. Lo mejor es usar el botón de "Test Settings" tras seleccionar una imagen, se abrirá una ventana de consola que intentará poner a funcionar la imagen. Si la imagen se puede ejecutar bien acabaremos viendo un prompt de router en la ventana. Sin embargo, si el tema se atasca y empiezan a salir mensajes de error entonces significa que la imagen es compatible con GNS3 y que tenemos que probar con otra IOS. Cuando por fin demos con una IOS que valga pulsamos el botón de "Save" y listo, a partir de ahí podremos incorporar ese tipo de router a nuestros diseños.

GNS es capaz de emular routers, pero no puede simular la arquitectura utilizadas en los switches por lo que en teoría no podríamos practicar esa parte con GNS2 si estuviéramos preparando alguna certificación de Cisco o simplemente aprendiendo a manejar sus equipos. Sin embargo, hay un truco que puede servir para solventar este problema, se trata de emular un 3600 con una IOS de 3640 y una tarjeta NM-16ESW. Esta tarjeta dota de capacidades de switching (limitadas eso sí) al router en el que se integre.

Para definir las tarjetas con las que irá equipado cada router de nuestro diseño (y por tanto los puertos con los que contará para comunicarse con el resto de los elementos), arrastraremos el equipo a la zona de diseño y una vez allí lo seleccionaremos con el botón derecho y le daremos a "Configure". En la ventana que saldrá podremos definir determinadas condiciones operativas del equipo: su RAM, si tiene tarjeta PCMCIA, su confreg, etc. Pero la pestaña que nos permitirá definir que tarjetas llevará es la que se denomina "Slots". Una vez que hayamos dicho con qué tarjetas queremos dotar a cada uno de los slots del equipo pulsaremos "Apply".

Para interconectar los diferentes elementos que añadamos a la zona de diseño pulsaremos en el icono de la izquierda de más abajo (el que parece un conector RJ45). Al hacerlo se nos dará a elegir varios modos automáticos de interconexión, yo le doy siempre a "Manual" que me parece el más intuitivo. Tras eso, el cursor pasará a una cruz con la que no tendremos más que señalar los dos equipos que queremos interconectar entre sí y los puertos que queremos utilizar en cada extremo.

Una vez hecha nuestra topología de laboratorio, puede ser que queramos darle acceso a Internet. Es ese caso tendremos que usar el objeto "Cloud", que está junto al de "Virtualbox guest" y "Qemu guest". Para hacerlo funcionar seguí un excelente artículo de otro usuario de Blogger. Básicamente la técnica consiste en crear un interfaz de loopback en nuestro ordenador, dar permisos para que el mismo utilice nuestra tarjeta de red para conectarse a Internet y luego asociar este interfaz de loopback al objeto "Cloud" dentro de GNS3.

En Windows 7, los interfaces de loopback se pueden crear en la ventana de "Administrador de dispositivos" del "Panel de Control", utilizando la opción "Acción -> Agregar hardware heredado". Allí, tras darle a "Siguiente", cuando nos den a elegir optaremos por seleccionar el dispositivo manualmente de la lista. Después iremos a la categoría de "Adaptadores de red" y elegiremos la marca "Microsoft". En la lista que nos aparezca encontraremos la opción de "Microsoft loopback adapter " o "Adaptador de bucle invertido" según nuestra traducción. Con esto ya tendremos instalado el adaptador de loopback como una tarjeta de red más de nuestro ordenador.

Una vez que contemos con un interfaz de loopback, lo siguiente es permitirle usar nuestra tarjeta de red para acceder a Internet. En " Panel de control -> Redes e Internet -> Centro de redes y recursos compartidos" seleccionaremos la tarejta de red que usemos habitualmente para salir a Internet y, en sus "Propiedades" accederemos a la pestaña de "Uso compartido". Allí marcaremos la opción "Permitir que los usuarios de otras redes se conecten a través de la conexión a Internet de este equipo" y en la lista de "Conexión de red doméstica" seleccionaremos nuestro adaptador de loopback.

Y ya sólo queda el último paso, asociar el objeto "Cloud" del GNS3 al interfaz de loopback. Para ello pulsaremos con el botón derecho en el objeto "Cloud" de la zona de diseño y seleccionaremos "Configure". Allí veremos una ventana como esta:


En ella, en la pestaña "NIO Ethernet" seleccionaremos el interfaz de loopback y pulsaremos en "Add" y luego en "Apply".

El interfaz de loopback adquirirá una dirección privada que podremos averiguar en la consola con un simple "ipconfig":



Esa dirección IP es la que tendrá el objeto "Cloud" y será contra la que tendremos que dirigir el tráfico que queramos que salga de nuestro laboratorio hacia Internet. Conceptualmente será como la IP del PoP de nuestro ISP. Igual que pasaría en ese caso, hay que tener en cuenta que nuestro ordenador, como nuestro ISP, no conoce el direccionamiento interno utilizado en nuestro laboratorio. Para asegurar que las respuestas son capaces de volver a la red virtual del laboratorio hay dos opciones:

  • Poner una ruta en el ordenador que apunte hacia las redes virtuales, usando como gateway la IP del router virtual que se enfrente con la IP de la Cloud.
  • Hacer PAT en dicho router usando esa IP.
En mi caso prefiero la segunda opción, aunque puede haber situaciones en los que sea mejor optar por la primera.

Con eso ya tendremos un laboratorio plenamente funcional en lo que se refiere a equipamiento de red Cisco. Sin embargo queda por describir lo que a mi juicio es una de las características más potentes de GNS3: su capacidad de integrar máquinas virtuales de Virtualbox. Gracias a ello, si no tenemos acceso a firmwares de Cisco siempre podemos utilizar appliances "open source" basados en arquitectura PC como Vyatta, Open vSwitch, Endian o Untangle, con los que simular routers, switches y cortafuegos en nuestros laboratorios. Por supuesto, también podremos colocar las imágenes virtuales de nuestros Linux y Windows en cualquuier punto de nuestra topología simulada haciendo de equipos finales. Eso sí, si pensamos usar muchos dispositivos de Virtualbox simultáneamente en nuestros laboratorios ya podemos ir equipando nuestro ordenador con toda la RAM que podamos, la vamos a necesitar.

Para empezar, tenemos que crear en Virtualbox las imágenes virtuales que queramos introducir en GNS3. Para no andar reinstalando una y otra vez las máquinas virtuales lo mejor es crear una máquina virtual con la configuración base para todos nuestros laboratorios y luego, cuando queramos hacer un laboratorio concreto, hacer un clon enlazado de la máquina base. Al usar un clon enlazado ahorraremos espacio de disco duro ya que en el clon sólo se almacenarán los datos diferenciales con respecto a la imagen base. De esa manera podremos tener múltiples clones de una misma máquina base a un coste irrisorio de disco duro.

Una vez que tengamos las máquinas virtuales creadas tenemos que importarlas en GNS3 mediante "Edit -> Preferences -> Virtualbox -> VirtualBox Guest".



Allí crearemos un objeto de GNS3 y lo enlazaremos a la máquina de virtualbox que deseemos definiendo además cuantos interfaces de red queremos que tenga el objeto. Por lo que he visto, el combo box que muestra las máquinas de virtualbox a la que queremos asociar el objeto ("VM List" en la foto) no siempre se inicia bien y se queda vacío, en ese caso hay que pulsar el botón "Refresh VM List" para actualizarlo. Ahora viene lo más raro del asunto y con lo que he tenido que hacer bastantes pruebas hasta dar con la clave. Por lo que he visto, los objetos deben tener como mínimo dos tarjetas de red (NICs). Reconozco que la razón no acabo de tenerla clara, pero buceando por Internet he llegado a la conclusión de que se debe a que se dedica un interfaz a la comunicación interna de la máquina de Virtualbox con GNS3 y otra para hacer de interfaz virtual con la red del laboratorio. Una vez fijado el número de interfaces que queremos que tenga el objeto pulsaremos "Save" y "OK".

En teoría, en Virtualbox no hay que hacer nada, pero si a la configuración de interfaces que tenemos fuera de GNS3 se mezcla con la que crea este podemos acabar teniendo un montón de interfaces con distintas configuraciones corriendo en el laboratorio, lo que puede resultar bastante confuso. Para simplificar las cosas, lo que suelo hacer antes de arrancar mis máquinas virtuales en GNS3 es desactivar todos los interfaces que tienen configurados en Virtualbox poniendolos en "No conectado" y quitando el check de "Habilitar adaptador de red". Parece raro, pero lo cierto es que aunque dejemos sin interfaces la máquina virtual en VirtualBox GNS se encarga de crear dos por su cuenta. No es muy intuitivo, pero a mi me funciona así.

Una vez en la ventana de diseño podemos situar la máquina recién creada arrastrando el icono de "VirtualBox Guest" y seleccionando el nombre del objeto que hemos creado en los párrafos anteriores. A partir de ahí, para conectar los objetos entre si, pulsaremos el último botón de la izquierda, el que tiene un icono de un conector RJ-45 y seleccionaremos el modo de conexión "Manual". He probado el resto de los modos de conexión pero reconozco que no me resultan nada intuitivos, por eso prefiero sencillamente el "Manual".

Una vez establecidas las conexiones, arrancaremos las máquinas virtuales y las configuraremos para la red del laboratorio. Al arrancar las máquinas, desde VirtualBox veremos que en ellas se crea un interfaz del tipo "Generic Driver" y otro que será el que se conecte a nuestro laboratorio virtual y que deberemos configurar para que se conecte al resto. Saber cual es cual dentro de la máquina virtual de GNS3 tiene algo de prueba y error, o al menos yo no he acabado de ver un patrón claro de asignación, pero con dos interfaces tampoco hay muchas posibilidades. Configuramos un interface y si se hace ping al resto de los elementos del laboratorio significa que hemos dado con el que nos interesaba y que podemos olvidarnos del otro y hacer como si no existiera. Si hemos configurado el laboratorio para que cuente con un servidor de DHCP y nuestra máquina virtual para hacer uso de él, identificar el interfaz con conectividad será mucho más fácil.

Aún con todos estos trucos, GNS3 es tremendamente potente y la riqueza de laboratorios que podemos crear sólo tiene su límite en la cantidad de máquinas virtuales que podamos ejecutar simultáneamente en nuestra memoria RAM.