[Reto] – Infraestructura virtualizada con Ubuntu Server

El objetivo de esta práctica es diseñar, instalar, configurar y documentar una pequeña infraestructura virtual compuesta por varias máquinas Ubuntu Server conectadas en red local.

Cada máquina deberá tener una función concreta dentro del sistema y deberá relacionarse con las demás. El alumno tendrá que demostrar conocimientos de instalación de sistemas operativos, virtualización, configuración de red, instalación de servicios, administración del sistema, seguridad, automatización y documentación técnica.

Requisitos del proyecto

Debes crear al menos 3 máquinas virtuales Ubuntu Server con IP fija:

  • un servidor web
  • un servidor de base de datos
  • un servidor de administración o mantenimiento

Debes realizar, como mínimo, las siguientes tareas

  • instalar Ubuntu Server en las máquinas virtuales
  • configurar la red local y las IP fijas
  • instalar y configurar Apache en el servidor web
  • instalar y configurar MySQL o MariaDB en el servidor de base de datos
  • comprobar la comunicación entre el servidor web y el de base de datos
  • administrar servicios con systemctl
  • consultar registros con journalctl
  • aplicar reglas básicas de seguridad con ufw
  • crear scripts Bash de mantenimiento
  • automatizar tareas con cron
  • documentar todo el proceso en un README técnico

La entrega deberá incluir

  • README.md principal
  • capturas o evidencias organizadas por apartados
  • scripts utilizados
  • archivos de configuración relevantes
  • comprobaciones finales de funcionamiento

Importante

No se valorará únicamente que “funcione”, sino que el trabajo esté bien explicado, justificado y documentado. Cada apartado debe mostrar comandos, explicación de su uso, resultado obtenido y evidencias del funcionamiento.

Objetivos didácticos

Con este proyecto el alumno deberá demostrar que sabe:

  • Crear y configurar máquinas virtuales
  • Instalar Ubuntu Server
  • Asignar IP fija a cada máquina
  • Configurar red local entre máquinas
  • Instalar y administrar servicios como:
    • Apache o Nginx
    • MySQL o MariaDB
  • Gestionar servicios con systemctl
  • Consultar registros con journalctl
  • Configurar reglas básicas de seguridad con ufw
  • Crear scripts Bash para tareas de mantenimiento
  • Programar tareas automáticas con cron
  • Verificar conectividad y dependencias entre sistemas
  • Documentar de forma técnica el trabajo realizado

Propuesta de arquitectura

┌─────────────────────────────────────────────────────────────┐
│                 ENTORNO DE VIRTUALIZACIÓN                   │
│         (VirtualBox / VMware / Proxmox / similar)           │
└─────────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────────┐
│                  RED LOCAL VIRTUALIZADA                     │
│                     192.168.50.0/24                         │
└─────────────────────────────────────────────────────────────┘
        │                         │                         │
        ▼                         ▼                         ▼

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│      web01      │     │      db01       │     │     admin01     │
│ 192.168.50.10   │     │ 192.168.50.20   │     │ 192.168.50.30   │
├─────────────────┤     ├─────────────────┤     ├─────────────────┤
│ Ubuntu Server   │     │ Ubuntu Server   │     │ Ubuntu Server   │
│ Apache / HTTP   │     │ MySQL / MariaDB │     │ SSH / Scripts   │
│ Página web      │     │ Base de datos   │     │ Cron / Control  │
└─────────────────┘     └─────────────────┘     └─────────────────┘
        │                         ▲                         │
        │ consulta datos          │                         │
        └─────────────────────────┘                         │
                  conexión remota                           │
                                                            │
                                                            │ administración,
                                                            │ comprobación,
                                                            │ mantenimiento
                                                            ▼
                                        ┌──────────────────────────────┐
                                        │  Scripts + logs + cron +     │
                                        │      comprobaciones          │
                                        └──────────────────────────────┘

Para que el proyecto tenga sentido, conviene que las máquinas tengan relación entre sí.

Máquina 1: servidor web

  • Nombre: web01
  • IP fija: 192.168.1.10
  • Servicios:
    • Apache2
    • Página web de prueba
  • Función:
    • Servir una web que muestre información del sistema
    • Conectarse a la base de datos remota para validar que existe comunicación

Máquina 2: servidor de base de datos

  • Nombre: db01
  • IP fija: 192.168.1.20
  • Servicios:
    • MySQL Server o MariaDB
  • Función:
    • Alojar una base de datos
    • Permitir conexión desde web01
    • Tener usuarios y permisos configurados

