Hola a tod@s.
En este post vamos a ver como montar un FrontalWeb con Apache (Reverse Proxy) sobre una máquina Ubuntu Server 24.04 LTS utilizando certificados de Let´s Encrypt, con esta implementación le vamos a dar un punto más de seguridad a nuestra infraestructura perimetral, ya que sólo vamos a exponer directamente a Internet un único servidor, sólo va a ser necesario abrir un puerto en nuestro Firewall, ya que a través del Frontalweb vamos a poder alcanzar a los demás servidores, los certificados digitales los vamos a instalar y administrar en un solo servidor, a través del Frontalweb que se va a encargar de cifrar todos los contenidos.
- Lo primero que vamos a realizar será la instalación de Apache, para ello ejecutamos el comando apt-get install apache2:
- Una vez finalizada la instalación, con el comando apache2ctl -v podemos ver la versión de apache que hemos instalado:
- Con el comando ufw app list podemos ver los perfiles de aplicación que se pueden usar para habilitar o deshabilitar el acceso a Apache a través del firewall de Ubuntu:
Apache → Este perfil solo abre el puerto 80 (tráfico web normal sin cifrar)
Apache Full → Abre tanto el puerto 80 (tráfico web normal sin cifrar) como el puerto 443 (tráfico cifrado TLS / SSL)
Apache Secure → Este perfil solo abre el puerto 443 (tráfico cifrado TLS / SSL)
- En nuestro caso vamos a permitir el acceso a los dos puertos (80 y 443), ufw allow ‘Apache Full’:
- Para verificar que el servidor Apache está funcionando, accedemos a la URL de nuestro servidor, http://frontalweb.ragasys.net:
- Con el comando systemctl status apache2 podemos ver el estado del servicio del servidor Apache, que como podemos ver está activo y ejecutándose:
- Una vez que hemos instalado nuestro servidor de apache, vamos a habilitar los siguientes módulos:
- a2enmod ssl
- a2enmod proxy
- a2enmod proxy_http
- a2enmod proxy_balancer
- a2enmod lbmethod_byrequests
- a2enmod headers
- a2enmod rewrite
- Con el comando systemctl restart apache2 reiniciamos el servicio:
- Nos vamos a crear nuestro primer VirtualHost, en la ruta /etc/apache2/sites-available, y ejecutando nano nextcloud.ragasys.eu.conf, este primer VirtualHost será un servidor de Nextcloud que tenemos en nuestra infraestructura, con este fichero, todo el tráfico http y https que llegue a la URL de dominio púbico indicada, se va a redirigir al servidor interno de nextcloud, siempre a través de conexión cifrada https:
<VirtualHost *:80>
ServerName nextcloud.ragasys.eu
ServerAlias nextcloud.ragasys.eu
#RewriteEngine On
#RewriteCond %{HTTPS} off
#RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
ErrorLog /var/log/apache2/nextcloud.ragasys.eu/error.log
CustomLog /var/log/apache2/nextcloud.ragasys.eu/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName nextcloud.ragasys.eu
ServerAlias nextcloud.ragasys.eu
#SSLEngine on
#SSLCertificateFile /etc/letsencrypt/live/nextcloud.ragasys.eu/fullchain.pem
#SSLCertificateKeyFile /etc/letsencrypt/live/netxcloud.ragasys.eu/privkey.pem
ProxyPreserveHost On
ProxyPass / http://nextcloud.ragasys.net/
ProxyPassReverse / http://nextcloud.ragasys.net/
ErrorLog /var/log/apache2/nextcloud.ragasys.eu/ssl-error.log
CustomLog /var/log/apache2/nextcloud.ragasys.eu/ssl-access.log combined
</VirtualHost>
- Nos creamos nuestro segundo VirtualHost, en la ruta /etc/apache2/sites-available, y ejecutando nano guacamole.ragasys.eu.conf:
<VirtualHost *:80>
ServerName guacamole.ragasys.eu
ServerAlias guacamole.ragasys.eu
#RewriteEngine On
#RewriteCond %{HTTPS} off
#RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
ErrorLog /var/log/apache2/guacamole.ragasys.eu/error.log
CustomLog /var/log/apache2/guacamole.ragasys.eu/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName guacamole.ragasys.eu
ServerAlias guacamole.ragasys.eu
#SSLEngine on
#SSLCertificateFile /etc/letsencrypt/live/guacamole.ragasys.eu/fullchain.pem
#SSLCertificateKeyFile /etc/letsencrypt/live/guacamole.ragasys.eu/privkey.pem
ProxyPreserveHost On
ProxyPass /guacamole http://guacamole.ragasys.net:8080/guacamole/ flushpackets=on
ProxyPassReverse /guacamole http://guacamole.ragasys.net:8080/guacamole/
ErrorLog /var/log/apache2/guacamole.ragasys.eu/ssl-error.log
CustomLog /var/log/apache2/guacamole.ragasys.eu/ssl-access.log combined
</VirtualHost>
- Nos creamos también el directorio para los logs de los sites virtuales:
- Habilitamos los VirtualHost con el comando a2ensite nextcloud.ragasys.eu.conf y a2ensite guacamole.ragasys.eu.conf y como podemos ver ya tenemos habilitados los sites:
- Deshabilitamos el site por defecto a2dissite 000-default.conf:
- Ejecutamos systemctl restart apache2 y systemctl status apache2 para reiniciar y ver el estado del servicio:
- Ahora en nuestro Firewall, que en mi caso es un Fortigate, nos debemos de crear las reglas necesarias para publicar el puerto 443 apuntando al servidor FrontalWeb que va a ser el único que vamos a exponer en el perímetro, en este post de este mismo blog podemos ver como hacerlo, primero realizamos un NAT estático y luego nos creamos la regla de acceso a los puertos HTTP y HTTPS para el NAT estático creado:
- En nuestro DNS interno debemos de crearnos una zona de búsqueda directa, en mi caso, ragasys.eu, que es el dominio externo que hemos comprado a nuestro proveedor de DNS y que utilizaremos para publicar nuestros servicios, esto lo hacemos en nuestra infraestructura interna, para que los usuarios que accedan desde la red interna no salgan al exterior, en esta zona de búsqueda directa nos creamos estos registros Tipo A y CNAME:
- En nuestro DNS externo, el que tengamos contratado con nuestro proveedor de DNS, debemos de hacer algo parecido, es decir, debemos de crearnos un subdominio del tipo www.ragasys.eu con un registro tipo A apuntando a nuestra IP púbica, y nos crearemos subdominios por cada servicio que queramos publicar con un registro del tipo CNAME apuntando a www.ragasys.eu:
- Ahora vamos a instalar cerbot, para ello, ejecutamos apt install certbot python3-certbot-apache:
- Obtenemos el certificado SSL de Let’s Encrypt para el primer site, para ello, ejecutamos certbot –apache -d nextcloud.ragasys.eu:
- Obtenemos el certificado SSL de Let’s Encrypt para el segundo site, para ello, ejecutamos certbot –apache -d guacamole.ragasys.eu:
- Si accedemos a la configuración de los sites virtuales, nos ha quedado así tras el despliegue de los certificados SSL de Let’s Encrypt:
- El fichero bien estructurado del primer site debe quedar así:
<VirtualHost *:80>
ServerName nextcloud.ragasys.eu
ServerAlias nextcloud.ragasys.eu
RewriteEngine on
RewriteCond %{SERVER_NAME} =nextcloud.ragasys.eu
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog /var/log/apache2/nextcloud.ragasys.eu/error.log
CustomLog /var/log/apache2/nextcloud.ragasys.eu/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName nextcloud.ragasys.eu
ServerAlias nextcloud.ragasys.eu
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/nextcloud.ragasys.eu/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nextcloud.ragasys.eu/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyPreserveHost On
ProxyPass / http://nextcloud.ragasys.net/
ProxyPassReverse / http://nextcloud.ragasys.net/
ErrorLog /var/log/apache2/nextcloud.ragasys.eu/ssl-error.log
CustomLog /var/log/apache2/nextcloud.ragasys.eu/ssl-access.log combined
</VirtualHost>
- El fichero bien estructurado del segundo site debe quedar así:
<VirtualHost *:80>
ServerName guacamole.ragasys.eu
ServerAlias guacamole.ragasys.eu
RewriteEngine on
RewriteCond %{SERVER_NAME} =guacamole.ragasys.eu
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog /var/log/apache2/guacamole.ragasys.eu/error.log
CustomLog /var/log/apache2/guacamole.ragasys.eu/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName guacamole.ragasys.eu
ServerAlias guacamole.ragasys.eu
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/guacamole.ragasys.eu/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/guacamole.ragasys.eu/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyPreserveHost On
ProxyPass /guacamole http://guacamole.ragasys.net:8080/guacamole/ flushpackets=on
ProxyPassReverse /guacamole http://guacamole.ragasys.net:8080/guacamole/
ErrorLog /var/log/apache2/guacamole.ragasys.eu/ssl-error.log
CustomLog /var/log/apache2/guacamole.ragasys.eu/ssl-access.log combined
</VirtualHost>
- El fichero de este segundo host me ha estado dando problemas, y no conseguía acceder, se iba siempre a la página por defecto de apache.
- Para dejarlo fino y funcionando, se ha quedado así de manera definitiva:
<VirtualHost *:80>
ServerName guacamole.ragasys.eu
ServerAlias guacamole.ragasys.eu
RewriteEngine on
RewriteRule /(.*) https://guacamole.ragasys.eu/guacamole [R,L]
ErrorLog /var/log/apache2/guacamole.ragasys.eu/error.log
CustomLog /var/log/apache2/guacamole.ragasys.eu/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName guacamole.ragasys.eu
ServerAlias guacamole.ragasys.eu
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/guacamole.ragasys.eu/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/guacamole.ragasys.eu/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyPreserveHost On
SSLProxyEngine On
RewriteEngine On
<Location />
ProxyPass http://guacamole.ragasys.net:8080/guacamole/ flushpackets=on
ProxyPassReverse http://guacamole.ragasys.net:8080/guacamole/
</Location>
ErrorLog /var/log/apache2/guacamole.ragasys.eu/ssl-error.log
CustomLog /var/log/apache2/guacamole.ragasys.eu/ssl-access.log combined
</VirtualHost>
- Certbot renueva los certificados automáticamente, pero podemos verificarlo con, certbot renew –dry-run:
- Aquí vemos que ya podemos acceder a nuestro servidor de Nextcloud desde el exterior, a través del FrontalWeb, con los certificados SSL de Let’s Encrypt:
- Aquí vemos que ya podemos acceder a nuestro servidor de Apache Guacamole desde el exterior, a través del FrontalWeb, con los certificados SSL de Let’s Encrypt:
- Para comprobar el certificado podemos acceder a https://www.ssllabs.com/ssltest/ y verificamos el certificado para nuestros dos sitios webs:
Saludos y espero que os sea de ayuda 😉