2  Uso básico de Kathará

Kathará es un sistema ligero y de software libre para la emulación de redes basado en contenedores Docker. Permite crear escenarios de red en los que los dispositivos se emulan mediante contenedores interconectados por redes virtuales de nivel de enlace. Es el sucesor de una herramienta previa similar, Netkit. Está desarrollado por investigadores del grupo de Redes de la Universidad Roma Tre. El nombre Kathará procede del griego Καθαρά (kathará), que significa puro o puramente.

2.1 netgui-kathará

NetGUI-Kathará es un frontend gráfico para Kathará desarrollado en GSyC/MobiQuo URJC. Su objetivo es facilitar la creación, configuración y ejecución de laboratorios de Kathará mediante una interfaz gráfica, evitando tener que trabajar directamente con los ficheros de configuración y los comandos de Kathará.

Es especialmente útil para crear escenarios. Pero teniendo en cuenta que en PST2 los estudiantes trabajarán con unos pocos escenarios, preconfigurados por los profesores, no es necesario que los alumnos usen NetGUI, pueden usar Kathará directamente.

2.2 Prerrequisitos

Kathará está basado en Docker. Para poder usarlo:

  • Es necesario que tu usuario pertenezca al grupo docker. Compruébalo ejecutando en una shell de Linux el comando id.

    Si no perteneces al grupo, díselo a un profesor para que se lo comunique a los administradores de los laboratorios de la EIF.

  • Es necesario que tu directorio home tenga permisos de lectura y ejecución para others.

    • Para activarlos, ejecuta el comando chmod 755 ~

    • El problema es que esto permite que cualquier usuario entre en tu home. Para evitarlo, cuando acabes de trabajar con el laboratorio kathará, vuelve a quitar permisos con el comando chmod 700 ~

    • Para evitar que se te olviden estos dos pasos, es conveniente añadir ambos comandos a un script que inicie y detenga kathrá. Lo haremos en la práctica 1.

El código de Kathará y de tus práctica estará en un repositorio git. Para poder trabajar de forma cómoda con git es conveniente indicar desde la shell cuál es tu editor de texto (sin gráficos) favorito: nano, mcedit, vim, joe, etc. En caso de duda, usa nano. En estas instrucciones, supondremos nano. Reemplázalo por tu editor preferido, si hace falta.

  1. Edita el fichero ~/.bashrc. Puede que no lo tengas.

    nano ~/.bashrc
  2. Añade la siguiente línea

    export EDITOR=nano

    Guarda el fichero y sal del editor.

  3. Este cambio no se aplica inmediatamente. Es necesario que cierres y abras la sesión. O que ejecutes

    source ~/.bashrc

2.3 El aboratorio

En Kathará, un laboratorio (lab) es un escenario completo de experimentación que describe una topología de red y todos los elementos necesarios para reproducirla.

Un laboratorio está formado por:

  • Un conjunto de máquinas (hosts, routers, switches, etc.).
  • Las conexiones entre ellas.
  • La configuración inicial de cada dispositivo.
  • Los ficheros y scripts necesarios para su funcionamiento.

Cada máquina del laboratorio se ejecuta como una máquina virtual, concretamente un contenedor Docker, con su propio sistema de ficheros, sus interfaces de red y sus procesos. Kathará crea automáticamente las redes virtuales necesarias para interconectar los dispositivos según la topología definida.

Un laboratorio se representa simplemente mediante un directorio del sistema de ficheros. En él se encuentran los ficheros de configuración generales, los directorios correspondientes a cada máquina y, opcionalmente, recursos compartidos por todas ellas. De esta forma, todo el escenario puede copiarse, comprimirse, almacenarse o distribuirse fácilmente a otros usuarios.

2.4 Estructura básica de un laboratorio Kathará

Un laboratorio sencillo puede tener esta estructura:

mi-laboratorio/
├── lab.conf
├── pc1/
├── r1/
├── pc2/
├── pc1.startup
├── r1.startup
├── pc2.startup
└── shared/

Cada elemento tiene una función diferente.

2.4.1 lab.conf

Es el fichero principal de configuración del laboratorio.

Define principalmente:

  • qué dispositivos forman parte del laboratorio;
  • qué interfaces de red tiene cada dispositivo;
  • a qué redes (collision domains) está conectada cada interfaz;
  • y, opcionalmente, otras opciones de configuración de los dispositivos.

Por ejemplo:

pc1[0]=A
r1[0]=A
r1[1]=B
pc2[0]=B

Esto conecta:

pc1 ─── A ─── r1 ─── B ─── pc2

El fichero lab.conf pertenece al laboratorio y no se copia dentro de los contenedores.


2.4.2 pc1/, r1/, pc2/

Son directorios que contienen archivos adicionales específicos de cada dispositivo.