Máquina 3: servidor de administración / monitorización básica

  • Nombre: admin01
  • IP fija: 192.168.1.30
  • Servicios y funciones:
    • Acceso por SSH a las otras máquinas
    • Scripts de mantenimiento
    • Tareas programadas por cron
    • Recolección de información del sistema
  • Función:
    • Ejecutar scripts
    • Hacer comprobaciones de red
    • Centralizar tareas administrativas básicas

Relación de dependencia entre máquinas

  • web01 depende de db01 porque debe conectarse a la base de datos remota
  • admin01 depende de web01 y db01 porque debe administrarlas o comprobar su estado
  • todas deben estar en la misma red local virtual y responder entre sí
graph TD
    A[Entorno de virtualización] --> B[Red local virtual 192.168.50.0/24]

    B --> C[web01<br>192.168.50.10<br>Ubuntu Server<br>Apache]
    B --> D[db01<br>192.168.50.20<br>Ubuntu Server<br>MySQL / MariaDB]
    B --> E[admin01<br>192.168.50.30<br>Ubuntu Server<br>SSH / Scripts / Cron]

    C -->|Consulta remota| D
    E -->|Administración y comprobación| C
    E -->|Administración y comprobación| D

    C --> F[Servicio web activo]
    D --> G[Base de datos activa]
    E --> H[Scripts de mantenimiento]
    E --> I[Tareas automáticas con cron]
    E --> J[Comprobación de logs y servicios]

    C --> K[UFW]
    D --> K
    E --> K

    F --> L[Documentación README]
    G --> L
    H --> L
    I --> L
    J --> L
    K --> L

Requisitos mínimos del proyecto

El alumno deberá cumplir, como mínimo, lo siguiente:

Virtualización

  • Crear 3 máquinas virtuales
  • Asignar recursos coherentes
  • Instalar Ubuntu Server en todas

Red

  • Configurar una red local virtual
  • Asignar IP fija a cada máquina
  • Verificar conectividad con ping

Servicios

  • Instalar Apache en web01
  • Instalar MySQL o MariaDB en db01
  • Comprobar que el servicio web funciona desde navegador o con curl
  • Comprobar que la base de datos acepta conexiones

Administración

  • Usar comandos de terminal durante todo el proyecto
  • Gestionar servicios con systemctl
  • Consultar logs con journalctl

Seguridad

  • Activar y configurar ufw
  • Permitir solo los puertos necesarios
  • Explicar qué puertos se abren y por qué

Automatización

  • Crear al menos 2 scripts Bash
  • Programar al menos 2 tareas con cron

Fases del proyecto

flowchart TD
    A[Planificación] --> B[Virtualización]
    B --> C[Instalación de sistemas]
    C --> D[Configuración de red]
    D --> E[Conectividad]

    E --> F[Servidor web]
    E --> G[Servidor de base de datos]

    F --> H[Comunicación entre servicios]
    G --> H

    H --> I[Administración de servicios]
    I --> J[Revisión de logs]
    J --> K[Seguridad con UFW]
    K --> L[Scripts de mantenimiento]
    L --> M[Tareas automáticas con cron]
    M --> N[Pruebas finales]
    N --> O[Documentación README y evidencias]

Fase 1. Creación de la infraestructura virtual

Tareas

  1. Instalar el software de virtualización
    • VirtualBox, VMware o similar
  2. Crear 3 máquinas virtuales
  3. Asignar nombre a cada una
  4. Instalar Ubuntu Server en cada una

Evidencias obligatorias

  • Captura del software de virtualización mostrando las 3 máquinas
  • Captura del proceso de instalación o del sistema ya instalado
  • Tabla con nombre, RAM, disco y función de cada VM

Qué debe explicar en el README

  • Qué programa de virtualización ha utilizado
  • Qué recursos ha asignado a cada VM
  • Por qué ha organizado así la infraestructura

Fase 2. Configuración de red

Tareas

  1. Configurar red local entre las máquinas
  2. Asignar IP fija a cada sistema
  3. Comprobar conectividad

Ejemplo de tabla de red

MáquinaIPMáscaraPuerta de enlaceFunción
web01192.168.50.10255.255.255.0192.168.50.1 o vacía si no aplicaWeb
db01192.168.50.20255.255.255.0192.168.50.1 o vacía si no aplicaBD
admin01192.168.50.30255.255.255.0192.168.50.1 o vacía si no aplicaAdministración

Comprobaciones que deben hacer

  • ip a
  • hostnamectl
  • ping entre máquinas

Evidencias obligatorias

  • Archivo de configuración de red o capturas del mismo
  • Resultado de ip a
  • Resultado de pings exitosos entre las máquinas

Qué debe explicar en el README

  • Cómo ha configurado la IP fija
  • Qué problemas encontró
  • Cómo comprobó que la red funciona

