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:
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:
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