# PRACTICA: Dos hosts con DNS

La idea de esta práctica es ver como se integra Apache con dos dominios virtuales y un DNS, para eso, vamos a configurar dos máquinas virtuales, una con apache y la otra con dns.

* Ubuntu Apache: 10.0.0.10/24
* Ubuntu DNS: 10.0.0.20/24

Ambos los usaremos con un puente y una red interna.

***

### PARTE 1: Configuración del Ubuntu Server con Apache

Lo primero que haremos como siempre es configurar la red del servidor, para ello editamos la configuración de netplan:

```bash
sudo nano /etc/netplan/00-installer-config.yaml
```

Configuramos una IP estática (ejemplo):

```yaml
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:  # Verifica el nombre de tu interfaz con 'ip a'
      addresses:
        - 10.0.0.10/24
```

Aplica los cambios:

```bash
sudo netplan apply
```

#### Instalación y configuración de Apache

Como ya hemos visto anteriormente, actualizamos el sistema e instalamos Apache:

```bash
sudo apt update
sudo apt upgrade -y
sudo apt install apache2 -y
```

Verifica que Apache esté funcionando:

```bash
sudo systemctl status apache2
```

#### Creación de virtual hosts

Vamos a crear dos virtualhosts en apache:

* [www.miweb.local](http://www.miweb.local)
* blog.miweb.local

Por lo que crearemos sus respectivas carpetas:

```bash
# Crear directorios para www.miweb.local
sudo mkdir -p /var/www/www.miweb.local

# Crear directorios para blog.miweb.local
sudo mkdir -p /var/www/blog.miweb.local
```

Puedes probar con codigo propio pero, sino te dejo un codigo de ejempo a continuación:

<details>

<summary>www.miweb.local</summary>

Crea:

```bash
sudo nano /var/www/www.miweb.local/index.html
```

Y añade este contenido:

```html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mi Web Principal</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            margin: 0;
        }
        .container {
            text-align: center;
            background: rgba(255, 255, 255, 0.1);
            padding: 50px;
            border-radius: 20px;
            backdrop-filter: blur(10px);
        }
        h1 {
            font-size: 3em;
            margin-bottom: 20px;
        }
        .info {
            margin: 20px 0;
            font-size: 1.2em;
        }
        a {
            color: #ffd700;
            text-decoration: none;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🌐 www.miweb.local</h1>
        <p class="info">Bienvenido al sitio web principal</p>
        <p class="info">Servidor: Ubuntu Server con Apache</p>
        <p class="info">DNS: Ubuntu Server con BIND</p>
        <p class="info">IP: 10.0.0.10/24</p>
        <hr style="margin: 30px 0; border: 1px solid rgba(255,255,255,0.3);">
        <p>Visita también: <a href="http://blog.miweb.local">blog.miweb.local</a></p>
    </div>
</body>
</html>
```

</details>

<details>

<summary>blog.miweb.local</summary>

Crea:

```bash
sudo nano /var/www/blog.miweb.local/index.html
```

Y añade este contenido:

```html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mi Blog</title>
    <style>
        body {
            font-family: 'Georgia', serif;
            background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
            color: #333;
            margin: 0;
            padding: 20px;
        }
        .container {
            max-width: 800px;
            margin: 50px auto;
            background: white;
            padding: 40px;
            border-radius: 15px;
            box-shadow: 0 10px 40px rgba(0,0,0,0.2);
        }
        h1 {
            color: #f5576c;
            border-bottom: 3px solid #f093fb;
            padding-bottom: 10px;
        }
        .post {
            margin: 30px 0;
            padding: 20px;
            background: #f9f9f9;
            border-left: 5px solid #f5576c;
            border-radius: 5px;
        }
        .post h2 {
            color: #f5576c;
            margin-top: 0;
        }
        .meta {
            color: #888;
            font-size: 0.9em;
            font-style: italic;
        }
        .back-link {
            display: inline-block;
            margin-top: 20px;
            color: #f5576c;
            text-decoration: none;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>📝 Blog de miweb.local</h1>
        
        <div class="post">
            <h2>Primera entrada del blog</h2>
            <p class="meta">10 de diciembre de 2024</p>
            <p>¡Bienvenido a mi blog! Este es el primer post de ejemplo donde puedo compartir contenido, tutoriales y experiencias sobre servidores web, DNS y configuraciones de red.</p>
            <p>Este sitio está alojado en <strong>blog.miweb.local</strong> y es completamente independiente del sitio principal.</p>
        </div>
        
        <div class="post">
            <h2>Configuración de VirtualHosts</h2>
            <p class="meta">10 de diciembre de 2024</p>
            <p>Los VirtualHosts en Apache permiten alojar múltiples sitios web en un mismo servidor. Cada dominio puede tener su propio directorio, configuración y contenido totalmente diferente.</p>
            <p>Gracias a la configuración DNS con Bind9, podemos acceder a cada sitio por su nombre de dominio local.</p>
        </div>
        
        <hr>
        <p><strong>Información del servidor:</strong></p>
        <ul>
            <li>Dominio: blog.miweb.local</li>
            <li>Servidor Web: Apache en Ubuntu Server</li>
            <li>Servidor DNS: BIND en Ubuntu Server</li>
            <li>IP: 10.0.0.10</li>
        </ul>
        
        <a href="http://www.miweb.local" class="back-link">← Volver a www.miweb.local</a>
    </div>
</body>
</html>
```

</details>

En ambos casos deberemos establecer permisos correctos para el usuario `www-data` :&#x20;

```bash
sudo chown -R www-data:www-data /var/www/www.miweb.local
sudo chown -R www-data:www-data /var/www/blog.miweb.local
sudo chmod -R 755 /var/www/www.miweb.local
sudo chmod -R 755 /var/www/blog.miweb.local
```

#### Creación de los VirtualHosts

Como ya hemos comentado antes, vamos a crear dos vhosts en el sites-available, empezando por:

```bash
sudo nano /etc/apache2/sites-available/www.miweb.local.conf
```

Añade:

```apache
<VirtualHost *:80>
    ServerName www.miweb.local
    ServerAlias miweb.local
    ServerAdmin admin@miweb.local
    DocumentRoot /var/www/www.miweb.local
    
    <Directory /var/www/www.miweb.local>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/www.miweb.local_error.log
    CustomLog ${APACHE_LOG_DIR}/www.miweb.local_access.log combined
</VirtualHost>
```

Y ahora el otro:

```bash
sudo nano /etc/apache2/sites-available/blog.miweb.local.conf
```

Añade:

```apache
<VirtualHost *:80>
    ServerName blog.miweb.local
    ServerAdmin admin@miweb.local
    DocumentRoot /var/www/blog.miweb.local
    
    <Directory /var/www/blog.miweb.local>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    ErrorLog ${APACHE_LOG_DIR}/blog.miweb.local_error.log
    CustomLog ${APACHE_LOG_DIR}/blog.miweb.local_access.log combined
</VirtualHost>
```

Ahora nos toca deshabilitar el sitio por defecto y habilitar los nuevos:

```bash
# Deshabilitar sitio por defecto
sudo a2dissite 000-default.conf

# Habilitar los nuevos sitios
sudo a2ensite www.miweb.local.conf
sudo a2ensite blog.miweb.local.conf

# Verificar la configuración
sudo apache2ctl configtest

# Recargar Apache
sudo systemctl reload apache2
```

Asegurate por último que Apache está escuchando:

```bash
sudo systemctl status apache2
sudo netstat -tlnp | grep :80
```

***

### PARTE 2: Configuración Ubuntu Server con Bind9

#### Instalación y configuración de BIND&#x20;

En la segunda máquina de DNS vamos con las siguientes configuraciones según la [guía que tengo en la otra página](https://apuntes-alex.gitbook.io/apuntes-sistemas-y-redes/servicios/dns/dns-con-ubuntu-server) pero siendo coherente con las IPs. Sino simplemente:

```bash
sudo apt install bind9 bind9-utils bind9-doc -y
```

Podemos comprobar si se ha instalado correctamente con:

```bash
systemctl status bind9
```

Para la configuración editaremos el `named.conf` y luego las zonas directas e inversa, para esta practica usaremos el dominio `midns.local` en este servidor para diferenciarlo de `miweb.local` :

**a) Configuración principal de named.conf:**

```bash
nano /etc/bind/named.conf.options
```

Reemplaza o añade:

```
options {
    directory "/var/bind";
    
    listen-on { 10.0.0.20; 127.0.0.1; };
    listen-on-v6 { none; };
    
    allow-query { 10.0.0.0/24; 127.0.0.1; };
    allow-transfer { none; };
    
    forwarders {
        8.8.8.8;
        8.8.4.4;
    };
    
    recursion yes;
    dnssec-validation auto;
};
```

**b) Configuramos archivos de zona:**