Fase 3. Instalación y configuración del servidor web

Tareas

En web01:

  1. Instalar Apache2
  2. Arrancar y habilitar el servicio
  3. Crear una página de prueba
  4. Comprobar acceso desde la propia máquina y desde otra

Comandos que deberían usar

sudo apt update
sudo apt install apache2 -y
sudo systemctl enable apache2
sudo systemctl start apache2
sudo systemctl status apache2

Página mínima sugerida

Una página HTML que muestre:

  • nombre del servidor
  • IP
  • fecha
  • descripción del proyecto

Evidencias obligatorias

  • Captura de systemctl status apache2
  • Captura del navegador o curl http://192.168.50.10
  • Captura del contenido de la página web

Qué debe explicar en el README

  • Qué hace Apache
  • Dónde se encuentra el directorio web
  • Cómo ha comprobado que el servicio está funcionando

Fase 4. Instalación y configuración del servidor de base de datos

Tareas

En db01:

  1. Instalar MySQL o MariaDB
  2. Habilitar y arrancar el servicio
  3. Crear una base de datos
  4. Crear un usuario con permisos
  5. Permitir acceso desde web01

Posible estructura

  • Base de datos: empresa
  • Tabla: servicios
  • Usuario remoto: webuser

Evidencias obligatorias

  • Captura de systemctl status mysql
  • Captura del acceso al cliente MySQL
  • Captura o volcado SQL con creación de base y usuario

Qué debe explicar en el README

  • Qué motor ha instalado
  • Qué usuario creó y con qué permisos
  • Qué diferencia hay entre usuario local y remoto
  • Cómo ha validado la conexión

Fase 5. Comunicación entre servidor web y servidor de base de datos

Aquí está la gracia del invento. No queremos máquinas decorativas.

Tareas

Desde web01:

  1. Comprobar conectividad con db01
  2. Instalar cliente MySQL si hace falta
  3. Conectarse a la base de datos remota
  4. Insertar o consultar datos

Evidencias obligatorias

  • ping 192.168.50.20
  • conexión por cliente a MySQL remoto
  • captura de consulta SQL exitosa

Qué debe explicar en el README

  • Por qué web01 depende de db01
  • Qué configuración fue necesaria para permitir el acceso remoto
  • Qué medidas de seguridad tomó

Fase 6. Gestión de servicios y logs

Tareas

En las distintas máquinas:

  1. Consultar el estado de Apache y MySQL
  2. Reiniciar y detener servicios
  3. Ver logs con journalctl

Comandos mínimos que deben demostrar

sudo systemctl status apache2
sudo systemctl restart apache2
sudo systemctl stop apache2
sudo systemctl start apache2
journalctl -u apache2
journalctl -u mysql
journalctl -xe

Evidencias obligatorias

  • Captura de systemctl status
  • Captura de journalctl -u apache2
  • Captura de journalctl -u mysql o equivalente

Qué debe explicar en el README

  • Qué diferencia hay entre iniciar, parar, reiniciar y habilitar un servicio
  • Para qué sirve journalctl
  • Qué información útil encontró en los logs

Fase 7. Seguridad básica con UFW

Tareas del alumno

En cada máquina:

  1. Instalar o activar ufw
  2. Definir política básica
  3. Abrir solo los puertos necesarios

Ejemplo

  • web01: permitir 22 y 80
  • db01: permitir 22 y 3306 solo si procede
  • admin01: permitir 22

Comandos orientativos

sudo ufw enable
sudo ufw status verbose
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 3306/tcp

Evidencias obligatorias

  • Captura de ufw status verbose
  • Explicación de qué puertos se han abierto
  • Justificación de seguridad

Qué debe explicar en el README

  • Qué es un firewall
  • Qué puertos necesita cada máquina
  • Qué riesgos existirían si se abrieran más puertos de la cuenta

Fase 8. Scripts de mantenimiento

Tareas

Crear al menos dos scripts Bash.

Script 1: comprobación del sistema

Debe mostrar:

  • hostname
  • IP
  • uso de disco
  • uso de memoria
  • fecha
  • estado de un servicio

Script 2: copia de logs o informe de mantenimiento

Debe:

  • crear una carpeta de copias o informes
  • guardar fecha y hora
  • copiar un log o generar un resumen del sistema a un archivo

Ejemplo de ideas

  • check_web.sh
  • backup_logs.sh
  • estado_sistema.sh

Evidencias obligatorias

  • Código de los scripts
  • Captura de ejecución
  • Explicación línea por línea o por bloques

Qué debe explicar en el README

  • Para qué sirve cada script
  • Cómo se ejecuta
  • Qué permisos necesita
  • Qué salida genera

