Instalar Pi-hole en Ubuntu 20.04 en AWS EC2

La primera que vez que escuché acerca de Pi-hole fue hace un par de años, hablando sobre bloqueadores de anuncios con un amigo. Me pareció interesante, pero me olvidé totalmente del asunto hasta el pasado fin de semana, cuando alguien lo mecionó en Reddit, así que por fin me decidí a probarlo.

Para hacerlo, usé una instancia t3a.nano en EC2. Es la más pequeña que ofrecen y por ahora ha sido más que suficiente.

Sólo una cosa antes de empezar. Esto es simplemente experimentar con Pi-hole, así que no gasté tiempo en automatizar configuraciones, instalación y demás. Todos los pasos son manuales. Puede que los automatice en algún moment en el futuro, pero aún no.

¿Entonces qué vamos a hacer? Lo primero lanzar una instancia en EC2 donde podamos instalar Pi-hole, configurar los grupos de seguridad, etc. Después, instalaremos Pi-hole y configuraremos un dominio que apunte a nuestra instance. Y para terminar configuraremos SSL para acceder al panel de administración. Aunque el accesso estará restringido por los grupos de seguridad, SSL siempre es una buena idea y Let’s Encrypt es gratis 🙂

Preparar la instancia EC2

Lanzar una nueva instancia

  • En la consola de AWS vamos a EC2 ➡️ Instances ➡️ Launch instances.
  • Selecciona Ubuntu Server 20.04 – 64-bit
  • Elige el tamaño que mejor te parezca. Los requisitos mínimos de Pi-hole son:
    • 2GB de espacio libre, 4GB recomendados
    • 512GB RAM
  • Yo utilizo una t3a.nano y para mi uso llega de sobra. La familia t3a usa procesadores AMD y es aproximadamente un 10% más barata que la versión Intel.
  • En la siguiente sección selecciona los valores apropiados para tu VPC, subnet, etc.
  • Aquí también puedes crear un rol IAM y asignarlo a la instancia. Usaremos un rol más tarde, para interactuar con Route 53, pero hablaré de ello en la sección sobre SSL.
  • Después de esto tenemos que seleccionar el espacio de almacenamiento. AWS asigna 8GB por defecto, yo usé 20.
  • Añade tags si te parece.
  • Configuremos ahora nuestro grupo de seguridad. Los puertos que Pi-hole utiliza son:
ServicioPuertoProtocoloMás info
pihole daemon53 (DNS)TCP/UDP
pihole daemon67 (DHCP)IPv4 UDPDHCP es opcional. Yo no lo uso así que no he abierto el puerto.
pihole daemon547 (DHCPv6)IPv6 UDPDHCP es opcional. Yo no lo uso así que no he abierto el puerto.
lighttpd80 (HTTP)TCPAcceso al panel de administración.
lighttpd443 (HTTPS)TCPAcceso al panel de administración usando SSL.
  • Mirando esto desde la configuración de los grupos de seguridad:
  • Antes de lanzar tu nueva instancia deberás seleccionar (o crear) una llave SSH para acceder a la misma:

Asignar una IP pública

Ahora que nuestra instancia está lista tenemos que asignarle una IP pública para que podamos acceder desde fuera de nuestra VPC. Puede que no tengas que hacer esto si, por ejemplo, usas una VPN para conectarte a AWS.

  • En EC2, vamos a Network & Security ➡️ Elastic IPs.
  • Una vez que tenemos la IP pública, debemos asignarla a nuestra instancia.

Instalar Pi-hole en Ubuntu 20.04

La documentación de Pi-hole explica tres formas distintas de instalarlo. La primera es una versión automatizada. Se hace pipetando, ¿se dice así?, un script a bash. Esta forma de hacerlo es un poco controvertida así que nos dan dos alternativas. Puedes encontrarlas aquí.

curl -sSL https://install.pi-hole.net | bash

El proceso de instalación tiene varios pasos. Lo primero que tienes que elegir es el provedor de DNS para Pi-hole. Yo no quería usar sólo Google, o Cloudflare… así que escogí Custom.

Y usé 8.8.8.8 (Google) y 1.1.1.1 (Cloudflare).

El siguiente paso es seleccionar las listas que se usarán para bloquear anuncios. Dejé las dos que venían por defecto. Después, desde el panel de administración, se pueden añadir más.

Dejé los valores por defecto para bloquear anuncios por IPv4 e IPv6.

Puedes dejar los valores por defecto para la dirección IP y puerta de enlace.

Este es un paso importante si quieres seguir este tutorial más tarde. Necesitamos instalar la interfaz de administración web.

