Ir al contenido principal

Examen de Servicios en Red con Contenedores Linux

Como ya comenté en un artículo anterior, en este curso estoy utilizando contenedores Linux con el software LXD en mis clases de Servicios en Red. En cursos anteriores cuando tenía que preparar el examen práctico lo hacía con un servidor ESXi que tenía montado. Creaba una máquina virtual para cada alumno donde se conectaban de forma remota utilizando SSH para realizar el examen. 

Este proceso me llevaba tiempo. Primero creaba una máquina virtual donde instalaba la última versión de Ubuntu Server LTS, esta máquina virtual me iba a servir luego de plantilla. Actualizaba el sistema operativo. Luego le añadía todos los usuarios necesarios para cada alumno, con el comando Linux newusers este paso es relativamente rápido. A continuación, instalaba todos los paquetes de software necesarios para la realización del examen. Borraba el historial y apagaba la máquina virtual para utilizarla de plantilla. Ahora me dedicaba a clonar dicha máquina tantas veces como alumnos tuviese matriculados. Este proceso era lento, un buen rato para cada máquina virtual en mi servidor ESXi. Por último entraba en cada una de ellas y personalizaba las direcciones IP.

Mejor con contenedores

La semana pasada tuvimos el primer examen práctico, pero esta vez preparé contenedores en vez de máquinas virtuales. El proceso fue muy rápido comparado con el uso de máquinas virtuales. Primero creé un contenedor con la última versión de Ubuntu Server LTS, Bionic Beaver. Este paso supuso tan sólo unos segundos:

$ lxc launch ubuntu:bionic plantilla_examen

Ahora sólo tenía que preparar esta plantilla para el examen. Tras conectarme a la misma con:

$ lxc exec plantilla_examen bash

sólo quedaba actualizarla, cargarle los usuarios (una vez más con newusers), instalarle los paquetes de software necesarios para el examen y borrar el historial. Este proceso es el que se puede llevar algo más de tiempo según las necesidades.

Una vez preparada la plantilla, por comodidad, la convierto en una imagen para poder crear fácilmente contenedores nuevos:

      $ lxc stop plantilla_examen
      $ lxc publish plantilla_examen --alias imagen-examen

A continuación, sólo queda crear los contenedores para los alumnos (en este curso sólo 15). Utilizando bucles desde la terminal el proceso es bastante rápido:

$ for i in {01..15}
> do
>   lxc launch local:imagen-examen exa$i
> done

Este comando nos crea 15 contenedores llamados exa01, exa02, ..., exa15, a partir de la imagen que se encuentra en el repositorio local. Como me gusta ponerle una dirección IP estática a los mismos, con las siguientes instrucciones se consigue (en este otro artículo expliqué hace unas semanas estos comandos):

$ for i in {1..9}
> do
>   lxc stop exa0$i
>   lxc network attach lxdbr0 exa0$i eth0
>   lxc config device set exa0$i eth0 ipv4.address 172.30.10.$i
>   lxc start exa0$i
> done

Nótese que el comando no me acepta que una dirección IP tenga ceros a la izquierda, por ese motivo se realiza en dos partes, las inferiores a 10 y el resto:

$ for i in {10..15}
> do
>   lxc stop exa0$i
>   lxc network attach lxdbr0 exa0$i eth0
>   lxc config device set exa0$i eth0 ipv4.address 172.30.10.$i
>   lxc start exa0$i
> done

Por último, les tomé una instantánea como punto de restauración:

$ for i in {01..15}
> do
>   lxc snapshot exa$i
> done

Todo este proceso me llevó menos de diez minutos, cuando en cursos anteriores empleaba cerca de ¡dos horas en prepararlo todo!

Redirigiendo el tráfico

Los contenedores los tengo en un servidor Linux que no está conectado directamente a la red local del aula. En mi caso, los ordenadores del aula están conectados entre sí por medio de un switch y el ordenador del profesor cuenta con dos tarjetas de red. Una de ellas conecta el ordenador a la red del aula y hace de puerta de enlace de la misma. La otra lo conecta a una red en la que se encuentran el resto de los ordenadores de los profesores de otras aulas, así como los servidores del departamento.

