Saltar a contenido

Práctica OpenStack

En esta ocasión vamos a ver como configurar un escenario de OpenStack el cual vamos a usar durante todo el curso. Este escenario está compuesto de 4 máquinas: 2 instancias en OpenStack y dos contenedores LXC que se ejecutará en una de las instancias.


El dominio será un subdominio de fabio.gonzalonazareno.org. Finalmente tendremos:

  • Máquina 1: Instancia en OpenStack con Debian 12 Bookworm que se llama odin.fabio.gonzalonazareno.org.
  • Máquina 2: Instancia en OpenStack con Rocky Linux 9 que se llama hela.fabio.gonzalonazareno.org.
  • Máquina 3: Contenedor LXC con Ubuntu 22.04 que se llama thor.fabio.gonzalonazareno.org.
  • Máquina 4: Contenedor LXC con Ubuntu 22.04 que se llama loki.fabio.gonzalonazareno.org.

Escenario

Escenario

Creación de las máquinas en OpenStack

1. Crea un nuevo router llamado RouterPractica conectado a la red externa.

openstack router create routerpractica
openstack router set routerpractica --external-gateway ext-net

2. Crea una red interna que se llame Red Intra de tu_usuario, con las siguientes características:

  • Está conectada al router que has creado en el punto anterior.
  • Direccionamiento: 10.0.200.0/24
  • Con DHCP y DNS (172.22.0.1).
  • La puerta de enlace de los dispositivos conectados a esta red será el 10.0.200.1.
openstack network create "Red intra de fabio.gonzalez"
openstack subnet create --network "Red intra de fabio.gonzalez" --subnet-range 10.0.200.0/24 --dns-nameserver 172.22.0.1 --dhcp 172.22.0.1

Para especificar mi subred he usado el ID, ya que esta no tiene nombre

openstack router add subnet routerpractica ac1ee726-ddfd-464d-a7b4-e24a69149042

3. Crea una red interna que se llame Red DMZ de tu_usuario, con las siguientes características:

  • Direccionamiento: 172.16.0.0/16
  • Con DHCP y DNS (172.22.0.1).
  • La puerta de enlace de los dispositivos conectados a esta red será el 172.16.0.1.
openstack network create "Red DMZ de fabio.gonzalez"
openstack subnet create --network "Red DMZ de fabio.gonzalez" --subnet-range 172.16.0.0/16 --dns-nameserver 172.22.0.1 --dhcp 172.22.0.1

4. Las dos instancias que vamos a crear se van a configurar con cloud-init de la siguiente manera:

  • Deben actualizar los paquetes de la distribución de la instancia.
  • El dominio utilizado será del tipo tunombre.gonzalonazareno.org. Por lo tanto en la configuración con cloud-init habrá que indicar el hostname y el FQDN.
  • Se crearán dos usuarios:
  • Un usuario sin privilegios. Se puede llamar como quieras (pero el nombre será el mismo en todas las máquinas) y accederás a las máquinas usando tu clave ssh privada.
  • Un usuario profesor, que puede utilizar sudo sin contraseña. Copia de las claves públicas de todos los profesores en las instancias para que puedan acceder con el usuario profesor.
  • Cambia la contraseña al usuario root.

5. Creación de la máquina1 (odin):

  • Crea una instancia sobre un volumen de 15Gb, usando una imagen de Debian 12 Bookworm. Elige el sabor vol.medium. Y configuralá con cloud-init como se ha indicado anteriormente.
openstack volume create --bootable --size 15 --image "Debian 12 Bookworm" odin
openstack server create --flavor vol.medium \
--volume odin \
--security-group default \
--key-name "Fabio Gonzalez del Valle" \
--network "Red intra de fabio.gonzalez" \
--user-data cloud-config.yaml \
odin
  • Está instancia estará conectada a la red Red Intra de tu_usuario. Asigna a la instancia una IP flotante.
openstack floating ip create ext-net
openstack server add floating ip odin 172.22.201.66

6. Configuración de la máquina1 (odin):

  • Conecta la instancia a tu Red DMZ, asígnale la dirección 172.16.0.1 para que sea la puerta de enlace las máquinas conectadas a esta red (recuerda que deberás configurar la red de la instancia para que tome dicha configuración).
openstack server add network odin "Red DMZ de fabio.gonzalez"
openstack port create --network "Red DMZ de fabio.gonzalez" --fixed-ip ip-address=172.16.0.1 puerto-odin
openstack server add port odin puerto-odin
  • Deshabilita la seguridad de los puertos en las dos interfaces de red para que funcione de manera adecuada el NAT.
openstack server remove security group odin default
openstack port set --disable-port-security puerto-odin
openstack port set --disable-port-security f01ff47d-90d0-49eb-9581-535ae67f69be
  • Configura de forma permanente la regla SNAT para que las máquinas de la Red DMZ tengan acceso a internet.
sudo iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o ens3 -j MASQUERADE

Para hacer las reglas permanentes podemos meterlas en el fichero interfaces, pero en este caso no contamos con el, así que lo que haremos será descargar el paquete iptables-persistent. Si hemos creado la regla antes de la instalación del paquete, esta regla será guardada automáticamente.

7. Creación de la máquina2 (hela):

  • Está instancia se conectará a la Red DMZ. Usando un puerto asigna a esta máquina la dirección 172.16.0.200.
 openstack port create --network "Red DMZ de fabio.gonzalez" --fixed-ip ip-address=172.16.0.200 hela
  • Crea una instancia sobre un volumen de 15Gb, usando una imagen de Rocky Linux 9. Elige el sabor vol.normal. Y configúrala con cloud-init como se ha indicado anteriormente.
 openstack volume create --bootable --size 15 --image "Rocky Linux 9" hela
