Contenido
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
web01depende dedb01porque debe conectarse a la base de datos remotaadmin01depende deweb01ydb01porque 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 --> LRequisitos 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
- Instalar el software de virtualización
- VirtualBox, VMware o similar
- Crear 3 máquinas virtuales
- Asignar nombre a cada una
- 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
- Configurar red local entre las máquinas
- Asignar IP fija a cada sistema
- Comprobar conectividad
Ejemplo de tabla de red
| Máquina | IP | Máscara | Puerta de enlace | Función |
|---|---|---|---|---|
| web01 | 192.168.50.10 | 255.255.255.0 | 192.168.50.1 o vacía si no aplica | Web |
| db01 | 192.168.50.20 | 255.255.255.0 | 192.168.50.1 o vacía si no aplica | BD |
| admin01 | 192.168.50.30 | 255.255.255.0 | 192.168.50.1 o vacía si no aplica | Administración |
Comprobaciones que deben hacer
ip ahostnamectlpingentre 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:
- Instalar Apache2
- Arrancar y habilitar el servicio
- Crear una página de prueba
- 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:
- Instalar MySQL o MariaDB
- Habilitar y arrancar el servicio
- Crear una base de datos
- Crear un usuario con permisos
- 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:
- Comprobar conectividad con
db01 - Instalar cliente MySQL si hace falta
- Conectarse a la base de datos remota
- 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é
web01depende dedb01 - 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:
- Consultar el estado de Apache y MySQL
- Reiniciar y detener servicios
- 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 mysqlo 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:
- Instalar o activar
ufw - Definir política básica
- Abrir solo los puertos necesarios
Ejemplo
web01: permitir 22 y 80db01: permitir 22 y 3306 solo si procedeadmin01: 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.shbackup_logs.shestado_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








