Crea tu propio laboratorio IT con Vagrant, VirtualBox y GNS3

En este post vengo a hablar de cómo podemos montar y gestionar fácilmente un entorno de máquinas virtuales para crear nuestro propio laboratorio IT. La idea es crear un laboratorio en el que se pueda desplegar y provisionar máquinas virtuales en un entorno de red emulado. De forma que no solo hagamos despliegue rápido de máquinas con las que poder practicar, sino que también se emule toda la topología y dispositivos de red, proporcionándonos un laboratorio de redes avanzado.

Requisitos:

  • VirtualBox: (Hipervisor para ejecutar VM)
  • Vagrant: (Aprovisionamiento de las VM)
  • GNS3: (Emulación de red )
  • packer (Opcional)

Despliegue de las máquinas virtuales con Vagrant y VirtualBox

Para quien no lo conozca, VirtualBox permite crear y ejecutar máquinas virtuales, lo que significa que podemos ejecutar sistemas operativos en un entorno aislado dentro de su sistema principal. La instalación es bastante sencilla, únicamente hay que ir a su web y bajarse el ejecutable compatible con tu S.O.

A la hora de configurar máquinas virtuales, el método tradicional consiste en bajarse una ISO con el S.O que queremos instalar e instalarlo como lo haríamos sobre el Hardware directamente. Este método está lejos de ser el más efectivo, lo mejor sería aplicar DevOps para automatizar el despliegue y justo para eso usaremos vagrant.