openstack server create --flavor vol.normal \
--volume hela \
--security-group default \
--key-name "Fabio Gonzalez del Valle" \
--network "Red DMZ de fabio.gonzalez" \
--port hela \
--user-data cloud-config-hela.yaml \
hela
  • Deshabilita la seguridad de los puertos en la interfaz de red para que funcione de manera adecuada el NAT.
openstack server remove security group hela default
openstack port set --disable-port-security hela
  • Comprueba que tiene acceso a internet. Si no tiene acceso a internet, no se han actualizado los paquetes con cloud-init, hazlo posteriormente..

En este punto de la práctica, mi topología de red se encuentra de la siguiente manera:

topologia

Instalación de los contenedores

En maquina1 vamos a crear dos contenedores en un red interna, para ello:

1. Crea en máquina1 (odin) un linux bridge.

Crea en maquina1 un linux bridge llamado br-intra (no lo hagas con virsh ya que se configura una reglas de cortafuego muy estrictas) y asigna una dirección IP estática 192.168.0.1. Esta será la IP de máquina1 (odin) conectada a este switch virtual y será la puerta de enlace de los contenedores. Tienes que tener en cuenta que la imagen de Debian 12 Bookworm de OpenStack tiene netplan para la configuración de las redes, por lo tanto tienes que configurar el bridge usando el fichero de configuración de netplan, para ello te puede ser útil esta página. No olvides poner la mtu a 1450 al crear el bridge.

Para crear el puente tendremos que modificar la configuración del fichero netplan. Añadimos las siguientes lineas:

bridges:
      br-intra:
        addresses: [192.168.0.1/24]
        mtu: 1450
        dhcp4: no
        dhcp6: no
        nameservers:
          addresses: [172.22.0.1]

2. Crear contenedores

Instala LXC y crea dos contenedores con la distribución Ubuntu 22.04. Estos contenedores serán la máquina3 (thor) y la máquina4 (loki).

Para instalar LXC haremos un:

sudo apt install lxc

Ahora pasaremos a crear ambos contenedores:

  • Thor
lxc-create -n thor -t ubuntu -- -r jammy
  • Loki
lxc-create -n loki -t ubuntu -- -r jammy

3. Configura de forma permanente la regla SNAT para que los contenedores tengan acceso a internet.

Simplemente agregamos la siguiente regla:

sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens3 -j MASQUERADE

4. Conectar los contenedores a br-intra

Conecta los contenedores al bridge br-intra y configúralo de forma estática con las siguientes direcciones: máquina3 (thor) la 192.168.0.2 y máquina4 (loki) la 192.168.0.3. Su DNS será el 172.22.0.1.

Tendremos que configurar el fichero netplan en ambos contenedores:

  • Thor
network:
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.0.2/24]
      mtu: 1450
      nameservers:
        addresses: [172.22.0.1]
  version: 2
  • Loki
network:
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.0.3/24]
      mtu: 1450
      nameservers:
        addresses: [172.22.0.1]
  version: 2

5. Modificar el MTU

Para que la red de OpenStack funcione de forma adecuada las imágenes que usamos tienen configurado la mtu (Unidad máxima de transferencia) a 1450 bytes. Tenemos que adecuar los contenedores a este tamaño de trama. Para ello introduce en la configuración de los contenedores la línea: lxc.net.0.mtu = 1450.

Para ello tendremos que modificar el fichero config de ambos contenedores, este fichero podremos encontrarlo en /var/lib/lxc/'nombrecontenedor'

lxc.net.1.type = veth
lxc.net.1.hwaddr = 00:16:3e:53:52:cd
lxc.net.1.link = br-intra
lxc.net.1.flags = up
lxc.net.1.mtu = 1450

Para aplicar los cambios apagamos y encendemos el contenedor.

6. Configura los contenedores para que se auto inicien al reiniciar la instancia.

Para ello, añadimos la siguiente línea en el fichero config antes mencionado. Esto debemos hacerlo para ambos contenedores:

lxc.start.auto = 1

7. Los contenedores tendrán características parecidas a las instancias anteriormente:

  • Debes actualizar los paquetes de la distribución instalada.
sudo apt update
  • El dominio utilizado será del tipo tunombre.gonzalonazareno.org. Por lo tanto configura de manera adecuada el hostname y el FQDN.

Para ello tendremos que modificar el fichero /etc/hosts en ambas máquinas:

root@loki:~# hostname -f
fabio.gonzalonazareno.org
root@thor:~# hostname -f
fabio.gonzalonazareno.org
  • Para acceder a los contenedores vamos a usar ssh.
  • Crea dos usuarios:

  • Un usuario sin privilegios. Se puede llamar como quieras (el nombre de usuario que usaste en las instancias) y accederás a los contenedores usando tu clave ssh privada.

Para esto crearemos el usuario fabio:

useradd -m -s /bin/bash fabio

Con este comando hemos especificado que el usuario tendrá directorio personal en /home/fabio y usará una shell bash.

Para poder acceder a este usuario por ssh sin contraseña añadiré mi clave pública al fichero authorized_keys

  • Un usuario profesor, que puede utilizar sudo sin contraseña. Copia de las claves públicas de todos los profesores en los contenedores para que puedan acceder con el usuario profesor.

Repetiremos el proceso anterior.

  • Cambia la contraseña al usuario root.
sudo mkpasswd root