El contenedor ya dispone de su propio sistema de ficheros, proporcionado por la imagen Docker que utiliza Kathará. El contenido de pc1/ se copia / monta sobre el sistema de ficheros raíz (/) del contenedor pc1, complementándolo. Lo mismo sucede con r1/ y pc2/.

Por ejemplo, si el laboratorio contiene:

pc1/
├── etc/
│   └── mi-config.conf
└── scripts/
    └── prueba.sh

dentro del contenedor pc1 esos archivos aparecerán como:

/etc/mi-config.conf
/scripts/prueba.sh

Los directorios y archivos que ya proporciona la imagen Docker, como /bin, /usr, /var, etc., siguen estando presentes aunque no aparezcan en pc1/. Por tanto, pc1/ no es una copia ni una representación completa del sistema de ficheros del contenedor: es un conjunto de archivos adicionales que Kathará monta sobre él.

Por este motivo, los directorios pc1/, r1/ y pc2/ pueden estar completamente vacíos en un laboratorio sencillo. Solo son necesarios cuando queremos proporcionar archivos específicos a esos dispositivos.


2.4.3 pc1.startup, r1.startup, pc2.startup

Son scripts de shell que Kathará ejecuta durante el arranque de cada dispositivo.

Por ejemplo:

pc1.startup

podría contener:

ip addr add 192.168.1.10/24 dev eth0
ip link set eth0 up

Cuando se inicia pc1, Kathará ejecuta esas órdenes dentro del contenedor pc1.

Por tanto, pc1.startup:

  • no es un fichero que normalmente tengamos que buscar dentro del contenedor;
  • es un script que Kathará utiliza para inicializar el dispositivo;
  • sus órdenes se ejecutan en el contexto del sistema de ficheros y la red de pc1.

Lo mismo sucede con r1.startup para r1 y pc2.startup para pc2.

Los scripts se ejecutan utilizando como intérprete el device_shell configurado en Kathará (normalmente /bin/bash).


2.4.4 shared/

Es un directorio especial del laboratorio.

Su contenido se monta dentro de todos los dispositivos bajo:

/shared

Por ejemplo, si tenemos:

shared/
├── fichero.txt
└── datos/
    └── prueba.txt

entonces desde pc1 podremos acceder a:

/shared/fichero.txt
/shared/datos/prueba.txt

y desde r1:

/shared/fichero.txt
/shared/datos/prueba.txt

y desde pc2:

/shared/fichero.txt
/shared/datos/prueba.txt

A diferencia de los directorios pc1/, r1/, etc., shared/ no se copia independientemente a cada contenedor: se monta como un directorio compartido.

Por defecto, esta funcionalidad está activada y /shared permite intercambiar archivos entre el sistema anfitrión y los dispositivos del laboratorio.


2.5 Comandos básicos de Kathará

En el directorio con el lab, ejecutar

  • kathara lstart:

    Arranca el laboratorio.

  • kathara lclean:

    Detiene y elimina el laboratorio.

  • kathara connect <dispositivo>:

    Abre una consola en un dispositivo ya arrancado. Ejemplo: kathara connect pc1

    Normalmente no será necesario, Kathará abrirá automáticamente un terminal para cada dispositivo.

  • kathara list:

    Muestra los laboratorios/dispositivos en ejecución.

  • kathara check:

    Comprueba que el entorno de Kathará está correctamente configurado.

2.6 tests

Para ejecutar los test de integración,

  1. Iniciar el lab Kathará, ejecutando desde su directorio
kathara lstart
  1. Exportar en la shell la variable de entorno ROUTER_LAB_DIR, dándole como valor la dirección del directorio con el laboratorio Kathará. Ejemplo:
export ROUTER_LAB_DIR=~/pst2/lab01
  1. Ejecutar dentro del directorio del proyecto PDRouter
cargo test

2.7 Instalación en tu ordenador

En los laboratorios docentes de la EIF ya tienes listo todo lo necesario para usar Kathará. Pero si quieres instalarlo en tu propio ordenador, ejecuta este script:

#!/usr/bin/env bash
set -euo pipefail

echo "=== 1. Actualizando índice e instalando dependencias de Docker ==="
sudo apt update
sudo apt install -y ca-certificates curl gnupg

echo "=== 2. Configurando el repositorio oficial de Docker ==="
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg --yes
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

echo "=== 3. Instalando Docker Engine ==="
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

echo "=== 4. Añadiendo usuario al grupo docker ==="
sudo usermod -aG docker "$USER"

echo "=== 5. Añadiendo repositorio PPA e instalando Kathará ==="
sudo add-apt-repository -y ppa:katharaframework/kathara
sudo apt update
sudo apt install -y kathara

echo ""
echo "=========================================================="
echo " ¡Instalación finalizada con éxito!"
echo "=========================================================="
echo "Para aplicar los cambios del grupo 'docker' sin reiniciar la sesión, ejecuta:"
echo "    newgrp docker"
echo "Y comprueba el estado con:"
echo "    kathara check"
echo "=========================================================="