Servidores Web, Base de Datos y DNS

En esta practica vamos a tener un servidor dns con bidn9 en la maquina de la red interna llamada Frestón, en ella vamos a tener nuestro servidor dns activo en el cual vamos a tener que activar 3 vistas para las distintas consultas que le vamos a realizar, estas vistas seran las siguiente:

  • Vista para la red externa (172.22.0.0/15 y 192.168.202.2)
  • Vista para la red interna (10.0.1.0/24)
  • Vista para la red DMZ (10.0.2.0/24)

Una vez tengamos claro que tenemos que hacer esas 3 vistas, instalamos el paquete de bind9 que es el paquete donde tenemos el servidor dns que vamos a usar.

Como vamos a usar unas vistas en bind, debemos de documentar en el fichero de configuracion llamado /etc/bind/named.conf y nos debe de quedar de la siguiente:

#### Fichero /etc/bind/named.conf ####
...
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
//include "/etc/bind/named.conf.default-zones";

Ahora, para poder permitir la conexion desde todas las maquinas y desde la maquina llamada papion debemos de dirigirnos al fichero de configuracion llamado /etc/bind/named.conf.options debemos de añadir las siguientes lineas:

#### Fichero /etc/bind/named.conf.options ####
...
allow-query { 172.22.0.0/15;10.0.1.0/24;10.0.2.0/24;192.168.202.2; };
allow-recursion { any; };
allow-query-cache { any; };
...

Una vez tengamos todo esto ya podemos proceder a crear nuestras vistas para las distintas maquinas y redes que va a consultar nuestro dns.

Vista para la red interna

En este apartado vamos a crear la vista para la red interna que sera la siguiente estructura:

view interna {
        match-clients {10.0.1.0/24;};
        allow-recursion { any; };

        zone "franjavier.gonzalonazareno.org"
        {
                type master;
                file "/var/cache/bind/db.interna.fj.gonzalonazareno.org";
        };

        zone "1.0.10.in-addr.arpa"
        {
                type master;
                file "/var/cache/bind/db.1.0.10";
        };

        zone "2.0.10.in-addr.arpa"
        {
                type master;
                file "/var/cache/bind/db.2.0.10";
        };

        include "/etc/bind/zones.rfc1918";
        include "/etc/bind/named.conf.default-zones";
};

Si queremos podemos comprobar la sintaxis del fichero antes de seguir con las demas vistas mediante el comando named-checkconf /etc/bind/named.conf.local

Vista para la red DMZ

Ahora aqui tendremos la vista sobre la zona de dmz, que sera la siguiente:

view dmz {
        match-clients {10.0.2.0/24;};
        allow-recursion { any; };

        zone "franjavier.gonzalonazareno.org"
        {
                type master;
                file "/var/cache/bind/db.dmz.fj.gonzalonazareno.org";
        };

        zone "1.0.10.in-addr.arpa"
        {
                type master;
                file "/var/cache/bind/db.1.0.10";
        };

        zone "2.0.10.in-addr.arpa"
        {
                type master;
                file "/var/cache/bind/db.2.0.10";
        };

        include "/etc/bind/zones.rfc1918";
        include "/etc/bind/named.conf.default-zones";
};

Vista para la red externa

Y esta es la vista para las consultas desde el exterior y desde el servidor papion:

view externa {
        match-clients { 172.22.0.0/15; 192.168.202.2;};
        allow-recursion { any; };

        zone "franjavier.gonzalonazareno.org"
        {
                type master;
                file "/var/cache/bind/db.externa.fj.gonzalonazareno.org";
        };

        include "/etc/bind/zones.rfc1918";
        include "/etc/bind/named.conf.default-zones";
};

Configuracion de las zonas

Ahora que tenemos las vistas creadas, tenemos que definir las zonas y, por consiguiente, debemos de crear los ficheros con los nombres que le hemos indicado en el fichero de las vistas. Primero vamos a crear la zona para la vista llamada externa por lo que debemos de seguir los siguientes pasos

Creando la zona dmz

Para ello nos dirigimos al directorio /var/cache/bind/ y ahi vamos a generar un fichero con el nombre db.dmz.fj.gonzalonazareno.org que es donde le vamos a definir las zonas de la vista dmz para ello podemos usar como plantilla el fichero /etc/bind/db.empty:

#### Copiamos el fichero db.empy ####
debian@freston:~$ sudo cp /etc/bind/db.empty /var/cache/bind/db.dmz.fj.gonzalonazareno.org

#### Definimos las zonas necesarias en el fichero que hemos generado ####
 BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL    86400
