Descripción

En esta tarea se va a crear el escenario de trabajo que se va a usar durante todo el curso, que va a constar inicialmente de 4 máquinas: 2 instancias en OpenStack y dos contenedores LXC que se ejecutarán en una de las instancias.

Para nombrar las máquinas se va a utilizar alfa, bravo, charlie y delta, que son las primeras letras de un alfabeto que nació antes de la Primera Guerra Mundial en respuesta a los avances en la radio bidireccional compatible con la voz, para mejorar la comunicación en circuitos telefónicos de baja calidad y de larga distancia.

Además el dominio será un subdominio de la forma tunombre.gonzalonazareno.org. De esta forma tendremos:

  • Máquina 1: Instancia en OpenStack con Debian 11 Bullseye que se llama alfa.tunombre.gonzalonazareno.org.
  • Máquina 2: Instancia en OpenStack con Rocky Linux 9 que se llama bravo.tunombre.gonzalonazareno.org.
  • Máquina 3: Contenedor LXC con Ubuntu 20.04 que se llama charlie.tunombre.gonzalonazareno.org.
  • Máquina 4: Contenedor LXC con Ubuntu 20.04 que se llama delta.tunombre.gonzalonazareno.org.

La creación y configuración (conexión a las redes, creación de volumen, quitarle la seguridad alos puertos, …) de la máquina1 (alfa) la debes hacer con OSC. Lo demás lo puedes hacer con horizon.

Escenario

Instalación de las instancias en OpenStack

  1. Creamos 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: 192.168.202.2.
    • La puerta de enlace de los dispositivos conectados a esta red será el 172.16.0.1.
    openstack network create Red\ DMZ\ de\ mariajesus
    openstack subnet create --network Red DMZ de mariajesus --subnet-range 172.16.0.0/16 --dhcp --gateway 172.16.0.0 --dns-nameserver 192.168.202.2 Red\ DMZ\ de\ mariajesus
    
  2. 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.
  3. Creación de la máquina1 (alfa):

    • Crea una instancia sobre un volumen de 30Gb, usando una imagen de Debian 11 Bullseye. Elige el sabor vol.medium. Y configuralá con cloud-init como se ha indicado anteriormente.

    • Está instancia estará conectada a tu red interna. Asigna a la instancia una IP flotante.

      openstack volume create --image "Debian 11 Bullseye" --size 30 vol.alfa
      ----
      openstack server create --flavor vol.medium \
          --volume vol.alfa \
          --security-group default \
          --key-name pass \
          --network "red de mariajesus.alloza" \
          --user-data config-alfa.yaml \
          alfa
      ----
      openstack floating ip create ext-net
      openstack server add floating ip alfa 172.22.201.46
      
    • Fichero config-alfa.yaml

      #cloud-config
      package_update: true
      package_upgrade: true
      preserve_hostname: false
      fqdn: alfa.mariajesus.gonzalonazareno.org
      hostname: alfa
      # Crear un usuario y añadir clave pública ssh
      users:
        - name: profesor
          sudo: ALL=(ALL) NOPASSWD:ALL
          shell: /bin/bash
          passwd: 
          ssh_authorized_keys:
            ssh-rsa AAAA************** jose@debian
            ssh-rsa AAAA************** rafa@eco
        - name: maria
          shell: /bin/bash
          passwd: debian
          ssh_authorized_keys:
            ssh-rsa *************************************************** maria@debian
      chpasswd:
        list: |
          root:AkfJE64jFke82    
        expire: False
      
  4. Configuración de la máquina1 (alfa):

    • 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.

      openstack port create --network Red\ DMZ\ de\ mariajesus --fixed-ip ip-address=172.16.0.1 alfa-port
      openstack server add port alfa alfa-port
      
    • 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 alfa
      openstack port set --disable-port-security alfa-port
      openstack port set --disable-port-security 
      
    • Configura de forma permanente la regla SNAT para que las máquinas de la Red DMZ tengan acceso a internet.

      iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o ens3 -j MASQUERADE
      iptables-save > /etc/iptables/rules.v4
      
  5. Creación de la máquina2 (bravo):

    • Está instancia se conectará a la red DMZ. Usando un puerto asigna a esta máquina la dirección 172.16.0.200.

    • Crea una instancia sobre un volumen de 30Gb, usando una imagen de Rocky Linux 9. Elige el sabor vol.normal. Y configurala con cloud-init como se ha indicado anteriormente.

      openstack volume create --image "Rocky Linux 9" --size 30 vol.bravo
      openstack port create --network Red\ DMZ\ de\ mariajesus --fixed-ip ip-address=172.16.0.200 bravo-port 
      ----
      openstack server create --flavor vol.normal \
      --volume vol.bravo \
      --security-group default \
      --key-name pass \
      --port bravo-port \
      --user-data config-bravo.yaml \
      bravo
      
    • Fichero config-bravo.yaml

      #cloud-config
      package_update: true
      package_upgrade: true
      preserve_hostname: false
      fqdn: bravo.mariajesus.gonzalonazareno.org
      hostname: bravo
      # Crear un usuario y añadir clave pública ssh
      users:
        - name: profesor
          sudo: ALL=(ALL) NOPASSWD:ALL
          shell: /bin/bash
          passwd: 
          ssh_authorized_keys:
            ssh-rsa AAAA************** jose@debian
            ssh-rsa AAAA************** rafa@eco
        - name: maria
          shell: /bin/bash
          passwd: debian
          ssh_authorized_keys:
            ssh-rsa *************************************************** maria@debian
      chpasswd:
        list: |
          root:AkfJE64jFke82    
        expire: False
      
    • Deshabilita la seguridad de los puertos en la interfaz de red para que funcione de manera adecuada el NAT.

    • Comprueba que tiene acceso a internet. Si no tiene acceso a internet, no se han actualizado los paquetes con cloud-init, hazlo posteriormente.