Edita el archivo de configuración principal de zonas de `BIND9`:

```
sudo nano /etc/bind/named.conf.local
```

Agrega una sección para tus zonas directa y otra para la inversa. Por ejemplo, para el dominio "`midns.local`":

```
zone "midns.local" IN {
        type master;
        file "/etc/bind/zones/db.midns.local";
};

zone "miweb.local" IN {
        type master;
        file "/etc/bind/zones/db.miweb.local";
};

zone "0.0.10.in-addr.arpa" IN {
        type master;
        file "/etc/bind/zones/db.0.0.10";
};
```

**c) Crear zona directa de dns:**

```bash
mkdir /etc/bind/zones
nano /etc/bind/zones/db.midns.local
```

Añade:

```
$TTL    86400
@       IN      SOA     dns.midns.local. root.midns.local. (
                       19122025         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL

;Servidor de nombres
@       IN      NS      dns.midns.local.

;Registros A a DNS
;@      IN      A       10.0.0.20
dns     IN      A       10.0.0.20

```

**d) Crear zona directa de web:**

```bash
nano /etc/bind/zones/db.midns.local
```

{% hint style="warning" %}
Para este archivo vigila por que el SOA sigue siendo dns.midns.local mientras que los registros A apuntaran a miweb.local

En el registro de SOA se ha puesto como root.miweb.local :&#x20;