Vagrant es una herramienta de automatización de infraestructura que le permite crear y administrar entornos virtuales, nos permite desplegar toda la infraestructura necesaria, desde la topología de red, balanceadores de carga, bases de datos hasta servidores. Funciona con boxes que permiten a todo el mundo replicar un entorno de trabajo idéntico en los sistemas compatibles. Se pueden buscar y compartir boxes desde la Vagrant Cloud (https://app.vagrantup.com/boxes/search)

El primer paso será instalar Vagrant, desde su Web podéis ver las instrucciones según vuestro S.O.

Enlace para descargar Vagrant (https://developer.hashicorp.com/vagrant/downloads)

Una vez instalado, procederemos a instalar el plugin de las guest-aditions, este plugin instalara automáticamente las guest-adittions en VirtualBox

vagrant plugin install vagrant-vbguest

Comenzaremos importando las boxes que necesitamos del vagrant cloud, algunas boxes interesantes pueden ser:

  • kalilinux/rolling (Atacante)
  • rapid7/metasploitable3-win2k8 (Victima)
  • rapid7/metasploitable3-ub1404 (Victima)
  • mmckinst/dvwa (Victima)

Para añadir las boxes ejecutamos

vagrant box add <box>

Ver lista de box instaladas

vagrant box list

Crearemos una carpeta nueva por cada VM y en esa carpeta procedemos a inicializar la box

vagrant init <box>

Al inicializarla se crea un archivo de configuración vagrantfile, en el que reside la configuración de la máquina virtual. Aquí podemos modificar parámetros como la RAM asignada, configuración de red y más.

Antes de definir la configuración en el Vagrantfile, hay que tener en cuenta que por defecto vagrant:

  • Crea el usuario «vagrant» con password «vagrant».
  • Establece el primer adaptador de red como NAT (proporcionando salida a internet)
  • Comparte la carpeta que contiene el vagrantfile con la vm «/vagrant»

Un ejemplo de configuración de Vagrantfile para la box de «kalilinux/rolling» podría ser:

Vagrant.configure("2") do |config|
  config.vm.box = "kalilinux/rolling"
  config.vm.hostname = "Kali"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.ssh.username = "vagrant"
  config.ssh.password = 'vagrant'
  config.vm.provider "virtualbox" do |vb|
     vb.memory = "2048"
     vb.name = "Kali Linux"
  end 
  config.vm.provision "shell", inline: <<-SHELL
     apt-get update
     apt-get install -y locales
     echo "es_ES.UTF-8 UTF-8" >> /etc/locale.gen
     locale-gen es_ES.UTF-8
     update-locale LANG=es_ES.UTF-8 LANGUAGE
     setxkbmap es
  SHELL
end

Observando esta configuración podemos ver que se define las credenciales de acceso via ssh, el nombre , la RAM del host, la configuración de red y un script inline que instala el idioma español.

Respecto a la configuración de red, podemos ver como aparte del adaptador NAT creado por defecto a mayores hemos añadido otro adaptador en modo hostonly (línea config.vm.network «private_network»), en el cual establece la configuración IP de la red privada.

Todas las VM que despleguemos con un adaptador hostonly en la misma red se van a poder comunicar. Lo que implica que únicamente definiendo esta opción ya tenemos lo necesario para poder conectarnos desde una VM atacante a una VM víctima.

Los distintos modos de conexión que tenemos con las VMs son:

ModoVM -> HostHost -> VMVM1 -> VM2VM -> LanVM <- Lan
Host-only+++
Internal+
Bridge+++++
NAT+Port Forwarding+Port Forwarding
NAT Service+Port Forwarding++Port Forwarding

Ahora que ya hemos definido el vagrantfile, levantamos la máquina

vagrant up

Una vez levantada, nos podemos conectar vía ssh a la máquina de forma simple con el comando

vagrant ssh <nombre maquina>

Para recargar la configuración al hacer cambios en el vagrantfile

vagrant reload --provision

Para apagar una box

vagrant halt

Instalación del cliente GNS3 y la VM de GNS3

Con lo visto hasta ahora, ya se pueden comunicar las distintas VM que despleguemos, entonces ¿para qué usamos GNS3? Pues bien, GNS3 nos proporcionara la capacidad de realizar una emulación de una red compleja, proporcionándonos un laboratorio de redes muy potente, no solo podemos poner en marcha simulaciones sobre GNS3, sino que también podemos combinar dispositivos tanto reales como virtuales.

Comenzaremos instalando el cliente de GNS3 y la VM de GNS3. Desde el cliente controlaremos y diseñaremos la topología de red, y en la VM se ejecutaran los distintos dispositivos de red que añadamos.

La instalación del cliente no tiene mucha complicación, descarga el instalador, y sigue los pasos de instalación que se muestra en la web (https://www.gns3.com/software/download).

Para la instalación de la VM únicamente debemos descargar de la web de GNS3 la VM, obtendremos un .ova que podemos importar con facilidad a VirtualBox. Esta VM estaría fuera del alcance de Vagrant, ya que no se trata de una box, pero esto tiene fácil solución

Creación de boxes personalizadas con Packer

No siempre encontraremos en Vagrant Cloud todas las boxes que necesitamos. Para crear boxes personalizados podemos usar el software Packer. A modo de ejemplo, emplearé Packer para generar una box de la VM de GNS3. Para ello, comenzaremos descargando la VM de GNS3 en la misma versión que nuestro cliente de GNS3 (https://gns3.com/software/download-vm). Una vez descargado fichero .ova con la VM debemos definir un fichero de configuración JSON incluyendo el path del .ova y el output de la box, como podemos ver en la configuración adjunta.

{
  "builders": [
    {
   "name": "GNS3vmPacker",
   "type": "virtualbox-ovf",
   "source_path" : "GNS3 VM.ova", 
   "ssh_username" : "gns3",
   "ssh_password" : "gns3",
   "ssh_wait_timeout": "30s",
   "shutdown_command": "echo 'packer' | sudo -S shutdown -P now"
    }],
  "post-processors": [{
    "type": "vagrant",
    "keep_input_artifact": true,
    "output": "GNS3.box"
  }]
}

Packer no solo permite generar boxes partiendo de un .ova, también lo podemos usar para isos, lo cual nos puede ser muy útil para configurar nuestro entorno virtual.

Una vez definida la configuración, debemos ejecutar el comando para construir la box

packer build <conf_file>

Creada la box, solo queda añadirla a las boxes de vagrant

vagrant box add --name <name> <box>

Otra opción para obtener la box de una VM sin usar Packer, sería importar la VM y ejecutar

VBoxManage list vms
vagrant package --base <vm_id>

Desplegando la VM de GNS3

Como ya hemos creado una box de la VM de GNS3 para instalarla VM únicamente debemos inicializar la box y establecer la siguiente configuración en el vagrantfile

Vagrant.configure("2") do |config|
  config.vm.box = "GNS3VM"
  config.vm.hostname = "GNS3vm"
  config.ssh.username = "gns3"
  config.ssh.password = 'gns3'
  #Añadimos interfaz host only
  config.vm.network "private_network", :type => 'dhcp'
  #Exponemos puertos para acceder desde nuestro localhost
  config.vm.network "forwarded_port", guest: 80, host: 8000, protocol: "tcp"
  config.vm.network "forwarded_port", guest: 3080, host: 13080, protocol: "tcp"
  config.vm.provider "virtualbox" do |vb|
     vb.gui = false
     vb.memory = "4096"
     vb.cpus = 4
     vb.name = "GNS3 VM"
  end
  config.vm.provision "shell", inline: <<-SHELL
     apt-get update
  SHELL
end

Aclaración: Es totalmente necesario especificar que el adaptador «hostonly» este en modo DHCP, dado que GN3 lo necesita. A la hora de configurarlo y establecer la red privada con DHCP en el Vagranfile es posible que nos salga este error:

Para arreglarlo se puede añadir estas líneas al comienzo del Vagrantfile

#FIX host-only errors with dhcp
class VagrantPlugins::ProviderVirtualBox::Action::Network
  def dhcp_server_matches_config?(dhcp_server, config)
    true
  end
end

Por otro lado, se puede ver en la configuración se hace Port forwarding de los puertos 80 y 3080. Como la primera interfaz se configura en NAT requerimos del renvió de puertos, para poder conectarnos desde el anfitrión a estos puertos.

  • El puerto 80 contiene un servidor web que nos permite utilizar GNS3 vía web, proporcionándonos de un laboratorio básico de redes
  • El puerto 3080 es el puerto que usa la VM GNS3 por defecto para comunicarse con el cliente de GNS3.

Acceso a GNS3 vía Web:

Configurado el laboratorio en GNS3

En primer lugar, debemos vincular el cliente de GNS3 con la VM, para ello desde la aplicación de cliente tenemos que especificarle que ejecute los dispositivos de red en la máquina virtual. Para ello debemos ir a «Help > Setup Wizard» y seguir los siguientes pasos

Establecemos la IP y puerto de la máquina virtual, en mi caso como en la configuración se ha establecido un reenvío de puertos del 3080 al 13080, he de emplear este último puerto.

Ahora que ya tenemos conexión con la máquina virtual, hemos de instalar nuevos dispositivos en la VM, ya que los que vienen por defecto pueden no ser suficientes para crear realizar algunas pruebas de red.

Desde el marketplace de GN3 podemos descargar distintas plantillas de dispositivos (https://gns3.com/marketplace/appliances)

Algunas plantillas interesantes que podemos descargar:

  • Network Automation: Contenedor que incluye Ansible,Netmiko
  • C7200: Router Cisco
  • CiscoIOSvL2: Switch de capa 2 accesible por consola (el switch por defecto de GNS3 no es accesible por consola)

Al descargarlo obtenemos un fichero .gns3a. Para importar el fichero únicamente debemos ir a «File > Import Appliance» y marcamos la opción de instalar en la máquina virtual.

Posteriormente nos pedirá el path de qemu (software de virtualización empleado por GNS3VM para emular los dispositivos de red). El cliente de gns3 detectara automáticamente el path

Para finalizar la instalación del dispositivos, debemos importar la imagen del dispositivo. En la propia información del applicance en el marketplace de GNS3 podemos encontraremos el enlace desde el que podemos bajar la imagen y el fichero de configuración

Seleccionamos una versión y le damos a siguiente para finalizar la instalación del dispositivo

Añadiendo nuestras máquinas virtuales a la red GNS3

Para añadir nuestras maquinas virtuales a la red tenemos ir a «Edit > Preferences > VirtualBox VMs» y darle a «new». Después hemos de seleccionar la opción de «ejecutar la maquina virtual en mi ordenador local». Una vez hecho esto GNS3 detectara las VM que tenemos instalados en Virtualbox. Seleccionamos la maquina que queremos añadir y le damos a finalizar.

Ahora , tenemos que darle al botón de «Edit» vamos a la pestaña de «Network» y establecemos la siguiente configuración

La configuración de red sobrescribirá a la configuración guarda en VM, en mi caso establezco 2 adaptadores de red por cada host y muy importante marcar la casilla que permite que GNS3 use cualquiera de los adaptadores de VirtualBox configurados.

Como podemos ver, la configuración del adaptador en VirtualBox se ha modificado, al igual que la configuración IP, la cual debemos establecer a mano en la máquina.

Ahora ya tenemos lo necesario para comenzar a montar nuestro laboratorio. Podéis crear una topología personalizada o desde la marketplace de GNS3 descargaros una serie de laboratorios de redes preconfiguradas.

A modo de ejemplo podéis ver en esta imagen cómo usando lo visto hasta ahora, podemos comunicar nuestras máquinas virtuales de VirtualBox con la topología de red que despleguemos en GNS3.

Y hasta aquí el post, espero que os sea de utilidad.

Deja un comentario

Esta web funciona gracias a WordPress.com.

Subir ↑

Diseña un sitio como este con WordPress.com
Comenzar