Por si os incorporáis ahora a esta serie de tutoriales, antes de empezar voy a resumir un poco lo que hemos visto en artículos anteriores.
- Parte 1: Hemos instalado el sistema operativo a una Raspberry
- Parte 2: Hemos explicado qué es Docker y sus componentes, y hemos instalado en nuestro equipo Docker y Docker compose.
- Parte 3: Hemos instalado nuestro primer Docker (Esto lo podemos hacer en una Raspberry o en un ordenador con cualquier Linux derivado de Debian o Ubuntu)
- Parte 4: Hemos explicado unos cuantos comandos útiles para resolver problemas y gestionar nuestros Dockers.
En este artículo vamos a instalar nuestro segundo Docker, pero lo haremos mucho más rápido que el primero, porque voy a suponer que tenemos los conceptos más claros. Si os habéis incorporado ahora en el tutorial y no queréis ver los anteriores os recuerdo que para hacer lo que se indica aquí necesitáis 3 cosas.
- Tener una Raspberry Pi con Raspberry Pi OS lite instalado (Se explica cómo instalarlo en el primer tutorial), o un equipo con un sistema operativo linux derivado de Debian o Ubuntu, aunque sea un PC estándar.
- Tener instalado en ese equipo Docker y Docker Compose (Se explica cómo instalarlo en el segundo tutorial).
- Para poder hacer todo lo que se indica en este artículo es completamente necesario que vuestro proveedor de internet os de una dirección de IP pública (ya sea una IP fija o dinámica, pero al menos que sea una IP accesible desde internet, o sea, desde fuera de vuestra conexión). A veces, para abaratar conexiones, los operadores comparten la misma dirección IP con varios usuarios (es una tecnología que se llama «CGNat») y así es imposible crear un servidor de absolutamente nada (Vodafone es muy de hacer estas cosas). Si vuestro proveedor os da una conexión de este tipo, hablad con su servicio de atención al cliente. Muchas veces el cambio a una ip pública es gratuíto. Si no os lo ofrecen, tendríais que cambiar de operador de internet. No queda otra.
- Tener en la carpeta de nuestro usuario una carpeta llamada «docker». Algo así:
/home/<carpeta_del_usuario>/docker
¿Y qué VPN vamos a instalar? ¿OpenVPN? ¿Wireguard? ¿IKEv2? ¿L2TP con IPSec? ¿Alguno raruno que te vas a sacar de la manga?
No, usuario anónimo. No nos vamos a poner a hacer saltos mortales en este artículo. Creo que lo mejor en este caso es instalar Wireguard. Es un sistema muy extendido, rápido y fiable. Dado que el objetivo es ponerlo a funcionar en instalaciones domésticas (hemos venido a aprender) y dado que no quiero meteros miedo con instalaciones «extrañas», vamos a tirar por la vía más sencilla de instalación. La instalación oficial de Wireguard en Docker es algo complicada para el nivel que queremos tener en estos tutoriales, sobre todo a la hora de gestionar usuarios (crear usuarios nuevos, eliminar los ya existentes, etc…). Por eso, en lugar de usar el docker oficial, haremos la instalación de otro sistema que se llama WG-Easy, que…
¡¡Pero qué me estás diciendo!! ¡¡No me lo puedo creer!! En el segundo artículo nos das la chapa acerca de que no debemos instalar nunca Dockers que no provengan de desarrolladores oficiales y ahora me mandas instalar algo de un ¿hacker Ruso?. El experto en docker que nos has presentado hace un par de tutoriales no estaría de acuerdo con ésto.
¿Pero qué hacker ruso ni qué…? A ver: WG-Easy es un proyecto que intenta resolver dos problemas: Por un lado hacer la instalación de Wireguard mucho más sencilla y por otro darnos un interfaz gráfico para gestionar los usuarios. El proyecto está publicado en Github, donde puedes ver los nombres de los desarrolladores. Y si aún así tienes dudas sobre si este software es maligno, eres completamente libre de inspeccionar el código y compilarlo por tu cuenta para comprobar que no tiene ningún virus ni sorpresas ocultas (Esa es la magia del software libre).
Sin más preámbulos vamos a seguir el mismo esquema que usamos en el artículo de Pi-hole para no liarnos en estos primeros pasos.
1) Ajustes previos. Modificamos el docker de Pi-hole.
Antes de empezar a configurar el VPN, si hemos optado por usar Pi-hole como servidor de DNS (o sea, que hemos realizado todo lo que hemos dicho en el artículo número 3 de esta serie), debemos hacer primero un par de cambios.
1.1) Creamos una red para que Pi-hole y WG-Easy se puedan comunicar
Vamos a empezar yendo a la carpeta dónde tenemos todos los ajustes de nuestro pi-hole con el siguiente comando:
cd /home/<tu_usuario>/docker/pihole
Evidentemente, debemos cambiar lo de <tu_usuario>
por el usuario de la raspberry. Ahora crearemos una red interna dentro de docker para conectar los contenedores de Pi-Hole y Wireguard.
¿Lo qué? ¿Esto no es algo muy complicado?
Esto tiene su ciencia y os explicaré cosas sobre las redes algunos artículos más adelante, pero en este artículo vamos a ir al grano así que simplemente ejectuad este comando.
sudo docker network create pihole_wg_network
Esto os asegurará que tanto Pi-hole como Wg-Easy se comuniquen entre ellos sin problema.
1.2) Rehacemos el archivo docker-compose de pi-hole.
Ahora debemos cambiar el archivo docker-compose.yml
por uno ligeramente modificado. No os asustéis, que el cambio es muy pequeño, y de hecho para no liaros con las modificaciones vamos a borrar por completo ese archivo y vamos a crearlo de nuevo. Lo haremos con los siguientes comandos:
sudo rm docker-compose.yml
sudo nano docker-compose.yml
Una vez abierto el editor de texto (que estará en blanco después de borrar el archivo) pondremos esto:
version: "3"
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
# Para DHCP se recomienda eliminar estos puertos y poner esto en su lugar: network_mode: "host"
networks:
- pihole_wg_network
ports:
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp"
- "8091:80/tcp"
environment:
TZ: $TZ
WEBPASSWORD: $WEBPASSWORD
FTLCONF_LOCAL_IPV4: $DIRECCIONIP
volumes:
- $DOCKERDIR/pihole/etc-pihole:/etc/pihole
- $DOCKERDIR/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
cap_add:
- NET_ADMIN
restart: unless-stopped
networks:
pihole_wg_network:
external: true
Lo único que hemos cambiado son las tres filas de abajo y la sección «networks» en las filas 8 y 9. Con este cambio tan simple el contenedor de Pi-Hole va a pertenecer a la misma red que el contenedor de WG-Easy que vamos a crear. Cuando hayamos terminado, pulsamos Control + O para guardar cambios y Control + X para salir del editor.
Por último, vamos a parar el contenedor del pi-hole y vamos a volver a levantarlo para que los cambios se hagan efectivos. Lo haremos con los siguientes comandos:
sudo docker-compose down
sudo docker-compose -p "pihole" up -d
Con esto ya tendremos listo el contenedor de Pi-hole para comunicarse con nuestro Wireguard.
2) Dentro de la carpeta «docker» creamos la carpeta «wireguard» y su estructura.
Empecemos ahora con la configuración del nuevo docker de WG-Easy. Empecemos yendo a nuestra carpeta «docker» que está en la carpeta de nuestro usuario (recuerda: en /home/<tu_usuario>/docker
). Dentro de ella vamos a crear otra carpeta llamada etc_wireguard
. Lo haremos con estos comandos.
mkdir wireguard
cd wireguard
mkdir etc_wireguard
Recuérdame: ¿Por qué hacías esto?
En esa carpeta se van a almacenar todos los datos que genere WG-Easy, que en resumidas cuentas serán las configuraciones del programa y los perfiles de los usaurios. Por el nombre, seguro que te das cuenta de que esa carpeta, si no estuviéramos usando docker, estaría en la ruta /etc/wireguard
.
¿Y cómo has sabido que debías crear esa carpeta?
Pues porque aparece en la zona volumes
del archivo docker-compose.yml
. Vamos a verlo en el siguiente punto.
3) Creamos un «hash» para la contraseña de acceso a la web de configuración.
El sistema que estamos desplegando nos va a generar en su momento una web desde la que podremos gestionar los usuarios de nuestra VPN. Para acceder a esa web necesitaremos una contraseña (y su hash) que debemos definir previamente. Supongamos que esa contraseña es meacabodetirarunpedo
(por poner una cualquiera).
(y luego se cree que su blog es serio. Si es que...).
Esto... oye.. ¿Que es eso del hash de la contraseña?
Un hash de una contraseña es como una versión codificada de esa contraseña. Imagina que escribes una contraseña en un papel, la metes en una máquina que la convierte en un montón de números y letras al azar, y luego tiras el papel original. Aunque veas el resultado, no puedes regresar a la contraseña original. Así, aunque alguien vea el hash, no podrá saber cuál era la contraseña real. Ni siquiera la máquina que la ha generado va a conocerla. Sin embargo lo que puedes hacer es preguntarle a esa máquina ¿La contraseña es «patitorosa»? La máquina generará de nuevo el hash. Si coincide, la contraseña es correcta.
Crear un hash de nuestra contraseña es muy muy sencillo. Sólo debemos poner esto en el terminal.
sudo docker run ghcr.io/wg-easy/wg-easy wgpw meacabodetirarunpedo
Por supuesto, en el final de esa línea debemos poner la contraseña que queremos usar. Al darle a enter, obtendremos algo como esto:
PASSWORD_HASH='$2a$12$YY6EMJM3HwW4KLph6ZIO5OQPhnhqcRTgmvVANjN2600GjUceyf1qG'
Lo que está dentro de las comillas será el hash de nuestra contraseña. Anotad el que se os genere en vuestro equipo. Lo usaremos dentro de un rato.
4) Creamos el archivo .yml con la configuración del docker.
Dentro de la carpeta wireguard
creamos el archivo docker-compose.yml
con este comando.
sudo nano docker-compose.yml
Y le vamos a poner exactamente este contenido (no le cambiéis ni una coma).
version: "3.8"
volumes:
etc_wireguard:
services:
wg-easy:
environment:
# Change Language:
# (Supports: en, ru, tr, no, pl, fr, de, ca, es)
- LANG=$LANG
- WG_HOST=$WG_HOST
- PASSWORD_HASH=$PASSWORD_HASH
- WG_DEFAULT_DNS=$WG_DEFAULT_DNS
# Optional:
# - WG_PORT=$WG_PORT
# - WG_DEFAULT_ADDRESS=$WG_DEFAULT_ADDRESS
# - WG_MTU=$WG_MTU
# - WG_ALLOWED_IPS=$WG_ALLOWED_IPS
# - WG_PERSISTENT_KEEPALIVE=25
# - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
# - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
# - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
# - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
image: ghcr.io/wg-easy/wg-easy
container_name: wg-easy
networks:
- pihole_wg_network
volumes:
- $DOCKERDIR/wireguard/etc_wireguard:/etc/wireguard
ports:
- "51820:51820/udp"
- "51821:51821/tcp"
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
networks:
pihole_wg_network:
external: true
Pulsad ahora las teclas "Control" + "o"
para guardar los cambios y luego "Control" + "X"
para salir del editor de texto.
Si os fijáis hay muchas líneas comentadas (son configuraciones opcionales que no vamos a ver aquí), pero siempre está bien inspeccionar el código. No vamos a hacer de programadores, pero si queréis usar Docker con soltura al menos debemos fijarnos en estas cosas:
- El apartado «volumes»: Como veis, indica que dentro del docker, hay una carpeta «
/etc/wireguard
» que en el host (en el sistema operativo de nuestra raspberry) se situa en «$DOCKERDIR/wireguard/etc_wireguard
«. Es decir, que todo lo que haya en esa carpeta de nuestro host también estará en la carpeta del directorio «/etc/wireguard
» del Docker. Como es la única carpeta que hay en «volumes», es la única carpeta que creamos en el primer apartado. La parte donde está el símbolo del dólar ($DOCKERDIR
) es una variable que definiremos en el archivo de variables de entorno más adelante (para no meter ese dato dentro del archivodocker-compose.yml
. - El apartado «environment»: Si os fijáis, ahí van configuraciones y contraseñas. Todas las entradas en este apartado usan variables (tienen el símbolo del dolar), precisamente para no exponerlas en ese archivo (por seguridad).
- El apartado «ports». Como veis, este Docker usa dos puertos. El 51821 es para generar una página web y el 51820 es el puerto que usa Wireguard para comunicarse con los clientes. Debemos abrir este último puerto en el router (mapearlo para que la ip de la raspberry pueda recibir peticiones desde internet hacia el puerto 51820 por UDP).
¿Y eso cómo se hace?
Debes entrar dentro del interfaz de configuración de tu router y hacerlo desde ahí. Por desgracia cada router tiene un sistema diferente para hacer este tipo de configuraciones, así que depende del fabricante y del modelo de router. Consulta su manual.
¿Y el 51821 no debo mapearlo?
No. Ese puerto sólo genera una web que usaremos para crear los usuarios. Hazme caso: No te interesa poner esa web disponible en internet. Sería un riesgo de seguridad.
5) Creamos un archivo oculto de variables de entorno.
Vamos a crear un archivo que se va a llamar «.env
» para pasarle al docker-compose.yml
las variables de entorno. Lo haremos con este comando:
sudo nano .env
Una vez dentro del editor de texto, pegaremos este contenido.
DOCKERDIR=/home/usuario/docker
LANG=es
WG_HOST=mi.dirección.ip.publica
PASSWORD_HASH='$2a$12$YY12345678abcdefghIJKLMN600GjUceyf1qG'
WG_DEFAULT_DNS=1.1.1.1
# Parámetros opcionales
WG_PORT=51820
WG_DEFAULT_ADDRESS=10.8.0.x
WG_MTU=1420
WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
En cada línea debemos rellenar los parámetros correctos. Os guío un poco.
- DOCKERDIR: es la ruta de acceso a la carpeta «Wireguard» dentro de vuestra carpeta de Docker (Básicamente, en esta línea sólo hay que cambiar la palabra «usuario» por el usuario correcto.
- LANG: debemos poner el lenguaje que usamos. Normalmente «es» si queréis lengua española.
- PASSWORD_HASH: Debemos poner el hash de la contraseña que hemos generado en el paso 3. Ojo: debe ir con comillas simples.
- WG_DEFAULT_DNS: Si hemos seguido por orden los tutoriales, aquí deberíamos poner la IP que ha asignado docker al contenedor del pi-hole (ya que Pi-Hole será nuestro servidor de DNS). Así, cuando nos conectemos a la VPN, el equipo desde el que nos conectemos no tendrá publicidad. Para averiguarla debéis teclear el siguiente comando:
sudo docker inspect pihole | grep "IPAddress"
Os debería salir algo similar a esto
En este caso, la ip que deberíais poner sería la 172.25.0.2. Eso os conectará los dos dockers.
- Si no tenéis Pi-Hole instalado, poned en el campo WG_DEFAULT_DNS alguna DNS genérica, como la 1.1.1.1 o la 8.8.8.8
- WG_HOST: Aquí debemos poner la dirección IP pública de nuestra conexión a internet (Recordad: No nos sirve CGNat. Consultad con vuestro operador de internet si tenéis dudas). La podemos obtener fácilmente accediendo a ésta página.
Oye… pero yo tengo una conexión doméstica con una IP variable, no una IP fija (como casi todo el mundo en su casa, vamos). Cada vez que reinicio el router mi IP pública cambia.
Entonces lo mejor que puedes hacer es registrarte en un servicio de DNS dinámico. Hay varios servicios gratuitos de este tipo, pero personalmente he tenido buenas experiencias con DNSExit. Lo que hacen estos servicios es asociar un dominio de internet del tipo loquesea.dyndns.org
a tu dirección IP pública, de tal forma que cuando algo intente acceder a esa dirección (por ejemplo un cliente de VPN), se redirigirá a tu IP pública. Para mantener la vinculación entre ambas cosas (IP pública y nombre de dominio), debes instalar un programa en tu Raspberry que cada 5 minutos vigila si ha cambiado la IP pública, y si es así se actualiza la vinculación con la nueva dirección IP. Si lo haces así deberías poner en el campo WG_HOST la URL que te da el servicio de DNSExit (del tipo loquesea.dyndns.org
).
También se puede contratar un dominio “de verdad” (de la forma loquesea.com
) y vincularlo a tu dirección IP pública. DNSExit ofrece la posibilidad de hacerlo, aunque si se trata de contratar un dominio para hacer cosas así prefiero hacerlo con DonDominio (que es una empresa española y tiene también un software específico para estas cosas que va muy bien). Para que te hagas una idea, esta web (flopy.es) está alojada en un servidor que tengo en casa, bajo ip dinámica y con el software de Dondominio vigilando por si en algún momento cambia la IP.
Es largo de explicar pero por fortuna ya lo hice en su momento, así que os voy a remitir al punto 2 de este artículo del blog. Ahí está absolutamente todo el proceso explicado. Por cierto: públicamente quiero agradecer al usuario «nomad0912» porque se me había olvidado comentar toda esta problemática de la variable WG_HOST
en el artículo. Muchas gracias por tu indicación.
En cuanto a los parámetros opcionales que hay en el archivo docker-compose.yml
también los he metido dentro de las variables de entorno, pero para lo que vamos a hacer no necesitamos tocarlos y no quiero complicar demasiado el tutorial explicándolos, así que simplemente dejadlos como están. Si cubrís correctamente el resto de parámetros, todo os debería funcionar bien en una instalación doméstica.
Una vez que hayamos puesto el contenido correcto en este archivo, lo guardamos pulsando primero «Control» + «o» y luego pulsando «Control»+ «X».
6) Protegemos el archivo de variables de entorno.
Vamos ahora a darle seguridad a ese archivo «.env». Simplemente debemos escribir este comando:
sudo chmod 600 .env
Este comando ya lo pusiste cuando instalamos el Pi-hole. ¿Qué hace exactamente? ¿Por qué este comando le da seguridad a ese archivo?
Mira, el comando chmod
sirve para cambiar los permisos a los archivos y carpetas. El número que va después del comando indica los permisos que le estamos dando a ese archivo. El primer número indica los permisos que le vamos a dar al propietario del archivo, el segundo número son los permisos que le daremos al grupo de usuarios al que pertenece el archivo y el tercer número son los permisos que le vamos a dar al resto de usuarios en general.
Cada una de esas cifras puede tomar estos valores:
0: Sin permisos.
1: Permiso de ejecución.
2: Permiso de escritura.
3: Permiso de escritura y ejecución.
4: Permiso de lectura.
5: Permiso de lectura y ejecución.
6: Permiso de lectura y escritura.
7: Permiso de lectura, escritura y ejecución.
Con eso en mente, lo que hacemos con el comando que os he indicado es lo siguiente:
- 6: El propietario del archivo tiene permisos de lectura y escritura.
- Primer cero: El grupo al que pertenece el archivo no tiene acceso al mismo
- Segundo cero: Ningún otro usuario tiene acceso al archivo.
Así que el único usuario que puede acceder al archivo es el nuestro. Si por algún motivo hay en el dispositivo alguna puerta trasera que intente acceder al archivo con otro usuario, incluso escalando privilegios, ese intruso no va a poder acceder a él.
Después de este inesperado paréntesis vamos a continuar montando nuestro Docker.
7) Desplegamos la máquina
¿Qué vamos a hacer ahora? Efectivamente: poner nuestra máquina en marcha. Para ello primero nos aseguramos de estar en ésta ruta:
/home/<tu_usuario>/docker/wireguard
Dicho de otra forma, debemos estar en la carpeta dónde hemos puesto el archivo docker-compose.yml
. Desde ahí vamos a teclear este comando:
sudo docker-compose -p "wireguard" up -d
Después de un ratito, nuestro Docker ya estará correctamente instalado en nuestro sistema.
Genial. ¿Entonces ya puedo usarlo? ¿Cómo me conecto desde el trabajo a mi casa?
Te puede el ansia viva Usuario Anónimo. Aún tenemos que hacer un ajuste si vamos a usar Pi-hole como nuestro servidor de DNS.
8) Primeros pasos con la VPN
Primero deberás entrar en la página web que genera el sistema y crearte un usuario de VPN (o crear todos los que veas conveniente). Ten en cuenta que no puedes usar el mismo usuario a la vez desde dos dispositivos diferentes, así que haz tantos usuarios como dispositivos desde los que vayas a acceder. La página web a la que debes entrar para crearte usuarios es ésta:
http://<direccion_ip_de_la_Raspberry>:51821
Asegúrate de sustituir lo que está dentro de los corchetes por la dirección IP de tu Raspberry. Te encontrarás con algo como ésto.
En esta página debemos poner la contraseña que hemos definido en el archivo de variables de entorno (.env
). En cuanto nos logemos, aparecerá algo así.
Pulsamos en «New Client» y creamos un nuevo usuario para nuestro VPN (Podemos crear tantos como queramos).
¡Hay que ver qué nombres más raros tienen los usuarios de tus servicios!
Qué te voy a decir a ti, Usuario Anónimo. Una vez creado el usuario lo veremos en la página principal.
Ahora podemos añadir esta cuenta al cliente de correo de wireguard tanto bajándonos el archivo de configuración (Con la flecha que apunta hacia abajo) como por medio del código QR que nos proporciona el sistema.
¿Y eso cómo se hace?
No tiene mucha ciencia, pero casi mejor te voy a remitir al apartado 12 de este artículo que escribimos en su día. Ahí se explica cómo descargar el cliente de VPN y cómo añadirle un usuario.
9) ¿Cómo se actualiza este Docker?
Al igual que en el artículo en el que explicábamos cómo instalar Pi-hole sobre Docker, realizar la actualización es muy sencillo. Como ya sabéis, lo hago creando un pequeño script. Nos situamos en a carpeta /home/<tu_usuario>
y allí escribo el siguiente comando:
sudo nano actualizar.sh
Pueden pasar ahora dos cosas: Si habéis seguido el artículo sobre la instalacion de Pi-Hole, os encontraréis con el código de actualización de ese docker, al que le debemos añadir algo muy similar para actualizar este nuevo docker. El código en este caso quedaría así:
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean -y
cd /home/<tu_usuario>/docker/pihole
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
cd /home/<tu_usuario>/docker/wireguard
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now
Por favor, acordaos de cambiar <tu_usuario>
por la carpeta de vuestro usuario. Si no lo hacéis, tendréis errores a la hora de ejecutar el script.
Como veis, los comandos son los mismos. Exactamente los mismos. La única diferencia es que los ejecutamos desde el directorio dónde está el docker-compose.yml
del Wireguard.
En el caso de que no os interese instalar pi-hole, entonces el código quedaría algo así:
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean -y
cd /home/<tu_usuario>/docker/wireguard
sudo docker-compose pull
sudo docker-compose up -d --remove-orphans
sudo docker image prune -f
sudo shutdown -r now
En ambos casos, pulsaría Control + o
para guardar los cambios y luego Control + x
para salir del editor.
Y en el segundo caso acordaos que debemos indicar que es un archivo ejecutable mediante el comando sudo chmod +x actualizar.sh
Cuando queramos actualizar el sistema a su última versión, simplemente deberíamos ejecutar este script con el comando ./actualizar.sh
Y esto es todo. Honradamente me ha salido un artículo mucho más largo de lo que quería. Al final va a tener razón el Usuario Anónimo cuando dice que me voy mucho por las ramas. Espero no haberos aburrido demasiado. ¿Habéis tenido algún problema desplegando este docker? ¿Queréis aportar alguna aclaración o algún otro método de instalación? Estaré atento a vuestros comentarios.
Buenas Marcos, genial como siempre.
Un apunte, ¿quizá faltaría matizar en el apartado de variables de entorno que es WG_HOST?
Uy… efectivamente. Me ha parecido tan obvio (es sólo la dirección ip pública de tu conexión a internet) que me he olvidado de ponerlo. Lo corrijo hoy por la noche sin falta. Mil gracias por el apunte.
Ya está el artículo actualizado con todas las referencias añadidas a la problemática sobre ip’s públicas, ip’s dinámicas, CGNat y dominios asociados. Lo he hecho tanto en la parte inicial del artículo, dónde se indican los requisitos y también en la propia parte de las variables. La verdad es que era una parte importante que se me había pasado completamente añadirla en el artículo. Mil gracias por el aporte, y que sepas que he indicado en el propio artículo que has sido tú el que me ha recordado esto.
Con artículos tan completos y complejos es normal que se pueda escapar alguna cosilla, es un placer haber ayudado.
Buenas. Supongo que ya tienes una ruta marcada sobre los próximos posts que supongo dependerá de lo que tu uses en tu Rpi server. Me permito hacerte algunas sugerencias para el futuro (son las que uso yo en mi Rpi server pero están instaladas directamente sobre el sistema operativo). Seafile es un ‘dropbox’ más robusto que Owncloud y más seguro e infinitamente más rápido. Navidrome es un spotify con tu música en tu Rpi que puedes oir en el coche o donde quieras que tengas conexión. Calibre-web para tener todos tu libros a mano siempre. Por supuesto son solo sugerencias, eres el puto amo.
Efectivamente. Conozco los tres softwares que indicas, y debo darte la razón: Cualquiera de los tres son una pasada para usuarios domésticos.
En todo caso fíjate que para cualquiera de los tres, antes de instalarlos a través de docker hay que instalar un proxy de algún tipo (podría recomendaros nginx proxy manager o traefik). Así que antes de indicar la instalacion de cualquiera de ellos hay que explicar la instalación de uno de estos proxys. Pero aún no es el momento. Primero quería seguir el mismo orden del antiguo tutorial y explicar la instalación de unos cuantos programas más que no van a necesitar ese proxy. Para ir poco a poco. Luego sí que instalaremos el proxy y nos pondremos a instalar cosas así. De los tres que indicas, sí que tenía pensado explicar Calibre. Seafile tiene ventajas sobre nextcloud, pero nextcloud tiene más opciones para pequeñas empresas, así que si explico la instalación de algo de esto (que tengo que pensar si es conveniente), posiblemente explique nextcloud. Navidrome sí que es el programa idóneo para temas de música, pero honradamente… últimamente uso tan poco estos softwares de música que prefiero no meterme con esto (no quiero explicar cosas de las que no tengo mucha experiencia).
En todo caso tendré en cuenta tu comentario. gracias por el aporte.
Gracias. Un apunte sobre owncloud-nextcloud. Por supuesto es experiencia personal. En varias de mis Rpis han acabado sin funcionar al cabo de meses. Y teniendo que reinstalar. Y no era la tarjeta SD porque sobre esa misma lleva Seafile corriendo 7 años 24 horas/365 dias. Sin interrupción y sin problemas. Nunca he conseguido un sistema estable con owncloud o nextcloud, siempre se corrompían.
mmmm… cuando pasan este tipo de problemas yo los achaco más a problemas con la tarjeta SD que a la propia instalacion de nextcloud. Además de mi nextcloud personal he hecho varias instalaciones de nextcloud para varias empresas y nunca he tenido ni el más mínimo problema de estabilidad. De hecho una de estas instalaciones lleva funcionando desde el 2014, se ha migrado desde owncloud a nextcloud, se han realizado todas las actualizaciones de forma que ahora mismo está en la última versión disponible de nextcloud, y funciona perfectamente (y mira que ha sido trasteada mil veces). Además, para que te hagas una idea, esa instalación ocupa más de un TB (sólo el nextcloud) y la usan simultáneamente y de forma muy activa 400 usuarios simultáneos. Vamos… que no he visto nunca problemas de estabilidad en nextcloud. Los problemas deberían ir por otro lado.
Donde sí he visto problemas (y a veces muy graves) es en las tarjetas SD de las raspberrys. Suelen ser bastante puñeteras y sensibles a cortes de luz y a reinicios inesperados. No es la primera vez que veo que se fastidia algo en una raspberry por culpa de un apagón o simplemente sin venir a cuento. Cuando la estabilidad en una raspbery es importante, siempre recomiendo hacer lo que indico en este tutorial:
https://www.flopy.es/arrancar-una-raspberry-desde-un-disco-duro-externo-o-un-pen-drive/
O sea, arrancarla e instalar todo en un disco duro externo en lugar de en la tarjeta SD. La velocidad va a ser mejor gracias al USB3 y se gana en estabilidad (mientras tuve la raspberry como servidor principal en mi casa, usé este método y ha significado una ausencia total de problemas).
Oye… no me entiendas mal. No estoy dudando de tu experiencia. Si a mi me pasara también estaría dudando de la estabilidad de Nextcloud. Pero al menos yo no he tenido nunca esa problemática en producción. Sí que la he tenido con tarjetas SD’s que me han llegado a tocar la moral y por eso me da que el problema va a ir por esa vía.
Y sí. Tengo que darte la razón. Seafile es un sistema también robusto y efectivamente es más rápido que Nextcloud (lo que dices es completamente cierto). Pero también tiene menos características adicionales y aplicaciones de terceros que expandan funcionalidades. Cada una tiene su nicho de mercado. Seafile tal vez está más enfocada al usuario doméstico (requiere menos equipo y va más fluída, además de tener una instalación y funcionalidades más sencillas), mientras que Nextcloud está orientado a cosas «mas grandes» (requiere más equipo pero a cambio te ofrece muchas más funcionalidades). Cada una es para lo que es y es justo decir que ambos softwares son muy buenos. Quién nos diría hace años que podríamos disfrutar de algo así en entornos domésticos. Como te dije antes no tengo claro si añadir una instalación de este tipo a este grupo de tutoriales. Después de explicar la problemática de los proxys (Ngins proxy manager y traefik) lo pensaré.
Buscaré un disco SSD USB a ver qué tal de precio y seguiré tus tutoriales en una Raspberry pi 4 que tengo por ahí. Cuando hagas el tuto de Nextcloud me lo instalaré en su docker para probar otra vez. Igual acabo desenchufando la Rpi con Seafile porque Nextcloud con sus plugins es mucho más que un simple servidor de archivos en tu propia nube. En eso tienes razón. De nuevo muchas gracias. Te sigo a partir de ahora. Y gracias al que te ha puesto en Menéame que si no es por él no me entero.
La verdad es que en menéame mandan muchas cosas de política, pero de vez en cuando aparecen pequeñas joyas a nivel de informática. Siempre que alguien sube algo de mi blog a menéame me siento más que agradecido, porque la verdad es que se nota en estadísticas de uso del blog. No me aporta nada a nivel económico (porque como veis no tengo publicidad en ningún sitio del blog) pero sí que es de agradecer a nivel personal ver que estás ayudando a más gente. Si alguna vez veis algún artículo mío interesante en el blog y lo subís a menéame o le dais difusión por otros sitios, para mi es la mejor recompensa.
Hoy no soy el primero. Buenisimo. Yo monte wg-easy hace unos dias por mi cuenta. Tuve problemas para conectarlo con el pi-hole, ya que estan en redes distintas en docker. En mi caso una .18.x y 19.x. No supe conectarlas. Crep que modificaba los yml pero luego no me cambiaba. Cuando lo conseguí, creo que era que hay que borrar y volver a crear el usuario. En el hub de wg-easy encontre alguien que hacia un unico compose para los 2 con la declaracion de la red, asi si funcionaba.
Asi que voy a sugerir. Gestion de redes en docker, y como modificar contenedores (para no borrarlos y volver a empezar), asi si modifico wg-easy para ponerlo como tu, no perder los usuarios que ya tengo creados.
A ver… hay una forma de hacerlo más elegante pero más complicada (que no es plan explicarla en estos artículos básicos para gente que se está iniciando) y luego la solución por la que hemos optado aquí.
Sobre la forma elegante: evidentemente podemos poner los dos dockers en la misma red. En ambos dockers podríamos poner algo como esto en el archivo yml.
version: '3'
services:
nombre del servicio:
image: imagen_del_servicio
networks:
- red_compartida
networks:
red_compartida:
driver: bridge
De esta forma estarían los dos en la misma red. Volveríamos a lanzar los servicios con
docker-compose up -d
y listo. Estarían los dos en la misma red. En el VPN habría que poner la dirección asignada al docker de pi-hole.Pero eso implica tener conocimientos de las redes que crea Docker, segmentos de red, etc… Me parece un poco pronto para plantear esto.
La solución por la que optamos es un poco menos elegante. El docker de pi-hole es un servidor de dns. Al coger las dns directamente desde el host, habrá un salto en la red (esa conexión se hace primero en el host y luego debe ir al segmento de red del docker). Ese salto no es lo ideal porque también se hace en el otro docker (Se coge del segmento del host y se pasa al openvpn). Al final, para cada petición de DNS hay dos saltos. Pero funciona y es menos lioso.
Un problema similar lo tendremos si queremos montar un servidor apache o nginx y queremos que la velocidad de descarga o subida de ese docker sea la óptima usando un proxy. Si lo hacemos de la forma que he propuesto en este artículo, aquí sí que se va a notar lentitud en el sistema (y para eso está precisamente traefik, para arreglar este problema). En todo caso llegado el caso me pensaré cómo es la mejor manera de abordar toda esta problemática de forma que sea lo más didáctica posible.
La gestión de redes en docker no es algo tan sencillo de explicar y de entender como los conceptos que estamos viendo. Si lo vemos, lo veremos en todo caso más tarde, cuando nos dediquemos al proxy nginx manager.
En cuanto a modificar contenedores… tal y cómo te dije, y sólo si es añadir características al archivo .yml, es tan simple como modificar el archivo .yml y volver a lanzar el comando para desplegar el contenedor. Si es algo que implique modificar la imagen, entonces de nuevo es algo que es mejor tratar con profundidad.
Muchas gracias por la respuesta. Seguiremos antentos a los proximos. Me imagino que no soy el unico que no parto de cero de los que te seguimos, de redes tengo «el culo pelao» y estamos aquí por docker.
Muy fan, eres un maquina.
hola, gracias de nuevo.
una duda más de programa q de instalación: con este VPN personal lo «único» q conseguimos es poder acceder a la raspberry desde fuera de nuestra red de forma segura, no? no sirve para esconder nuestra ip al usar programas como amule o transmission, no?
gracias!
Claro. Esta vpn es para acceder desde fuera, no sólo a la raspberry, sinó a cualquier equipo que puedas tener en tu red. Imagina qué quieres dejar un Windows encendido en tu casa. Con esta VPN por ejemplo podrías acceder a él por la aplicación de escritorio remoto y usarlo como si estuvieras sentado físicamente delante de él. También te servirá para usar el pi-Hole fuera de casa. Por ejemplo, sí estás en un bar, te conectas por vpn y navegas con toda la publicidad bloqueada en tu móvil. También te sirve para sortear bloqueos de webs cuando viajas a otros países (por ejemplo, para ver cosas que sólo se pueden ver desde España en el extranjero). Pero lo que no va a hacer es camuflar tu ip de casa. Para eso tendrías que usar un vpn externo.
Hola Marcos,
Antes de nada, muchas gracias por estos tutoriales.
Estoy intentando adaptar las restricciones de IP siguiendo este manual
https://www.flopy.es/restricciones-de-puertos-e-ips-usando-wireguard/
pero no consigo que me funcionen las restricciones. ¿Igual puede ser porque este está instalado en docker y en el tutorial está a pelo? Muchas gracia
Prueba a añadir esta línea en /etc/sysctl.conf
net.ipv4.ip_forward=1
Luego aplica cambios con un sysctl -p (o reinicia el equipo). Así te aseguras de que el reenvío de IP’s está habilitado en el host (que a lo mejor es tu problema).
Asegúrate de que estás cogiendo correctamente la ip de los clientes de WG-Easy. En principio no debería tener problemas mezclar los dos artículos.
Muchas gracias
El problema era que al crear el archivo IPS no tenía instalado el UFW. Al instalarlo, me ha bloqueado todo y he tenido que desinstalarlo. Ahora no veo cómo sustituir esta línea:
sudo service ufw restart
por algo similar con IPTABLES para que se actualicen los cambios de restricciones. ¿O igual no hace falta y con reiniciar es suficiente?
Saludos
A mi me ha funcionado sin problema en una pi4 y siguiendo el mismo tutorial, no creo q sea por docker.
Buenas
Casi me ha funcionado a la primera, el problema es que llegó a mí rpi4 por la con pero ya no me deja navegar, voy desde mi móvil a la shell e intento hacer un ping al router o servidor dns pi-hole y nada.
En resumen, funciona pero no consigo navegar a través de la raspi con mi móvil Isabel vpn
Me respondo: la solución fue poner en el cliente wireward la IP privada que asigna el docker del servidor VPN en el aprtado DNS del cliente android de wireward, en mi caso la direcion IP que asigna fue 172.19.0.1, el error fue intentar usar la IP fija que daba el router a la raspi (192.168.1.177)…
Hola Carlos. A mi no me deja navegar ni poniendo la IP interna del Pi-hole. He cambiado de todo… ¿probaste alguna cosa más antes de llegar a esta conclusión? por ver si me estoy dejando algo por el camino. Muchas gracias
Hola, y dónde encuentras esa ip privada q asigna pi-hole a la raspi?
Gracias!
hola,
gracias de nuevo, genial como siempre! tres cosillas:
1. del yaml me da error al desplegar la máquina, como un error del compose:
ERROR: Version in «./docker-compose.yml» is unsupported. You might be seeing this error because you’re using the wrong Compose file version. Either specify a supported version (e.g «2.2» or «3.3») and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
si le cambio el 3.8 por 3.3 sí q se depliega, puedo crear usuario y funciona.
2. al crear un usuario y bajar la configuración por archivo, es un archivo .txt, y el cliente de wireguard espera un archivo de configuracion .conf o .zip, no un .txt. por QR ha funcionado perfectamente. problema de versiones?
3. el tema del DNSexit.com ya no son los menús como en el artículo q lo explicabas hace años. he seguido las instrucciones de dnsexit y ha funcionado bien, básicamente ejecutar el script:
# Set curl command to update the IP
command=»curl https://api.dnsexit.com/dns/ud/?apikey=lapikeyquetedaautomática -d host=loquesea.linkpc.net»
if [ -d «/var/log» ]; then
command=»$command >> /var/log/ipupdate.log»
fi
# Get the existing crontab content
existing_crontab=$(crontab -l 2>/dev/null)
# Check if the command is already in crontab
if [[ $existing_crontab == *»$command»* ]]; then
echo «Scheduled job already exists in crontab.»
else
# Add the scheduled job to the existing crontab content
new_crontab=»${existing_crontab}
*/12 * * * * $command»
# Install the modified crontab
echo «$new_crontab» | crontab –
echo «The following job has been added to crontab. You may use command «crontab -l» to view the job»
crontab -l | grep curl
fi
si funciona bien lo dejamos así?
gracias!
Acabo de volver a desplegar ese contenedor de nuevo por si me había confundido en algo. No veo el problema que me estás reportando, por lo que supongo alguna de estas dos cosas:
– Estás usando una versión antigua de raspberry Pi OS que no tenga una versión de Docker Compose tan moderna .
– Estás usando un sistema operativo antiguo que no tiene esa última versión.
Yo lo que te recomendaría es primero subir la versión de Docker. A lo mejor parte de esos problemas quedan resueltos. Si has seguido los tutoriales deberías tener una versión suficiente como para que no origine ningún error.
Lo de que te baje un TXT es también algo raro, que puede estar ocasionado por la versión inferior de docker. En todo caso prueba a cambiarle la extensión txt por conf, a ver si el contenido del archivo es correcto.
Si el script funciona correctamente y el resto funciona como debería, yo no tocaría más esto, pero en todo caso lo que es seguro es que tu sistema no tiene la última versión de docker. Haz un sudo apt-get update y luego un sudo apt-get dist-upgrade a ver si con eso coges lo que te falta.
gracias!
era eso q dices, no era la última versión del SO.
el problema q me persiste, como dicen algunos otros, es q puedo acceder a mi red desde fuera, pero no puedo volver a salir a fuera, o sea, puedo utilizar los dockers y otras cosas locales de mi red a distancia, pero no puedo navegar por internet con un explorador ni utilizar apps q se tienen q conectar a internet con el VPN, no sé si me explico. sería cosa del pihole como dice carlos? poner un DNS secundario?
te agradezco respuesta, ya q la VPN es un gran utilidad.
saludos!!!
Gracias por tu trabajo aunque mi problema es que la VPN funciona enlazo en el túnel pero sin internet soy principiante y agradezco estos tutoriales pero estoy a punto de dejarlo y vender la Raspberry 5 si lees esto agradecería tu ayuda.
Nota: con OMV el wireguard iba bien pero no pihole siguiendo tus tutoriales primero instale pihole y funciona después wireguard y funciona pero activada en el móvil la vpn este no tiene internet.
No tires la toalla y piensa que lo que me estás diciendo parece ofrecer pistas de la solución.
Si la conexión se realiza correctamente pero lo que te falla es la conexión a internet, a lo mejor estás usado un servidor de DNS que no es el correcto. En el archivo «.env» asegúrate de que el servidor de DNS sea el 1.1.1.1 con esta línea
WG_DEFAULT_DNS=1.1.1.1
O si quieres probar uno distinto, prueba poniendo esto:
WG_DEFAULT_DNS=8.8.8.8
Es preferible probar primero con estas dns’s si tienes problemas de conexión. Si tienes el VPN vinculado con el pi-hole para quitar la publicidad, a lo mejor es esa conexión entre los dos programas la que te está fallando. Si con estas dns’s vuelves a navegar por internet, entonces ya sabes que hay algo mal entre la conexión del VPN y la del Pi-Hole. Evidentemente después de modificar esa línea, reinicia la raspberry, que si no el contenedor no se va a enterar de lo que has hecho.
Asegúrate de que no estés bajo una conexión con CG-NAT. Lo repito varias veces en el tutorial, pero recalco que si estás bajo CG-NAT no te va a funcionar nunca el VPN (llama a tu operadora de internet para preguntar si estás bajo CG-NAT si tienes dudas).
Otra cosa que puedes hacer: Si usas la VPN desde tu móvil, instala un programa como «ping lite». Desde ese programa con la vpn conectada (aunque no te funcione internet) puedes lanzar pings a ordenadores que tengas encendidos en tu red. Si esos equipos te responden a ping, entonces es que el problema son las dns o al menos se restringe a la navegacion. Si no responde nada de tu red local, a lo mejor el problema es tu operador a internet (CG-NAT) o que tienes mal configurado tu dominio.
Haz esas pruebas y coméntanos qué obtienes. A ver si entre todos podemos saber qué puede estar pasándote.
Gracias por tu contestación y tu interés e probado todo las DNS incluso e probado la del instalador y si en el móvil con el Ping y sin Wifi puedo ver que estoy en mi red por ejemplo la cámara IP el TV ping correcto pero no tengo internet.
Si e observado que haciendo mapeo de puertos el 53 Domain Name Server (DNS) esta en uso constante y Pihole lo usa puede ser una pista.
Detengo el docker pihole pero lo mismo siguo sin internet
Hola Marcos,
El problema q reporta Paco creo q es el mismo q habíamos reportado más arriba: desde fuera de casa wireguard nos permite conectar a la red local de casa (a todos los dockers q tenemos instalados en la Raspberry y otras ip locales) pero no nos permite navegar por internet ni utilizar apps q necesitan conexión a internet, es como si wireguard hiciera su función de hacer de puente a casa, pero algo impidiera q pueda salir de la red local (pi-hole?).
He probado lo q dices del DNS 1.1.1.1 y 8.8.8.8 y no ha funcionado. Tampoco el 172.18.0.1 q parece q es el q tiene asignado pi-hole.
Muy encallado aquí, la verdad, pq wireguard promete, pero algo hay q no deja q funcione.
Gracias!
Creo que ya he podido por fin reproducir el problema. Voy a tener que modificar el tutorial 5 para evitar que os siga pasando. Al parecer no es algo que ocurra en todas las instalaciones pero hay una forma de evitar que pase (poner el docker de pihole y el de wg-easy en la misma red). Quería evitar esto a toda costa en un tutorial tan básico pero intentaré hacerlo de la forma más sencilla posible. A ver si hoy a la noche puedo publicar la modificación
Bueno… artículo modificado. Espero que no sea demasiado lioso. Os resumo lo que tenéis que hacer si habéis hecho las cosas según el artículo viejo.
1) Seguir el nuevo punto 1 del artículo al dedillo. Hay que modificar un par de cosas sencillas en el docker del pi-hole (básicamente crear una red y poner el pi-hole en esa red y luego reiniciar ese contenedor).
2) Modificar el docker-compose.yml del wg-easy por el que se indica en el artículo en el punto 3.
3) averiguar la ip que le asigna el docker al contenedor de pi-hole con el comando siguiente:
sudo docker inspect pihole | grep «IPAddress»
4) poner la ip que nos muestra el comando anterior en el campo WG_DEFAULT_DNS del archivo .env
5) detener el docker de wireguard y volverlo a levantar con estos dos comandos (ejecutados desde la carpeta /home//wireguard/)
sudo docker-compose down
sudo docker-compose up -d
Y salvo equivocación mía ya debería funcionar la conexión a internet usando pi-hole como servidor de dns. Por cierto… borrad las VPN’s que hayáis creado y creadlas de nuevo. Seguramente tengan las DNS antiguas. Las nuevas ya deberían funcionar correctamente.
(Parece un poco lioso pero de verdad que no lo es en absoluto. Os lo doy bastante masticado).
Funciona mi problema solucionado muchas gracias Marcos con tu permiso seguiré tus artículos con el fin de seguir aprendiendo de este sistema operativo.
hola marcos!
perfecto! me ha funcionado! una pasada!!! mil gracias!!!
Genial, como todos. Es una placer cacharrear con mi torpeza con estos artículos tan bien explicados. Lo único, y espero no equivocarme, es que al no haber instalado pi-hole he tenido que comentar en el docker-composer las líneas: networks: – pihole_wg_network. Así ha levantado bien el docker.
Si no has instalado pi-hole es indiferente que toques o no la parte de redes. El tutorial está hecho para que el mismo docker-compose sirva para montarlo con pi-hole y sin él. Si has quitado esa parte y funciona no te preocupes.
Muy buenas a todos!!!! Felicidades por el tuto.
En mi caso instalado sin problemas en docker desktop bajo sistema windows. El único problema que le veo es que va muy lento.
Tengo fibra a 1 giga y apenas levanta 20 megas en navegación bajo esta vpn. No sé si es por limitación del docker.
Os ha pasado a alguién más?
Se me ha pasado responder a este comentario. Es normal lo que indicas, sobre todo cuando el servidor de VPN es una Raspberry. Cada vez que hay tráfico de datos, la raspberry debe encriptarlo todo en un sentido y desencriptarlo en el otro, así que con cualquier VPN siempre va a haber velocidades menores que sin VPN. No depende de la velocidad de la fibra (bueno… depende también de ella, pero el cuello de botella está en otro lado). Además, la instalación que estamos haciendo es para que todo sea súmamente sencillo de implementar. Si se trabaja un poco mejor se podrían conseguir mejores velocidades (poniendo el contenedor de WG-EASY en la misma red que la conexión a internet para evitar saltos), pero eso complicaría la instalación, cosa que no quiero en absoluto, y las mejoras no serían para tirar cohetes porque de nuevo toparíamos con la velocidad de la raspberry. Resumiendo: Son velocidades normales. Si quieres mejorarlas toca poner la instalación en un equipo con mejor hardware y gestionar la red de forma diferente, pero creo que son complicaciones que no compensan en absoluto a un usuario doméstico.
A Antonio:
Sal a tomarte una cerveza, hombre. Una VPN no tiene sentido si usas la misma salida a internet en tu dispositivo que la que usas en la VPN. Y te avisa con una velocidad asombrosamente baja. Sal, conecta con datos o a una wifi diferente y verás como funciona de verdad. Y disfruta la cerveza.
A Marcos:
Dejo de comentar en este blog por los innumerables problemas que me causa el recaptcha, que la mayoría de las veces no aparece y cuando envío me da error obligándome a ir atrás y perdiendo lo escrito. Y sigue sin aparecer, obligándote a repetir varias veces.
Enough is enough. Lo siento
Cierto, el recapcha da problemas pero dejar anímate y sigue comentando que el blog de Marcos lo merece y comentar ayuda a crecer entre todos!!
Mi historia con VPN tubo corto recorrido, la deje lista y el tándem pihole wireward funcionaba genial, el problema fué que, por el camino descubrí que mi proveedor de internet desde hace un año da tu usuario pppoe y … la posibilidad de instalar router neutro, fue poner un router asus de segunda garra comprado por 30 pavos en wallapop y descubrir las virtudes de linux openwrt, http://www.asuswrt-merlin.net, incluye openvpn entre otras muchas virtudes.. bueno no me lio que salgo del tema del blog.
Muchas gracias Marcos, por cierto te agregue en linkedin
Como tengo otro antispam instalado en la web, de momento voy a dejar sin captcha la zona de comentarios. Así ya no hay problemas en este sentido hasta que tenga un rato para mirarlo y dado que el antispam es potente no cuento con ningún desastre en este sentido. Vigilaré de todas formas.
A Antonio:
Ten en cuenta que si conectas la VPN desde tu propia red la petición sale a tu proveedor dando X saltos y tu proveedor la devuelve a tu casa que es donde está la VPN solicitada dando X saltos de nuevo. Entonces la VPN tunela y solicita lo que quieres ver al exterior dando Y saltos. Entonces la VPN recibe con Y saltos esa info que no te la da a ti, sino a tu proveedor que es quien se la solicitó. Y entonces el proveedor te la da a ti con Z saltos. Debe ser muy lento eso.
De nuevo múltiples problemas con el recaptcha.
Entre hoy y mañana reviso el captcha y os comento
Hola, yo también tenía el problema de que no me dejaba acceder a internet, así mientras empezaba una instalación desde cero, añadí la red entre Pihole y Wireguard y funciona.
Pero ahora no me pide clave para entrar desde la interfaz web.
El comando:
docker exec wg-easy printenv | grep PASSWORD
Me devuelve la clave que puse el archivo .env, pero de todas formas no la pide y cualquiera puede entrar.
Estoy bastante desconcertado…
¡Y muchísimas gracias por tu trabajo, es espectacular!
Me autocontesto:
Después de consultar la documentación de github aquí:
https://github.com/wg-easy/wg-easy/issues/1269
Podemos ver que en la última versión de Wg-easy, la variable PASSWORD ha cambiado a PASSWORD_HASH o algo así me ha parecido entender, porque yo para esto soy muy limitadito.
El caso es que si en el archivo docker-compose.yml definimos PASSWORD, se deshabilita la autentificación y entramos directamente sin clave ni «na».
Hay que cambiar la linea:
PASSWORD=$PASSWORD
por:
PASSWORD_HASH=$PASSWORD
El archivo .env no hay que tocarlo.
Y así recuperamos la autentificación.
Pues no, hablé demasiado pronto, haciendo esos cambios se rehabilita la autentificación, pero no he entendido bien el asunto, porque parece que va de encriptar el password, así que con los cambios que dije, no puedo entrar.
Dejo el tema aquí para los que saben…
Efectivamente. El docker de WG-Easy ahora requiere que la contraseña la pongamos encriptada (y me parece una excelente opción para aumentar la seguridad del sistema). Acabo de modificar el artículo indicando cómo hay que hacer para que funcione de nuevo de forma correcta.
Ibas por el buen camino. Hay que poner una variable distinta para la contraseña, pero hay que encriptarla. Así, alguien que acceda al archivo «.env» no podrá saberla aunque la vea, porque está encriptada.
Revisa el artículo de nuevo y a ver si lo que he puesto soluciona tu problema.
Tienes que disculpar, que hoy estuve muy a mil. Además de recordarte que ya tienes el artículo corregido con ese último cambio que han hecho los desarrolladores, te indico cómo proceder por si tienes el docker antiguo desplegado y quieres aplicar los cambios a esta nueva versión.
1) Generamos la contraseña para el interface web con el siguiente comando.
sudo docker run ghcr.io/wg-easy/wg-easy wgpw meacabodetirarunpedo
(recuerda sustituir lo de meacabodetirarunpedo por la contraseña deseada.
2) editamos el archivo docker-compose.yml y cambiamos la línea
– PASSWORD=$PASSWORD
por la línea
– PASSWORD_HASH=$PASSWORD_HASH
3) editamos el archivo .env y cambiamos la línea
PASSWORD=supercontraseñasecreta
por la línea
PASSWORD_HASH=’elhashqueobtuveenelpaso1entrecomillassimples’
(Acordaos de las comillas simples en este paso) .
4) ejecutamos esos dos comandos por orden
sudo docker-compose down
sudo docker-compose -p «wireguard» up -d
Con eso ya debería estar la instalación corregida.
Muchísimas gracias Marcos, la cosa me superaba un poco.
La verdad es que es un bug muy gordo en la verisión 14 de Wg-easy.
Tu estás tan tranquilo con tus actualizaciones automáticas, y como ya has definido todos tus usuarios de VPN, no tienes que entrar en la web para nada, así que no te enteras de que ya no pide contraseña, y… CUALQUIERA PUEDE TRASTEAR EN TU VPN
Yo, lo había arreglado de momento, forzando al instalación de la versión 13, pero ahora actualizaré con tus indicaciones.
Por cierto, he instalado los clientes de VPN sin problema en Android y un PC con Windows, pero no soy capaz de resolverlo en un PC con Linux Mint, se agradecería alguna aclaración.
De nuevo gracias.
A mi siguiendo tus instrucciones precisas me lo a solucionado gracias de nuevo si es verdad que está VPN a tenido sus cosas pero ahora queda funcionando y hemos aprendido lo que se puede hacer con Docker compost.
Buenas tardes!! Muchísimas gracias por el tutorial.
Yo tengo ya configurado PIHOLE y accedo perfectamente a la web para ver cómo va todo. Sin embargo, pongo la ip de mi raspeberry para acceder a WireGuard y me dice que nanai.
192.168.0.5:51821 pongo eso y no se me abre. Sabéis qué puedo estar haciendo mal?
Pongo un cacho del código de WireGuard donde se ve que ahí no he tocado nada 😀
volumes:
– ~/.wg-easy:/etc/wireguard
ports:
– «51820:51820/udp»
– «51821:51821/tcp»
restart: unless-stopped
Primero, quiero agradecer al autor de este post. Sin duda, aquí hay mucho trabajo y dedicación, y eso se nota.
Quisiera compartir mi experiencia, ya que, aunque he seguido varios de los tutoriales anteriores sin problema, este en particular se me complicó un poco debido a la falta de conocimientos más profundos. Si alguien tiene un problema similar, espero que este comentario le sea útil.
El problema:
Todo parecía funcionar bien, pero al activar el VPN en mi móvil a través de 4G (fuera de la red Wi-Fi), podía buscar en internet y ver los resultados. Sin embargo, al intentar entrar en una página web, no cargaba. Era como si el tráfico fuera demasiado lento y terminaba fallando, con este mensaje de error:
—
No se puede acceder a este sitio web. No se ha podido encontrar la dirección IP del servidor de http://www.deepl.com. DNS_PROBE_FINISHED_BAD_CONFIG
—
Solución temporal:
Al principio, probé modificar el archivo .env en la carpeta docker/WireGuard, cambiando el parámetro WG_DEFAULT_DNS a 1.1.1.1 (un servidor DNS público). De esta forma, todo comenzó a funcionar bien. Sin embargo, sabía que el problema no estaba completamente resuelto, ya que no estaba utilizando Pi-hole como DNS, que es lo que quería.
El verdadero problema:
Tras investigar más, descubrí que la red creada para que los contenedores interactuaran (pihole_wg_network) tenía este rango de IP:
«Subnet»: «172.19.0.0/16», «Gateway»: «172.19.0.1»
Pero, por alguna razón, el contenedor de Pi-hole tomaba una dirección IP fuera de este rango, como 172.20.0.1. Aunque podía hacer ping entre los contenedores, no estaban realmente en la misma red.
Solución definitiva:
1Bajar los contenedores
2Verificar la red: Para ver qué red estaba asignada a los contenedores:
sudo docker network inspect pihole_wg_network
3 Asignar una IP fija a Pi-hole: En el archivo docker-compose.yml de Pi-hole, añadí una IP fija dentro del rango correcto de la red. El archivo completo quedó así:
—–
services:
pihole:
networks:
# Asignamos el contenedor a la red ‘pihole_wg_network’ y le fijamos una IP específica
pihole_wg_network:
ipv4_address: 172.x.x.x # Aseguramos que la IP esté dentro de la subred correcta
container_name: pihole # Nombre del contenedor
image: pihole/pihole:latest
# Configuración de los puertos. Asegúrate de que estos no estén en uso por otros servicios
ports:
– «53:53/tcp»
– «53:53/udp»
– «67:67/udp»
– «8091:80/tcp» # Puerto de la interfaz web de Pi-hole
environment:
TZ: $TZ # Zona horaria, puedes configurarla en el archivo .env
WEBPASSWORD: $WEBPASSWORD # Contraseña para acceder a la interfaz web de Pi-hole
FTLCONF_LOCAL_IPV4: $DIRECCIONIP # Dirección IP local de Pi-hole (se define en el .env)
volumes:
# Mapeo de volúmenes para persistir los datos de configuración y logs
– $DOCKERDIR/pihole/etc-pihole:/etc/pihole # Configuración de Pi-hole
– $DOCKERDIR/pihole/etc-dnsmasq.d:/etc/dnsmasq.d # Configuración de DNS/DHCP
# Habilitamos la capacidad de administración de red para el contenedor
cap_add:
– NET_ADMIN
# Reiniciar el contenedor automáticamente si se detiene
restart: unless-stopped
networks:
# Definimos la red externa que usamos para los contenedores
pihole_wg_network:
external: true # La red ya está creada previamente con la subred 172.x.x.x/xx
—-
4 Reiniciar el contenedor
5 Modificar el archivo .env de WireGuard para que apunte a la IP fija de Pi-hole:
WG_DEFAULT_DNS=172.xx.x.x # IP fija de Pi-hole
6 Subir los contenedores de nuevo:
Verificaciones adicionales:
Si aún tienes problemas, puedes intentar lo siguiente:
7 Verificar que los contenedores estén en ejecución:
sudo docker ps
8 Comprobar que los contenedores estén dentro de la red correcta:
sudo docker network inspect nombre_de_la_red
9 Verificar que tu dominio dinámico esté funcionando:
ping tu_dominio.es
10Verificar que el puerto esté abierto usando nmap:
sudo apt update
sudo apt install nmap
sudo nmap -sU -p 51820 localhost
11 Verificar las políticas de iptables para asegurarte de que no estén bloqueando el tráfico:
sudo iptables -L
Si ves algo como:
Chain INPUT (policy DROP) o Chain FORWARD (policy DROP)
Cambia las políticas predeterminadas a ACCEPT temporalmente (solo para pruebas):
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
12Comprobar que el puerto está escuchando:
sudo netstat -tuln | grep 51820
13 Verificar la IP del contenedor de Pi-hole:
sudo docker inspect pihole | grep «IPAddress»
14Hacer ping entre los contenedores para verificar que se comunican correctamente:
sudo docker exec -it nombre_contenedor ping 172.xx.x.x
Recomendaciones finales:
Asegúrate de configurar correctamente el archivo .env con los datos verificados previamente.
Es una buena solución. La verdad es que nunca me he visto que Docker asignara rangos distintos cuando ambos contenedores están en la misma red, pero si por lo que sea te encuentras con el problema, la solución que has dado es perfectamente válida.
En primer lugar agradecer el enorme trabajo de Marcos.
Soy novato en todos estos temas pero al leer cada entrada, me lie la manta a la cabeza y decidí llevar a cabo lo explicado en toda esta serie.
He llegado hasta esta entrada y he conseguido configurarlo todo correctamente, como no podía ser de otra forma con unas indicaciones tan claras.
Pero claro, en cuanto quiero hacer algo que se sale de lo explicado ya no sé seguir o me da miedo de «cargarme algo» al hacer lo que no debo.
Por diversas razones quiero dejar de usar Pi-Hole, eliminar todo lo relacionado con él y que me siga funcionando Wireguard tal y como lo hace ahora, sin perder a mis clientes.
¿Podéis ayudarme?
Si lo que quieres es eliminar un docker por completo es muy muy sencillo. Se explica en la parte 4, en este tutorial:
https://www.flopy.es/piserver-con-docker-parte-4-gestion-de-imagenes-contenedores-volumenes-y-logs-de-docker/
Resumiendo: serían tres comandos
Sudo docker ps
Ese comando te dice los contenedores que tienes levantados. Tienes que fijarte en el id que docker le ha asignado al contenedor del pi-hole (voy a llamarlo id-del-contenedor). Cuando lo sepas, paras el pi-hole con este comando:
Sudo docker stop id-del-contenedor
Y luego eliminas el contenedor con este otro comando
Sudo docker rm id-del-contenedor
Por último, para dejar todo limpio,si quieres puedes borrar la carpeta que has creado para pi-hole junto a su contenido. El resto de contenedores seguirán corriendo estables y te habrás cargado sólo el del pi-hole.
Genial.
Gracias, Carlos, por responder tan rápido.
Me imagino que lo que tendré que cambiar también es el campo WG_DEFAULT_DNS y poner alguna DNS genérica como la 1.1.1.1 o la 8.8.8.8, ¿no?
¿Las líneas relacionadas con el Pi-Hole en el docker-compose.yml del Wireguard se pueden quedar tal y como están?
Sí. Con poner una del tipo 1.1.1.1 o 1.1.1.3 (esta última te bloquea páginas maliciosas y de contenido adulto) ya estaría. No tienes que cambiar nada más ni en el docker compose ni en ningún otro sitio.
Gracias, Marcos, y perdón por cambiarte el nombre, je je.
Actualizo: Todo OK.
Perdona el off topic, Marcos.
Estoy leyendo en otros sitios que se utiliza Portainer como «gestor» de docker.
¿Recomendarías su uso para gestionar todos estos docker que nos estás mostrando?
En mi humilde opinión, a los muy novatos como yo, parecería que es de gran ayuda.
Portainer es un arma de doble filo para principiantes. Por un lado mola mucho. Tienes una interfaz gráfica dónde tienes todo y puedes desplegar y gestionar tus contenedores. Está muy muy bien.
Pero por otro lado… está muy bien cuando sabes lo que haces. Si eres un usuario que está aprendiendo, hacer todo a través de portainer es contraproducente, porque no sabes lo que estás haciendo. Mucha gente pone el archivo de docker ahí, lo despliega y hala… a tirar millas, pero ¿Dónde están los volúmenes? ¿cómo se configura todo?
El objetivo de estos artículos no es tanto tener el software desplegado en nuestros ordenadores (qué también, que mola mucho tener todas estas cosas para nosotros), sinó que cuando hayáis terminado los tutoriales podáis entrar en la selva por vuestra cuenta y que cuando veáis un docker interesante podáis gestionarlo correctamente y no sea todo un simple copiar y pegar.
Me recuerda lo que me dices un poco a cuando metimos telefonía por internet en nuestra empresa. Hace muchos años teníamos una centralita Panasonic con líneas analógicas. Cuando decidimos cambiar a telefonía a través de internet (Voz IP) nuestro proveedor nos montó una centralita virtualizada en nuestros equipos, pero en lugar de poner un Elastix (Que tiene un interfaz gráfico para controlarlo todo) nos pusieron un asterisk configurado en linux sin ningún tipo de interfaz gráfico. A mi me chocó eso y les pregunté por qué era así, y efectivamente me decían que al fin y al cabo Elastix era un interfaz gráfico para Asterisk (Algo así como portainer y docker compose). Pero Asterisk era tremendamente potente y había montones de configuraciones que las controlabas mejor desde el interfaz de comandos o directamente no se podían hacer en el interfaz de Elastix. Lo de portainer para mi es algo muy similar. Primero hay que aprender a desplegar en modo texto. Si luego quieres poner un interfaz, pues perfecto, pero lo correcto es aprender primero cómo funcionan las tripas antes de montar un interfaz chulo.
¿Mi recomendación? Si te gusta todo esto, por supuesto, prueba portainer. Está muy bien. Pero es importante saber desplegar todo sin depender de Portainer.
Pues te haré caso y, de momento, seguiré los pasos tal y como nos los muestras, porque creo que llevas razón: con el cortar y pegar no se analiza tanto lo que vas haciendo y terminas por no entender el funcionamiento.
A por el Vaultwarden…
Buenos dias, gracias por lso tutoriales, a veces el vpn deja de funcionar
y cuando ejecuto este comando sudo docker inspect pihole | grep «IPAddress»
me doy cuenta que el ultimo digito me lo varia entre el 2 y el 3 entonces eso hace que deje de funcionar el vpn se puede dejar fija esa ip
Efectivamente. A mi también me pasa. Parece que la ip de la red pihole cambia entre arranques con lo que te desbarata la configuración de wg-easy y da error de DNS. Todo funciona bien hasta que re-arrancas el contenedor de pihole (con actualizar.sh, por ejemplo).
Este VPN falla siempre funciona bien unos días y adiós ya no funciona estoy intentando instalar otro o el mismo pero distinto al wg-easy