Instalación de los contenedores LXC

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

  1. Crea en máquina1 (alfa) un linux bridge llamado br-intra y asigna una dirección IP estática 192.168.0.1. Esta será la IP de máquina1 (alfa) conectada a este switch virtual y será la puerta de enlace de los contenedores.

    • Instalamos el paquete bridge-utils y qemu-kvm para crear el bridge.

      apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst
      apt install bridge-utils
      
    • Definimos el archivo br-intra.xml

      <network>
      <name>br-intra</name>
      <bridge name='br-intra'/>
      <forward/>
      <ip address='192.168.0.1' netmask='255.255.255.0'>
      </ip>
      </network>
      
    • Creamos el bridge

      virsh net-define br-intra.xml
      virsh net-start br-intra
      virsh net-autostart br-intra
      
  2. Instala LXC y crea dos contenedores con la distribución Ubuntu 20.04. Estos contenedores serán la máquina3 (charlie) y la máquina4 (delta).

    sudo apt install lxc
    
    • creamos los contenedores
    lxc-create -n charlie -t ubuntu -- -r focal
    lxc-create -n delta -t ubuntu -- -r focal
    
  3. Configura de forma permanente la regla SNAT para que los contenedores tengan acceso a internet.

    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens3 -j MASQUERADE
    iptables-save > /etc/iptables/rules.v4
    
  4. Conecta los contenedores al bridge br-intra y configúralo de forma estática con las siguientes direcciones: máquina3 (charlie) la 192.168.0.2 y máquina4 (delta) la 192.168.0.3.

    • CHARLIE

      lxc-start -n charlie
      nano /var/lib/lxc/charlie/config
      
      ----
      lxc.net.0.type = veth
      lxc.net.0.link = br-intra
      lxc.net.0.flags = up
      ---
      
      lxc-stop -n charlie
      lxc-start -n charlie
      lxc-attach -n charlie
      vim /etc/netplan/10-lxc.yaml
      
      network:
          version: 2
          renderer: networkd
          ethernets:
              eth0:
                  dhcp4: no
                  addresses: [192.168.0.2/24]
                  gateway4: 192.168.0.1
      
      netplan apply
      
    • DELTA

      lxc-start -n delta
      nano /var/lib/lxc/delta/config
      
      ----
      lxc.net.0.type = veth
      lxc.net.0.link = br-intra
      lxc.net.0.flags = up
      ---
      
      lxc-stop -n delta
      lxc-start -n delta
      lxc-attach -n delta
      vim /etc/netplan/10-lxc.yaml
      
      network:
          version: 2
          renderer: networkd
          ethernets:
              eth0:
                  dhcp4: no
                  addresses: [192.168.0.3/24]
                  gateway4: 192.168.0.1
      
      netplan apply
      
  5. 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.

    echo "lxc.net.0.mtu = 1450" >> /var/lib/lxc/charlie/config
    echo "lxc.net.0.mtu = 1450" >> /var/lib/lxc/delta/config
    
  6. Configura los contenedores para que se auto inicien al reiniciar la instancia.

     ```bash
    

    echo “lxc.start.auto = 1” » /var/lib/lxc/charlie/config echo “lxc.start.auto = 1” » /var/lib/lxc/delta/config

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

    • Debes actualizar los paquetes de la distribución instalada.

      lxc-attach -n charlie -- apt install openssh-server
      lxc-attach -n delta -- apt install openssh-server
      
    • El dominio utilizado será del tipo tunombre.gonzalonazareno.org. Por lo tanto configura de manera adecuda el hostname y el FQDN.

      lxc-attach -n charlie -- hostnamectl set-hostname
      charlie.maria.gonzalonazareno.org
      lxc-attach -n delta -- hostnamectl set-hostname
      delta.maria.gonzalonazareno.org
      lxc-attach -n charlie -- hostnamectl
      lxc-attach -n delta -- hostnamectl
      
    • Para acceder a los contenedores vamos a usar ssh.

      ssh ubuntu@192.168.0.2
      ssh ubuntu@192.168.0.3
      
      ssh-copy-id -i ~/.ssh/pass -o ProxyJump=maria@172.22.201.46 maria@192.168.0.2
      ssh-copy-id -i ~/.ssh/pass -o ProxyJump=maria@172.22.201.46 maria@192.168.0.3
      
    • 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.

        lxc-attach -n charlie -- adduser maria
        lxc-attach -n delta -- adduser maria
        
      • 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.

        • Añadimos el usuario profesor a los contenedores.

          lxc-attach -n charlie -- adduser profesor
          lxc-attach -n delta -- adduser profesor  
          
        • Modificamos el ficher /etc/sudoers para que el usuario profesor pueda utilizar sudo sin contraseña.

          #CHARLIE
          ssh -J maria@172.22.201.46 ubuntu@192.168.0.2
          sudo visudo
          ---
          profesor ALL=(ALL) NOPASSWD:ALL
          -----
          
          #DELTA
          ssh -J maria@172.22.201.46 ubuntu@192.168.0.3
          sudo visudo
          ---
          profesor ALL=(ALL) NOPASSWD:ALL
          -----
          
        • Copiamos las claves públicas de los profesores en los contenedores.

          #CHARLIE
          ssh -J maria@172.22.201.46 ubunto@192.168.0.2
          mkdir /home/profesor/.ssh
          vim /home/profesor/.ssh/authorized_keys
          
          #DELTA
          sh -J maria@172.22.201.46 ubunto@192.168.0.3
          mkdir /home/profesor/.ssh
          vim /home/profesor/.ssh/authorized_keys
          
        • Cambia la contraseña al usuario root.

          lxc-attach -n charlie -- passwd
          #root
          lxc-attach -n delta -- passwd
          #root
          

Pruebas

  1. Comprobación de los FQDN y acceso por ssh

    • ALFA
    • BRAVO
    • CHARLIE
    • DELTA
  2. Comprobación de acceso a internet

    • ALFA
    • BRAVO
    • CHARLIE
    • DELTA