* El primer campo (`dns.midns.local.`) es el **servidor maestro (MNAME)** de la zona `miweb.local`. Es el nombre del servidor DNS que tiene la copia maestra de la zona.​
* El segundo campo (`root.miweb.local.`) es el **correo del responsable (RNAME)** de la zona, con el `@` sustituido por un punto (sería algo como `root@miweb.local`).

Si lo prefieres lo puedes sustituir por un `hostmaster.miweb.local`
{% endhint %}

Añade:

```
$TTL    86400
@       IN      SOA     dns.midns.local. root.miweb.local. (
                       19122025         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL

@               IN      NS      dns.midns.local.

;Registros A de web
@               IN      A       10.0.0.10
www             IN      A       10.0.0.10
blog            IN      A       10.0.0.10

```

**e) Crear zona inversa:**

```bash
nano /etc/bind/zones/db.0.0.10
```

Añade:

```
$TTL    604800
@       IN      SOA     dns.midns.local. root.midns.local. (
                       19122025         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache

@       IN      NS      dns.midns.local.

; PTR servidor DNS
20      IN      PTR     dns.midns.local.

; PTR servidor apache
10      IN      PTR     miweb.local.

```

#### 2.4 Verificar configuración y reiniciar

Modificamos el resolv en AMBOS servidores para que fuerce las consultas por nuestro DNS:

```bash
sudo nano /etc/resolv.conf

##y le añades la siguiente linea:
nameservers 10.0.0.20
```

Revisamos que esté todo bien escrito y funcional:

```bash
# Verificar sintaxis
named-checkconf /etc/bind/named.conf
named-checkzone miweb.local /etc/bind/db.miweb.local
named-checkzone 0.0.10.in-addr.arpa /etc/bind/db.0.0.10

# Reiniciar BIND
sudo systemctl restart bind9

# Verificar estado
systemctl status bind9
```

***

### PARTE 3: Pruebas y Verificación

#### 3.1 Desde el servidor DNS

Prueba la resolución local:

```bash
nslookup miservidor.local 127.0.0.1
nslookup www.miservidor.local 127.0.0.1
dig @127.0.0.1 miservidor.local
```

#### 3.2 Desde el servidor web

Prueba la resolución DNS:

```bash
nslookup miservidor.local
nslookup www.miservidor.local
dig miservidor.local
```

Prueba acceso web por nombre:

```bash
curl http://miservidor.local
curl http://www.miservidor.local
```

#### 3.3 Desde tu máquina cliente conectada a la misma red interna:

Configura temporalmente el DNS de tu adaptador de red para usar `192.168.100.20` y accede desde un navegador:

```
http://miservidor.local
http://www.miservidor.local
```

***

<details>

<summary>Troubleshooting</summary>

#### Firewall en Ubuntu

```bash
sudo ufw allow 80/tcp
sudo ufw allow from 192.168.100.0/24
sudo ufw status
```

#### Logs útiles de **Ubuntu (Apache):**

```bash
sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/apache2/access.log
```

</details>

### Cosas para mirarse:

1. **Balanceo**: Añade otro servidor Apache y configura DNS round-robin

***

Referencias:

[with-apache-on-ubuntu-18-04/](https://www.atlantic.net/vps-hosting/host-multiple-websites-on-a-single-server-with-apache-on-ubuntu-18-04/)

* Varios nombres en varias IPs con varios puertos

<https://youtu.be/2vA2Yzv-NoI>