@       IN      SOA     freston.franjavier.gonzalonazareno.org. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
@       IN      NS      freston.franjavier.gonzalonazareno.org.

$ORIGIN franjavier.gonzalonazareno.org.

freston         IN      A       10.0.1.11
dulcinea        IN      A       10.0.1.9
sancho          IN      A       10.0.1.4
quijote         IN      A       10.0.2.3
www             IN      CNAME   quijote
bd              IN      CNAME   sancho
ldap            IN      CNAME   freston

Hecho esto, en la maquina Quijote, debemos de comentar todas las lineas del fichero /etc/hosts salvo la linea de quijote. UNa vez hecho esto, cambiamos el fichero /etc/resolv.conf y le ponemos la ip del servidor dns de freston, en este caso 10.0.1.11 y le ponemos la opcion search franjavier.gonzalonazareno.org. De esta forma podremos hacer ping a las maquinas mediante el nombre corto sin necesidad de tener los nombre en el fichero /etc/hosts.

Creando la zona interna

Para ello seguimos el mismo procedimiento que hemos seguido en la creacion de la zona dmz, por ello tendremos el siguiente fichero:

#### Copiamos el fichero db.empy ####
debian@freston:~$ sudo cp /etc/bind/db.empty /var/cache/bind/db.interno.fj.gonzalonazareno.org

#### Definimos las zonas necesarias en el fichero que hemos generado ####
; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL    86400
@       IN      SOA     freston.franjavier.gonzalonazareno.org. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                          86400 )       ; Negative Cache TTL
;
@       IN      NS      freston.franjavier.gonzalonazareno.org.

$ORIGIN franjavier.gonzalonazareno.org.

freston         IN      A       10.0.1.11
dulcinea        IN      A       10.0.1.9
sancho          IN      A       10.0.1.4
quijote         IN      A       10.0.2.3
www             IN      CNAME   quijote
bd              IN      CNAME   sancho

Una vez hecho esto debemos de irnos a las maquinas que tenemos en la red interna, en este caso son 3, dulcinea, sancho y freston y en cada una de ellas debemos de comentar las lineas del fichero /etc/hosts salvo la linea en la que especificamos el nombre largo de las maquinas y en el fichero de /etc/resolv.conf debemos de tener como servidor dns a freston y como opcion de search franjavier.gonzalonazareno.org.

Creando la zona inversa 10.0.2.0

Ahora que ya tenemos las zonas directas definidas, vamos a proceder a crear las zonas de resolucion inversa de la red 10.0.1.0 que corresponde a la ip inversa 1.0.10

#### Creamos el fichero de las zonas inversas ####
debian@freston:/var/cache/bind$ sudo cp /etc/bind/db.127 ./db.2.0.10

#### Modificamos el fichero con las zonas que necesitamos ####
;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     freston.franjavier.gonzalonazareno.org. root.localhost. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      freston.franjavier.gonzalonazareno.org.

$ORIGIN 2.0.10.in-addr.arpa.

3       IN      PTR     quijote.franjavier.gonzalonazareno.org.

Creando la zona inversa 10.0.1.0

Seguimos el mismo procedimiento que con el anterior fichero de las zonas inversas, para ello debemos de seguir los pasos siguientes:

#### Creamos el fichero de las zonas inversas ####
debian@freston:/var/cache/bind$ sudo cp /etc/bind/db.127 ./db.1.0.10

#### Modificamos el fichero con las zonas que necesitamos ####
;
; BIND reverse data file for local loopback interface
;
$TTL	604800
@	IN	SOA	freston.franjavier.gonzalonazareno.org. root.localhost. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	freston.franjavier.gonzalonazareno.org.

$ORIGIN 1.0.10.in-addr.arpa.

9	IN	PTR	dulcinea.franjavier.gonzalonazareno.org.
4	IN	PTR	sancho.franjavier.gonzalonazareno.org.
11	IN	PTR	freston.franjavier.gonzalonazareno.org.

Creando la zona externa

Para ello vamos a seguir el mismo procedimiento que en las anteriores zonas:

#### Creamos el fichero de las zonas inversas ####
debian@freston:~$ sudo cp /etc/bind/db.empty /var/cache/bind/db.externa.fj.gonzalonazareno.org

#### Definimos las zonas que necesitamos ####
; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL	86400
@	IN	SOA	dulcinea.franjavier.gonzalonazareno.org. root.localhost. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@	IN	NS	dulcinea.franjavier.gonzalonazareno.org.

$ORIGIN franjavier.gonzalonazareno.org.