El servidor que contiene los contenedores se encuentra en esta otra red y a su vez cuenta con un puente software (bridge) para conectar los contenedores a la tarjeta de red del propio servidor. Esto es algo que hace LXD de forma automática cuando se instala (en este otro artículo explico como instalar LXD). Cada vez que un paquete llega a esta máquina, el puente redirige el tráfico a los contenedores si la dirección IP de destino coincide con la dirección de red de los contenedores. Es decir, el puente se encarga de todo automáticamente.

El problema está en como hacer llegar los paquetes que proceden de la red del aula al servidor que contiene los contenedores. Como el ordenador del profesor es a su vez la puerta de enlace del aula, cada paquete de red que vaya destinado a los contenedores pasará por el ordenador del profesor. Ahora sólo habrá que redirigir este tráfico al servidor que contiene los contenedores. En mi caso particular, los contenedores se encuentran en la red 172.30.0.0/16 y el servidor Linux que los alberga tiene como dirección IP 10.255.253.1. Con estos datos ya podemos redirigir el tráfico de red. El siguiente comando se encarga de ello:

$ route add -net 172.30.0.0 netmask 255.255.0.0 gw 10.255.253.1

El comando simplemente añade una nueva ruta a la tabla de enrutamiento del ordenador del profesor. En otros entornos, a lo mejor, hay que añadir una ruta nueva al router del aula o si el servidor se encuentra en la propia red del aula, habrá que añadirle la ruta a los propios ordenadores de los alumnos.

Y esto es todo por esta semana.

@josrrp

Comentarios

Entradas populares de este blog

Instalando Moodle con Docker

En este blog ya hemos hablado en varios artículos sobre la tecnología de contenedores, pero hasta ahora nos habíamos centrado en LXD . En este artículo vamos a explicar cómo podemos instalar Moodle en menos de un minuto (dependiendo de la velocidad de descarga que se tenga, se puede alargar un poco más) usando contenedores. Acerca de Moodle No voy a explicar que es Moodle ni como instalarlo desde cero, para eso existe en Internet multitud de tutoriales. Lo que sí quiero comentar es que para instalar Moodle hace falta un servidor web con PHP . Además requiere que PHP tenga instalado una serie de componentes adicionales. Por otro lado, necesitamos tener instalado en el servidor un sistema de gestión de bases de datos relacional, ya que Moodle almacena la información en él. Normalmente se utiliza MySQL , MariaDB o PostgreSQL . También debemos crear una base de datos específica para Moodle con su respectivo usuario. Durante la instalación Moodle creará las tablas necesari

Analizando el protocolo HTTP

El objetivo de este artículo es el de explicar de forma práctica el funcionamiento del protocolo HTTP y entender el intercambio de datos que se realiza entre los servidores y los clientes web. Por otro lado, cubre la necesidad de tener un texto en español que sirva de referencia a mis alumnos de Servicios en Red  a la hora de realizar la práctica de clase  HTTP-1 . La idea es ver de forma práctica el funcionamiento interno del protocolo HTTP . Para ello, vamos a utilizar un par de herramientas de la línea de comandos de Linux ( telnet y netcat ), con las que vamos a simular el comportamiento tanto del navegador como del servidor web. HTTP es un protocolo de la capa de aplicación, y como muchos otros protocolos de esta capa, está basado en texto. De hecho, los comandos que envía el navegador al servidor y sus respuestas se pueden leer perfectamente en inglés. Por defecto, HTTP utiliza el puerto 80 TCP y HTTPS  el puerto 443 TCP. Los ejemplos que vamos a ilustrar serán

ZFS, Primera parte

Cuando el año pasado instalé LXD y lo configuré por primera vez, me encontré que podía utilizar, de hecho se recomienda, el sistema de ficheros ZFS para albergar los contenedores. Posteriormente, cuando instalé Proxmox en el servidor de mi departamento, me encontré de nuevo con  ZFS . Anteriormente no le había prestado mucha atención a  ZF S , normalmente utilizo EXT4 o XFS , pero estaba claro que había una estrecha relación entre  ZFS  y los sistemas de virtualización. ZFS  es un sistema de ficheros desarrollado por Sun Microsystems  (creadores también del lenguaje de programación Java ), posteriormente la empresa fue adquirida por Oracle , actuales propietarios. OpenZFS  es la variante libre y posee una licencia de tipo  CDDL , que aunque es software libre, es incompatible con GPL . Por este motivo, el kernel de Linux no lo incorpora de serie. Sin embargo, los usuarios pueden instalarlo sin problemas ya que se encuentra en los repositorios de la mayoría de las distribucione