VPN Wireguard con DuckDNS y Pi-Hole. Acceso a tu server desde cualquier lado con conexión cifrada y sin anuncios ni tracking

¿Por qué usar Wireguard o una VPN?

Bajo mi experiencia es la forma más segura de acceder a tu red local y a todos los servicios que dispongas sin tener que estar exponiendo diferentes puertos a internet. Con una VPN de Wireguard con solo exponer el puerto UDP de esta ya es suficiente

¿Por qué usar DuckDNS?

Lo más normal es que en tu internet domestico la IP que se te asigne sea dinámica, eso quiere decir que no siempre es la misma. Si estamos fuera y queremos acceder a nuestra red y la IP ha cambiado no podremos hasta que volvamos y consultemos la nueva IP. Para solucionar esto se utilizar un Dynamic DNS.
El DDNS lo que se encarga es de asociar un dominio a tu IP. En tu servidor correrá un servicio de publicación de tu IP y el proveedor del DDNS hará coincidir la DNS que tengas reservada con tu nueva IP.
Existen varios proveedores, gratuitos y de pago. En mi caso voy a usar DuckDNS.org el cual es gratuito y sencillo de usar.

Crear cuenta en DuckDNS

Entramos en https://www.duckdns.org/ creamos una cuenta y registramos un dominio (hasta 5 en la versión gratuita).
Yo personalmente uso 2 dominios, uno para acceder a mi VPN y otro para generar los diferentes subdominios para Nginx Proxy Manager, pero eso ya lo explicaré más adelante.

¿Qué es y por qué usar Pi-Hole?

Pi-Hole es un bloqueador de contenido no deseado por DNS ¿y eso que es? Pues se encarga de bloquear todo aquello que no nos gusta como publicidad, tracking o malware pero con la ventaja de no tener que instalar nada en nuestro cliente (pc, smartphone,...) ya que lo hace por DNS. Eso significa que cada vez que se hace una petición por DNS de una web, este la analiza y solo devuelve el contenido útil sin que tu móvil o PC se entere.
Si integras Pi-Hole con Wireguard puedes usar el bloqueo de contenido no deseado desde cualquier parte.

Abrir puertos en nuestro Router

Para poder acceder a nuestra VPN desde cualquier parte fuera de casa será necesario abrir el puerto 51820 UDP de la IP del nuestro servidor. Como cada router tiene su propia interfaz hay que investigar como hacerlo pero no es muy complicado y en la mayoría de ellos es muy similar. Tan solo abre el puerto 51820 UPD de la IP de tu servidor
Configurar servidor DNS para el bloqueo de contenido no deseado con Pi-Hole en el router
Esto es muy importante para que cada dispositivo de nuestra red local disponga de la protección y comodidad que nos brinda Pi-Hole sin tener que hacer nada más que estar conectado a la red.
Aquí puedes encontrar el problema de que no todos los router de compañía disponen de la opción de modificar el servidor DNS. Si el tuyo no dispone de esta opción iría pensando en adquirir un router más seguro y puentear el de tu compañía.
Busca la opción en tu router de servidor DNS y pon la IP de tu servidor donde alojes los contenedores Docker. Puede ser que sea necesario reiniciar el router.

Implementar nuestra VPN con DDNS en Docker

Para hacer funcionar nuestra VPN en docker es bien sencillo. Desde Portainer, puedes consultar el anterior post, creamos un nuevo stack y pegamos lo siguiente (realizando los cambios necesarios para tu servidor):
version: '3.7'

services:
  wireguard:
    image: linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid # Establece la zona horaria de tu ubicación.
	  - SERVERURL=wireguard.domain.com #poner tu dominio de duckDNS
      - SERVERPORT=51820 #optional
      - PEERS=2 # El numero de clientes diferentes que se van a conectar
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.15.15.0 #optional
    volumes:
      - /root/wireguard:/config
      - /lib/modules:/lib/modules
      - /usr/src:/usr/src
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    dns:
      - 172.20.0.7
    restart: unless-stopped
    networks:
      containers:
        ipv4_address: 172.20.0.6

  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    expose:
      - "53"
      - "67"
      - "80"
      - "443"
    environment:
      TZ=Europe/Madrid # Establece la zona horaria de tu ubicación.
      WEBPASSWORD: '$$Passw0rd'
    volumes:
      - './etc-pihole/:/etc/pihole/'
      - './etc-dnsmasq.d/:/etc/dnsmasq.d/'
    cap_add:
      - NET_ADMIN
    restart: unless-stopped
    networks:
      containers:
        ipv4_address: 172.20.0.7

	duckdns:
		image: lscr.io/linuxserver/duckdns:latest
		container_name: duckdns
		environment:
		  - PUID=1001 # PUID del usuario, simplemente escribe en el terminal: id
		  - PGID=1001 # PGID del grupo
		  - TZ=Europe/Madrid # Establece la zona horaria de tu ubicación.
		  - SUBDOMAINS=dominio.duckdns.org # El dominio que acabas de registrar en Duck Dns.
		  - TOKEN=TU-DUCK-DNS-TOKEN
		  - LOG_FILE=false #optional
		volumes:
		  - /home/usuario/duckdns/config:/config # Modificar el Path
		restart: unless-stopped
		
networks:
  containers:
    ipam:
      config:
        - subnet: 172.20.0.0/24
Más info sobre el contenedor de Pi-Hole en https://github.com/pi-hole/docker-pi-hole/
Levantar los contenedores:
# docker compose up -d
Ya tenemos los contenedores docker de Wireguard, DuckDNS y Pi-Hole levantados ¿Y ahora qué?
Pues respecto a DuckDNS nada. En cuanto a Pi-Hole ya estará funcionando en modo básico pero se puede añadir más configuración.
¿Y Wireguard? Pues faltará añadir los peer a los clientes pero eso lo dejo para el siguiente artículo.