dulcinea        IN      A       172.22.200.155
www		IN	CNAME	dulcinea

Añadiendo la regla dnat

Para poder realizar las consultas a nuestro servidor dns que se encuentra en la red interna de nuestro escenario debemos de añadir la siguiente regla con iptables:

debian@dulcinea:~$ sudo iptables -t nat -A PREROUTING -p udp --dport 53 -i eth0 -j DNAT --to 10.0.1.11:53

De tal forma que, con la regla anterior, lo que estamos indicando es que todo el trafico que tenga como destino el puerto 53 y venga desde la interfaz eth0, se redirija a la ip 10.0.1.11 y al puerto 53.

Pruebas de funcionamiento

  • El servidor DNS con autoridad sobre la zona del dominio tu_nombre.gonzalonazareno.org
debian@dulcinea:~$ dig ns franjavier.gonzalonazareno.org

; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> ns franjavier.gonzalonazareno.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61780
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 28a6c69609982c4a3473d1795fe1a1186e1be8736def5cf5 (good)
;; QUESTION SECTION:
;franjavier.gonzalonazareno.org.	IN	NS

;; ANSWER SECTION:
franjavier.gonzalonazareno.org.	86400 IN NS	freston.franjavier.gonzalonazareno.org.

;; ADDITIONAL SECTION:
freston.franjavier.gonzalonazareno.org.	86400 IN A 10.0.1.11

;; Query time: 1 msec
;; SERVER: 10.0.1.11#53(10.0.1.11)
;; WHEN: Tue Dec 22 08:32:40 CET 2020
;; MSG SIZE  rcvd: 125
  • La dirección IP de dulcinea y resolucion de www.
francisco@debian10:~/.ssh$ dig www.franjavier.gonzalonazareno.org

; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> www.franjavier.gonzalonazareno.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53087
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 67b42cc613e2d258b27492185fe1a18eb86a7754ec5dde5e (good)
;; QUESTION SECTION:
;www.franjavier.gonzalonazareno.org. IN	A

;; ANSWER SECTION:
www.franjavier.gonzalonazareno.org. 85816 IN CNAME dulcinea.franjavier.gonzalonazareno.org.
dulcinea.franjavier.gonzalonazareno.org. 85816 IN A 172.22.200.155

;; AUTHORITY SECTION:
franjavier.gonzalonazareno.org.	86400 IN NS	dulcinea.franjavier.gonzalonazareno.org.

;; Query time: 1 msec
;; SERVER: 192.168.202.2#53(192.168.202.2)
;; WHEN: mar dic 22 08:34:38 CET 2020
;; MSG SIZE  rcvd: 144
  • Un resolución inversa de IP fija en cada una de las redes.

Instalando apache2 en Centos8

Para ello nos vamos a ir a nuestra maquina llamada quijote que es donde tenemos el sistema de centos8, una vez alli debemos e instalar en esta maquina el paquete llamado httpd que es el paquete que contiene el servidor web de apache2, por lo que procedemos a hacerlo:

#### Instalamos el servidor apache2 ####
[centos@quijote ~]$ sudo dnf install httpd

Una vez instalado el paquete httpd y sus dependencias, vamos a comprobar que tenemos el servicio debidamente arrancado y funcionando mediante el comando systemctl status httpd:

#### Arrancamos el servicio ####
[centos@quijote ~]$ sudo systemctl start httpd

#### Comprobamos el servicio ####
[centos@quijote ~]$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-12-17 12:35:28 CET; 1s ago

#### Deshabilitamos firewall-cmd ####
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd –reload

Configuracion de virtualhost

Como vemos, en la instalacion de los viritualhost en centos es distinta a como esta en debian10, ya que no tenemos ni la carpeta sites-availables ni la carpeta de sites-enabled, por lo que nosotros vamos a proceder a crearlas, para ello nos dirigimos al directorio /etc/httpd y las creamos:

[centos@quijote ~]$ sudo mkdir /etc/httpd/{sites-availble,sites-enabled}

De esta forma ya tendremos las carpetas en las que iremos definiendo neustros virtualhost. Despues de crearlas debemos de dirigirnos al fichero que se encuentra en /etc/httpd/conf/httpd.conf y ahi debemos de indicarle que en la carpeta de sites-enabled es donde debe de buscar los virtualhost:

