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
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 concloud-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 utilizarsudo
sin contraseña. Copia de las claves públicas de todos los profesores en las instancias para que puedan acceder con el usuarioprofesor
. - 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á concloud-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 concloud-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:
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 utilizarsudo
sin contraseña. Copia de las claves públicas de todos los profesores en los contenedores para que puedan acceder con el usuarioprofesor
.
Repetiremos el proceso anterior.
- Cambia la contraseña al usuario
root
.
sudo mkpasswd root