He estado intentando que esto funcione durante mucho tiempo, y ahora que lo he logrado, te comparto cómo hacerlo.
AlgoVPN es una solución VPN para crear tu propia VPN. Está principalmente orientada a implementarla en un servicio en la nube, como DigitalOcean, pero también soporta una instalación local en Ubuntu 16/18. Creo que también funciona con Debian, pero no lo he probado aún. Si alguien lo intenta, por favor comenta cómo le fue.
En la documentación de PiHole hay un tutorial para tener PiHole y OpenVPN en la misma máquina. Es una solución muy conveniente, pero yo prefiero Algo debido a la paranoia por los agujeros de seguridad de OpenVPN y la opción de usarlo de forma nativa en Android, iOS, Linux y Windows, sin ningún software de terceros en el cliente.
AlgoVPN tiene la opción de instalar automáticamente un DNS de bloqueo de anuncios, pero no me gusta en absoluto porque no se puede gestionar como PiHole.
Esto se hizo en una máquina con Ubuntu Server 18.04.1. Probablemente funcione en otros sistemas basados en Debian, pero tendrás que probar para saber.
El principal problema fue que después de instalar PiHole y AlgoVPN (el orden no importa, pero en la prueba final se instaló primero AlgoVPN), PiHole solo funcionaba cuando usabas la VPN, pero las consultas DNS no se atendían desde fuera.
Encontré varias soluciones alternativas involucrando dnsmasq, que eran tediosas y no funcionaban, principalmente porque estaban concebidas para OpenVPN. Esta solución se hizo con iptables. Me costó mucho entenderlo porque eliminar todas las reglas no funcionaba. AlgoVPN siempre funcionaba, sin embargo PiHole solo funcionaba después de instalarlo y antes de reiniciar la máquina. Después del reinicio, 4 reglas desaparecían de iptables, y volver a agregarlas solucionaba el problema. Comencemos con el proceso:
Instalando Algo
1.- Instalar dependencias
sudo apt-get update && sudo apt-get install \
build-essential \
libssl-dev \
libffi-dev \
python-dev \
python-pip \
python-setuptools \
python-virtualenv -y
sudo apt-get install software-properties-common && sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update && sudo apt-get install ansible python-pip build-essential python-dev
pip install virtualenv
pip install --upgrade pip
git clone https://github.com/trailofbits/algo
2.- Modificar archivos de Algo
2A.- Configurar usuarios y DNS locales
Modificar el archivo “/algo/config.cfg”
En la parte superior, cambia los usuarios Dan y Jack por los que desees y añade más si es necesario.
En la línea 48, cambia dns_encryption a false
En la línea 54, cambia dns_servers 1.1.1.1 a 127.0.0.1 y elimina la segunda entrada si quieres usar PiHole cuando estés conectado a la VPN. Cambia los servidores IPv6 solo si tu máquina lo soporta.
2B.- Usar un dominio en lugar de una IP fija (Opcional)
Algo solo soporta oficialmente usar una IP fija, pero si modificas esto, puedes usar un nombre de dominio sin problema.
En el archivo “/algo/roles/vpn/defaults/main.yml” modifica la línea
subjectAltName_IP: "IP:{{ IP_subject_alt_name }}"
a
subjectAltName_IP: "DNS:{{ IP_subject_alt_name }}"
Personalmente recomiendo duckdns.org, gratuito y muy conveniente.
3.- Ejecutar el instalador de Algo
cd algo
python -m virtualenv env && source env/bin/activate && python -m pip install -U pip && python -m pip install -r requirements.txt
./algo
Si estás instalando Algo en una máquina local como yo, selecciona la opción 7, presiona enter en las siguientes 2 opciones, no escribas nada.
Ahora escribe tu nombre de dominio/IP fija. Las siguientes opciones dependen de ti, selecciona lo que necesites y/o quieras.
Espera a que AlgoVPN termine la instalación, y copia el mensaje final que será algo así:
"\"#----------------------------------------------------------------------#\"",
"\"# Felicitaciones! #\"",
"\"# Tu servidor Algo está en marcha. #\"",
"\"# Los archivos de configuración y certificados están en el directorio ./configs/. #\"",
"\"# Ve a https://whoer.net/ después de conectarte #\"",
"\"# y asegurate de que todo tu tráfico pase por la VPN. #\"",
"\"# DNS local en 172.16.0.1 #\"",
"\"# La contraseña del p12 y las claves SSH es XXXXXXXX #\"",
"\"#----------------------------------------------------------------------#\"",
Necesitarás la contraseña del p12 para configurar tus clientes.
Instalando PiHole
Ejecuta el siguiente comando. Es una forma fácil pero un poco arriesgada (por un ataque man-in-the-middle improbable)
curl -sSL https://install.pi-hole.net | bash
El instalador de PiHole es muy intuitivo. Solo debes asegurarte de que, al escoger la interfaz de PiHole para escuchar, seleccionas wlan0/eth0 y no wg0.
Reinicia tu máquina
Corrigiendo el problema
Ahora, AlgoVPN funciona perfectamente, y PiHole solo cuando conectas a la VPN. Para que sea funcional desde afuera, solo introduce los siguientes comandos:
sudo iptables -A INPUT -p tcp --dport domain -j ACCEPT
sudo iptables -A INPUT -p udp --dport domain -j ACCEPT
sudo iptables -A INPUT -p tcp --dport http -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 4711:4720 -j ACCEPT
sudo dpkg-reconfigure iptables-persistent
Fin
Espero que esto ayude a quienes hayan invertido tanto tiempo en resolver esta solución.
Créditos a @notDavid y @hduarte, usuarios de GitHub que me ayudaron aquí a poder usar un nombre de dominio en lugar de una IP fija.
Gracias a PiHole por tener un solucionador DNS tan versátil, configurable y fácil de usar.
También gracias a AlgoVPN por proporcionar esta solución VPN muy bien documentada.
Por último, perdón por mi inglés, hace tiempo que no escribo algo de más de 3 líneas.