#### Editamos el fichero ####
...
IncludeOptional sites-enabled/*.conf

Ahora vamos a proceder a crear en nuestro directorio /var/www/ un directorio donde tendremos nuestro virtualhost, en este caso lo vamos a llamar gonzalonazareno:

#### Creamos el directorio ####
[centos@quijote ~]$ sudo mkdir -P /var/www/gonzalonazareno/html

#### Creamos la carpeta log dentro del directorio ####
[centos@quijote ~]$ sudo mkdir /var/www/gonzalonazareno/log

#### Cambiamos los permisos ####
[centos@quijote ~]$ sudo chmod -R 755 /var/www

Una vez tengamos hecho esto, vamos a generar un fichero de configuracion de nuestro virtualhost, para ello vamos a usar el siguiente comando y le añadimos el siguiente contenido:

#### Creamos el fichero ####
[centos@quijote ~]$ sudo nano /etc/httpd/sites-availble/gonzalonazareno.conf

#### Le añadimos el siguiente contenido ####
<VirtualHost *:80>
    ServerName www.franjavier.gonzalonazareno.org
    DocumentRoot /var/www/gonzalonazareno/html
    ErrorLog /var/www/gonzalonazareno/log/error.log
    CustomLog /var/www/gonzalonazareno/log/requests.log combined
</VirtualHost>

Una vez hecho esto vamos a crear un enlace simbolico hacia la carpeta llamada sites-enabled por lo que usamos el siguiente comando:

[centos@quijote ~]$ sudo ln -s /etc/httpd/sites-availble/gonzalonazareno.conf /etc/httpd/sites-enabled/

Y para terminar debemos de ajustar las politicas de seguridad de SELinux, por lo que vamos a usar el siguiente comando:

[centos@quijote ~]$ sudo setsebool -P httpd_unified 1

Y ya lo tenemos listo, ahora solo nos queda dirigirnos a nuestra maquina dulcinea y ahi debemos de añadir la regla dnat que nos permita acceder desde el exterior a nuestro servidor web, para ello usamos la siguiente regla:

debian@dulcinea:~$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 10.0.2.3:80

Y probamos a entrar en nuestro nuevo sitio web, en mi caso con un mensaje de bienvenida:

mensaje web centos

Ahora vamos a proceder a servir lenguaje php en nuestrp servidor web mediante php-fpm para ello vamos a seguir los siguientes pasos:

#### Instalamos los paquetes de php-fpm para centos ####
[centos@quijote ~]$ sudo dnf update
[centos@quijote ~]$ sudo dnf install php php-fpm  php-gd php-mysqlnd

#### Habilitamos e iniciamos php-fpm
[centos@quijote ~]$ sudo systemctl enable php-fpm
[centos@quijote ~]$ sudo systemctl start php-fpm

#### Añadimos las siguientes lineas en nuestro fichero de virtualhost ####
[centos@quijote ~]$ sudo nano /etc/httpd/sites-availble/gonzalonazareno.conf

...
<Proxy "unix:/run/php-fpm/www.sock|fcgi://php-fpm">
        ProxySet disablereuse=off
</Proxy>

<FilesMatch \.php$>
        SetHandler proxy:fcgi://php-fpm
</FilesMatch>
...

#### Reiniciamos el servicio de httpd ####
[centos@quijote ~]$ sudo systemctl restart httpd

#### Generamos un fichero .php con la siguiente informacion ####
sudo nano /var/www/gonzalonazareno/html/info.php

<?php phpinfo(); ?>

Y ya lo tendriamos listo y funcionando:

php en quijote

Añadiendo la regla dnat

Ahora debemos de añadir la regla DNAT a nuestra maquina dulcinea para que puedan hacerse peticiones a nuestro servidor web, de tal forma que podamos obtener la pagina desde cualquier maquina, para ello usamos la siguiente regla:

debian@dulcinea:~$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 10.0.2.3:80

Donde vemos que, desde cualquier ip que tenga destino el puerto 80 y venga por la interfaz eth0, se le va a pasar el trafico a nuestra maquina interna con ip 10.0.2.3 en el puerto 80/tcp.

Instalar mysql en sancho

En esta ocasion necesitamos instalar un servidor de bases de datos mysql en nuestra maquina sancho. Este servicio se va a llamar bd.franjavier.gonzalonazareno.org que esta nombrado en la zona dns interna y dmz pero no en la zona externa, ya que no tenemos por que saber quien es el servidor de bases de datos.

Para ello vamos a irnos a nuestra maquina de sancho y ahi vamos a instalar el servidor de bases de datos de mysql:

#### Instalamos el servidor de bases de datos ####
ubuntu@sancho:~$ sudo apt install mariadb-server

#### Realizamos una instalacion segura ####
sudo mysql_secure_installation