Fase 9. Automatización con cron

Tareas

Programar al menos dos tareas automáticas:

  • una para ejecutar un script de mantenimiento
  • otra para generar un informe o copia

Comandos esperados

crontab -e
crontab -l

Evidencias obligatorias

  • Captura de crontab -l
  • Captura o prueba del archivo generado por cron
  • Explicación del formato del cron

Qué debe explicar en el README

  • Qué tarea automatizó
  • Cada cuánto se ejecuta
  • Cómo verificó que realmente se ejecutó


Plantilla de README

Puedes darles esta estructura para obligarles a documentar bien.

# Proyecto: infraestructura virtualizada con Ubuntu Server

## 1. Datos del alumno
- Nombre:
- Curso:
- Módulo:
- Fecha:

## 2. Introducción
Explica brevemente en qué consiste el proyecto y cuáles son sus objetivos.

## 3. Diseño de la infraestructura
### 3.1 Máquinas virtuales creadas
| Máquina | Función | IP | Sistema operativo |
|---|---|---|---|

### 3.2 Relación entre máquinas
Explica cómo se comunican y de qué depende cada una.

## 4. Instalación de Ubuntu Server
Describe el proceso de creación e instalación de cada máquina virtual.

### Evidencias
- Capturas
- Configuración asignada
- Observaciones

## 5. Configuración de red
Explica cómo configuraste la IP fija en cada máquina.

### Comandos utilizados
~~~bash
ip a
ping

Estructura de entrega recomendada

Puedes utilizar esta estructura para la documentación:

proyecto/
│
├── README.md
├── evidencias/
│   ├── 01-virtualizacion/
│   ├── 02-red/
│   ├── 03-web/
│   ├── 04-bd/
│   ├── 05-seguridad/
│   ├── 06-scripts/
│   └── 07-cron/
│
├── scripts/
│   ├── check_web.sh
│   └── backup_logs.sh
│
├── configuracion/
│   ├── netplan-web01.yaml
│   ├── netplan-db01.yaml
│   └── netplan-admin01.yaml
│
└── sql/
    └── bd_inicial.sql

Evidencias que puedes incluir en la documentación

(capturas y explicación)

Instalación y configuración de Apache

Explica la instalación del servidor web en web01.

Comandos utilizados

sudo apt update
sudo apt install apache2 -y

Verificación

Explica cómo comprobaste que funciona.

Instalación y configuración de MySQL/MariaDB

Explica la instalación del servidor de base de datos en db01.

Comandos utilizados

sudo apt install mysql-server -y

Verificación

Explica cómo comprobaste que funciona.

Comunicación entre servicios

Explica cómo el servidor web accede al servidor de base de datos.

Pruebas realizadas

  • ping
  • conexión remota
  • consulta SQL

Gestión de servicios con systemctl

Explica qué comandos usaste para iniciar, parar, reiniciar y habilitar servicios.

Consulta de logs con journalctl

Indica qué logs revisaste y qué información encontraste.

Seguridad con UFW

Explica qué reglas configuraste y por qué.

Scripts de mantenimiento

Script 1

  • Nombre:
  • Función:
  • Código:
  • Resultado:

Script 2

  • Nombre:
  • Función:
  • Código:
  • Resultado:

Tareas programadas con cron

Explica qué tareas automatizaste y cómo las comprobaste.

Comprobaciones finales

Incluye evidencias de:

  • IP fija
  • conectividad entre máquinas
  • Apache funcionando
  • MySQL funcionando
  • firewall activo
  • scripts funcionando
  • cron funcionando

Problemas encontrados y soluciones

Describe los errores o dificultades y cómo los resolviste.

Cómo verificar que realmente ha hecho el trabajo

Esto es clave. Hay que pedir pruebas que huelan a trabajo real y no a “copié cuatro cosas de internet y recé”. Para demostrar que es una implementación real, puedes ir incluyendo en la documentación (Donde toque) el resultado de algunso comandos.

Identificación del sistema

En cada máquina:

hostnamectl
ip a
lsb_release -a

Estado de servicios

systemctl status apache2
systemctl status mysql

Logs reales

journalctl -u apache2 --no-pager | tail -n 20
journalctl -u mysql --no-pager | tail -n 20

Firewall

sudo ufw status verbose

Cron

crontab -l

Scripts

Ejecutar los scripts y mostrar salida:

bash check_web.sh
bash backup_logs.sh

Red

ping -c 4 192.168.50.20
ping -c 4 192.168.50.10

Web

Desde otra máquina:

curl http://192.168.50.10

Base de datos

Desde web01:

mysql -h 192.168.50.20 -u webuser -p