Y también lighttpd (servidor web). Sin él, el panel de administración no funcionará.

Lo siguientes pasos tratan sobre habilitar o no logs para las consultas y el nivel de privacidad de los mismos. Como esto es una prueba lo dejé en los valores por defecto.

Al final de este proceso deberías ver un mensaje con tu contraseña de administración. Guárdala.

Point a subdomain to our EC2 instance

Ya que estamos trabajando con AWS usaré Route 53. Si tú no lo usas lo siguientes pasos y parte de lo relacionado con la automatización de certificados SSL no te servirá para configurar tu entorno.

  • Anota la IP pública de tu instancia EC2.
  • Vete a a Route 53 y busca la Hosted zone del dominio que quieres usar.
Select create new record
Use Simple routing
Set the public IP of your EC2 instance here

Ya que tu grupo de serguridad está configurado para ceptar acceso por el puerto 80, una vez los cambios en los DNS se hayan propagado deberías poder acceder al panel de administración en:

http://yoursubdomain.example.com/admin/

Activar SSL para el panel de control

Es hora de hacer esto un poco más seguro usando SSL. El método de validación que más me gusta cuando trabajo con Let’s Encrypt y AWS es el DNS challenge. Es muy sencillo de automatizar usando Route 53.

Crear un rol IAM para nuestra instancia EC2

Lo primero que tenemos que hacer es tener una entidad con permisos para editar nuestra hosted zone.

Hay muchas formas de hacerlo. Por ejemplo, podríamos crear un usuario IAM y guardar sus credenciales en nuestra instancia EC2 (¡mala idea!). La forma que AWS recomienda es utilizar un rol que las aplicaciones corriendo en nuestra instancia puedan adoptar.

Si quieres saber más sobre los roles IAM para EC2 puedes consultar la documentacion.

  • TPara crear el rol vete a IAM ➡️ Roles ➡️ Crear un rol
  • Después, selecciona EC2 como entidad de confianza
  • Despu’es necesitarás crear una política (o añadirla después como política insertada, lo que mejor te venga). Sea cual sea tu elección la política debe de ser así:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "route53:GetChange"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:ChangeResourceRecordSets"
            ],
            "Resource": "arn:aws:route53:::hostedzone/HOSTEDZONEID"
        }
    ]
}
  • Una vez hayas creado tu nuevo rol nesitarás añadirlo a la instancia EC2 donde corre Pi-hole.
  • Go to EC2 ➡️ Instancias ➡️ Tu Instancia ➡️ Seguridad ➡️ Modificar rol de IAM
  • Y añade el rol que acabas de crear

Instalar Certbot en Ubuntu 20.04

Hacemos SSH a nuestra instancia en instalamos dos paquetes.

sudo apt-get install certbot \
                     python3-certbot-dns-route53

Generar un certificado SSL con Certbot/Let’s Encrypt

  • Es hora de crear nuestro certificado
sudo certbot certonly --dns-route53 -d yoursubdomain.example.com

Certbot te hará una serie de preguntas, como tu email, y después procederá a generar tu certificado. El resultado será algo parecido a esto:

Y ya hemos creado el certificado. Puedes encontrlo en /etc/letsencrypt/live/yoursubdomain.example.com/

Configurar SSL en lighttpd

Activemos finalmente el acceso HTTPS. Necesitarás editar /etc/lighttpd/external.conf El resultado debería parecerse a esto:

$HTTP["host"] == "yoursubdomain.yourdomain.com" {
  # Pi-hole necesita saber que este dominio no está bloqueado
  setenv.add-environment = ("fqdn" => "true")
  # Activar SSL usando nuestro certificado Let's Encrypt sólo para este host
  $SERVER["socket"] == ":443" {
    ssl.engine = "enable"
    ssl.pemfile = "/etc/letsencrypt/live/xxxxxxxxxx/cert.pem"
    ssl.ca-file =  "/etc/letsencrypt/live/xxxxxxxxxx/fullchain.pem"
    ssl.privkey = "/etc/letsencrypt/live/xxxxxxxxxx/privkey.pem"
    ssl.honor-cipher-order = "enable"
    ssl.cipher-list = "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"
    ssl.use-sslv2 = "disable"
    ssl.use-sslv3 = "disable"
  }
  # Activar redirección de HTTP a HTTPS
  $HTTP["scheme"] == "http" {
    $HTTP["host"] =~ ".*" {
      url.redirect = (".*" => "https://%0$0")
    }
  }
}

Reiniciamos lighttpd:

systemctl restart lighttpd

¡Y ya está! El panel de administración debería estar disponible a través de HTTPS.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *