• 1 voto(s) - 5 Media
  • 1
  • 2
  • 3
  • 4
  • 5
VPN WireGuard en docker v1.12
#1
Hola

Voy a describir como instalar un contenedor de WireGuard server VPN en nuestra NAS.

Tras el descalabro que ha provocado a muchos el ransomware Qlocker, se ha visto la importancia de tener copias de seguridad de datos y de tener los accesos securizados desde el exterior a nuestra NAS con una VPN.

Nuestra NAS integra de fábrica en QTS varios de ellos:
  • QBelt, con tecnología propietaria de Qnap, en la que dependes de sus actualizaciones poco frecuentes y sus programas clientes.
  • PPTP cuyo uso totalmente no se recomienda por ser vulnerable.
  • L2TP que también tiene alguna vulnerabilidad y es mejor evitar su uso.
  • OpenVPN, con una comunidad detrás, con soporte comercial y documentación para diversos sistemas operativos y máquinas.
Pero recientemente ha aparecido WireGuard, otro sistema de VPN que es estable, robusto, mas rápido y ligero que OpenVPN.

Recordad que al activar una VPN, estamos agregando una capa de seguridad que implica un cifrado de datos. Y al hacerlo perdemos rendimiento en esa comunicación por ese trabajo extra de cifrado y por el tráfico agregado de datos extra de ese cifrado.


Esta vez la creación de contenedor lo haremos usando Container Station en vez de la consola.

Los pasos básicos son:
  1. -instalación de wireguard
  2. -creación de certificados del servidor
  3. -creación de certificados del cliente
  4. -creación de los archivos de configuración del servidor y del cliente en función de esos certificados

1-instalación de wireguard

Abrimos Container Station y creamos un nuevo contenedor
   

Luego escribimos las líneas que definen el contenedor
   

Según el punto 1 de la imagen, damos un nombre al contenedor 

Definimos una ruta persistente donde quedan las configuraciones, ver punto 2 de la imagen. En este caso dentro de la carpeta compartida "DockerData" y en sus interior creamos "wireguard".

Antes de crearlo podemos validar la definición a nivel sintáctico pulsando el botón "Validate YAML". Es el punto 3 de la imagen.

Y para crearlo pulsaremos el botón "Create". Es el punto 4 de la imagen.

En la línea 17 definimos el puerto por el que será accesible WireGuard. He puesto el 55555. Es decir el servidor de VPN será accesible por la dirección ip de nuestra NAS por ese puerto. Y es este puerto el que deberemos abrir en nuestro enrutador.
Si por ejemplo nuestra NAS tiene por ip  172.16.1.2, en el enrutador deberemos abrir el puerto 55555 UDP hacia la 172.16.1.2:55555.

Una vez creado y ya funcionando, podremos ver algo similar a la pantalla siguiente
   

   
Si desplegamos la línea veremos el Docker en sí. Y desde ahí podemos acceder a su línea de comandos. 
Esta consola (exclusiva de ese Docker, no de la NAS) es la que vamos a usar para ejecutar las siguientes acciones.


2-creación de certificados del servidor

Abrimos la consola del contenedor y en la ventana escribimos "/bin/bash" (lo que nos sugiere)

   

En una pestaña nueva del navegador se nos abrirá una ventana de consola para escribir comandos.

Escribimos los siguientes comandos:
Código:
echo -n "servidor clave privada: ";wg genkey
Nos mostrará la clave privada del servidor
   

Con esa clave, generamos la pública en función de la anterior con el comando:
Código:
echo -n "servidor clave publica: ";echo SKsU7W7Cp8pb+EtzvswxyyG3KbrTlrwpL1T2EfJEiEg=|wg pubkey
Nos mostrará la clave pública del servidor
   

Resumiendo, nuestras claves de servidor son:
-privada SKsU7W7Cp8pb+EtzvswxyyG3KbrTlrwpL1T2EfJEiEg=
-Pública XTavofWIh2fPiiCY2t8fK9Vay2f2OWGWikbr9OpPqhg=


3-creación de certificados del cliente

Desde la misma consola anterior generamos los certificados de cliente.
De forma análoga al los del servidor, escribimos en consola:
Código:
echo -n "cliente clave privada: ";wg genkey
Nos genera y muestra en pantalla la clave privada
   

Ahora con esta clave generamos la pública con el comando

Código:
echo -n "cliente clave publica: ";echo mF55NfksOINtgpsmT9tng1TWh/6YL1En1mhE7LiqZks=|wg pubkey
Y nos genera la clave publica
   

Resumiendo, nuestras claves del cliente son:
-privada mF55NfksOINtgpsmT9tng1TWh/6YL1En1mhE7LiqZks=
-pública UiLcRqHsOXOfRTwjj2gKYRjgfVlQSCwugBsaxrzYf24=


4-creación de los archivos de configuración del servidor y del cliente en función de las claves anteriores

Una vez tengamos generadas las claves, vamos a crear los archivos de configuración del servidor.

El archivo de configuración del servidor, de nombre "wg0.conf" lo crearemos en el directorio /share/dockerData/wireguard desde nuestro equipo accediendo a la carpeta compartida o por consola con los comandos del contenedor. Es importante el tema de los permisos del archivo
Código:
cd /etc/wireguard
sh -c 'umask 077; touch wg0.conf'
vi wg0.conf

El contenido del archivo será el siguiente:
Código:
[Interface]
Address = 10.19.18.1/24
ListenPort = 51820
##privada del servidor
PrivateKey = SKsU7W7Cp8pb+EtzvswxyyG3KbrTlrwpL1T2EfJEiEg=
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
##cliente publica
PublicKey = UiLcRqHsOXOfRTwjj2gKYRjgfVlQSCwugBsaxrzYf24=
AllowedIPs = 10.19.18.2/32

En ese mismo directorio crearemos el archivo de configuración del cliente.
Le daremos el nombre "clientewg_1.conf"
Código:
cd /etc/wireguard
sh -c 'umask 077; touch clientewg_1.conf'
vi clientewg_1.conf

El contenido sería el siguiente:
Código:
[Interface]
Address = 10.19.18.2/24
## privada de cliente
PrivateKey = mF55NfksOINtgpsmT9tng1TWh/6YL1En1mhE7LiqZks=
DNS = 1.1.1.1 # o un dns interno de nuestra red
[Peer]
AllowedIPs = 0.0.0.0/0
##publica de servidor
PublicKey = XTavofWIh2fPiiCY2t8fK9Vay2f2OWGWikbr9OpPqhg=
Endpoint = direccin_ip_publica_router:55555

Con todos los cambios y configuraciones ya realizadas:
-reiniciamos el contenedor
-abrimos en el enrutador el puerto 55555 para que apunte hacia la ip de la NAS puerto 55555 (ella ya hace la conversión al 51820 del contenedor)
-instalamos el programa cliente en nuestro equipo e instalamos la configuración con el archivo ubicado en la NAS en "/share/DockerData/wireguard/clientewg_1.conf"

Y si todo ha ido bien, ya podremos conectarnos a nuestra NAS y a la red donde está ubicada.

Si queremos mas clientes debemos generar mas claves con los mismos comandos

Código:
echo -n "cliente2 clave privada : ";wg genkey
echo -n "cliente2 clave publica: ";echo clave_privada_del_cliente|wg pubkey

Creamos un nuevo archivo de configuración para ese cliente y en el archivo de configuración del servidor hemos de agregar  en el archivo wg0.conf las siguientes líneas  indicando la ip y su clave pública:
Código:
[Peer]
##cliente2 publica
PublicKey = clave_pública_del_cliente2
AllowedIPs = 10.19.18.3/32

Y hay que reiniciar el contenedor para se apliquen los cambios.


Por fin he dado como crear el contenedor por línea de consola, pero no sirve para la versión de linux de QNAP  Angry , si para otros Linux.

Aquí va el comando si ya tenemos una red llamada "Dockers"
Código:
docker run --name wireguard --network=Dockers --cap-add=NET_ADMIN --cap-add=SYS_MODULE -e PUID=0 -e PGID=0 -e TZ=Europe/Madrid -e SERVERURL=direccion_nuestro_DDNS.noip.com -e SERVERPORT=51820 -e PEERS=1 -e PEERDNS=ip_nuestro_servidor_dns -e INTERNAL_SUBNET=10.11.12.0 -p ip_de_nuestra_nas:51820:51820/udp -v /share/DockerData/wireguard/appdata/config:/config  -v /lib/modules:/lib/modules --sysctl="net.ipv4.conf.all.src_valid_mark=1" --restart unless-stopped ghcr.io/linuxserver/wireguard

Bueno el comando detecta el tipo de arquitectura de nuestra máquina, pero podemos seleccionar la nuestra modificando el parámetro final.
  • ghcr.io/linuxserver/wireguard:amd64-latest para equipos x86-64
  • ghcr.io/linuxserver/wireguard:arm64v8-latest para equipos ARM de 64 bits
  • ghcr.io/linuxserver/wireguard:arm32v7-latest para equipos ARM de 32 bits
Los valores de -e PUID=0 -e PGID=0 se obtienen en función del usuario y para conocer los de un usuario escribimos por consola
Código:
id nombre_usuario_nas
En mi caso son los del usuario admin.

NOTA: estoy haciendo pruebas con el docker de https://github.com/masipcat/wireguard-go-docker/ que promete mas para funcionar en QNAP

en cuanto de con ello lo comento en este mismo mensaje.

Bueno ya he conseguido hacer que funcione el contenedor en la nas (con cpu AMD x86-64 y ARM Anapurna AL-314, pero no en AL-214), el comando que he usado es:
Código:
docker run --name wireguard --network=Dockers --cap-add=NET_ADMIN --sysctl="net.ipv4.ip_forward=1"  -v /share/DockerData/wireguard:/etc/wireguard -v /dev/net/tun:/dev/net/tun -e WG_COLOR_MODE=always -e LOG_LEVEL=info -p ip_de_la_nas:51820:51820/udp --privileged --restart unless-stopped masipcat/wireguard-go:latest
Si no tenéis definida una red podéis omitir el parámetro --network=Dockers
Debéis poner una ruta compartida de vuestra nas , en el caso del ejemplo uso "/share/DockerData/wireguard". Donde DockerData es una carpeta compartida que definimos en QTS.

Para la creación de las claves privadas y públicas podemos usar el método que describí antes, pero he visto otro con resultados iguales. Para hacerlo desde la consola ejecutamos la siguiente orden para obtener una privada
Código:
#para obtener la privada del servidor
docker run --rm -i masipcat/wireguard-go wg genkey > serverprivatekey.txt
#para obtener la publica del servidor
docker run --rm -i masipcat/wireguard-go wg pubkey < serverprivatekey.txt > serverpublickey.txt

#para obtener la privada de un cliente1
docker run --rm -i masipcat/wireguard-go wg genkey > cliente1privatekey.txt
#para obtener la publica de un cliente1
docker run --rm -i masipcat/wireguard-go wg pubkey < cliente1privatekey.txt > cliente1publickey.txt
Con ello obtenemos una pareja de archivos txt para cliente y para servidor.
Luego sólo hemos de crear los archivos wg0.conf con la configuración que queda en el servidor, en el directorio /share/DockerData/wireguard
El contenido será algo similar a
Código:
[Interface]
# Assign you an IP (that's not in use) and add it to server configmap
Address = 10.9.8.1/24
ListenPort = 51820
PrivateKey = texto_de_la_clave_privada_del_servidor
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = [color=#333333][size=small][font=Monaco, Consolas, Courier, monospace]texto_de_la_clave_pública del cliente[/font][/size][/color]
AllowedIPs = 10.9.8.2/32

De nuevo crearemos un fichero equivalente que será el del equipo cliente con un contenido como
Código:
## client configuration (client1.conf)
[Interface]
Address = 10.9.8.2/24
PrivateKey = texto_de_la_clave_privada_del_cliente
DNS = 1.1.1.1
[Peer]
PublicKey = texto_de_la_clave_pública del servidor
Endpoint = direccion_FQDN_de_la_NAS:51820
AllowedIPs = 10.9.8.0/24
AllowedIPs = 0.0.0.0/0
##publica de servidor
#PersistentKeepalive = 25

Recordad que hay que reiniciar el docker para que se apliquen los cambios. Se puede hacer con las siguientes instrucciones:
Código:
docker stop wireguard
docker start wireguard

# o bien un restart
docker restart wireguard
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#2
Como tengo la suerte de tener un router con el firewall Opnsense que incluye también el detector de intrusiones Suricata y al que he añadido Adguard para el control de los dns le instalé hace ya algún tiempo Wireguard. Como soy un amante de los " cacharreos informáticos " y aunque no tengo demasiados conocimientos quería beneficiarme del firewall Opnsense y todo lo que incluye en mi móvil utilizando la aplicación wireguard para, en mi caso, Android. Para hacerlo mantengo en mi móvil la aplicación wireguard activa y conectada las 24 horas del dia conectada a mi router Opnsense. Ya se que esto no es el uso habitual y las vpn se utilizan ocasionalmente y normalmente para breves períodos de tiempo. Sea cual sea el uso que se le de me he encontrado con un problema que me ha calentado la cabeza durante unas cuantas semanas hasta que he dado con la tecla probando y probando distintas configuraciones. El problema era el siguiente:

Wireguard funciona de maravilla, no se desconecta en ningún momento al contrario que Openvpn que sufre constantes desconexiones y reconexiones. La seguridad y rendimiento de wireguard son muy superiores a las de Openvpn. Acabo de comentar que wireguard no se desconecta en ningún momento pero esto no es reálmente así. El protocolo wireguard funciona de distinta manera al de Openvpn. Wireguard está activo mientras se envían o reciben datos. Si no ocurre eso wireguard se " pone en pausa ". Si lo utilizais, por ejemplo, como cliente en un móvil y ese móvil lo desbloqueais para hacer cualquier cosa con el cada poco tiempo NO es problema. El problema está cuando ese móvil está encendido pero sin desbloquear durante un largo período de tiempo ( alguna hora o más ). Esto me ocurre a mi frecuéntemente y lo que ocurre, entre otras cosas, es que los mensajes entrantes de programas de mensajería instantánea ( en mi caso Signal ) llegan con un considerable retraso tanto cómo que algunos me han llegado hasta con dos horas de retraso. Ya adelanto que esto que ocurre no tiene nada que ver con la gestión de energía del móvil Android o IOS. Ocurre de igual manera desactivando cualquier ahorro de energía que podamos tener en el móvil y sobretodo con wireguard.

Después de explicar todo el rollo voy a explicar la solución que he encontrado y que funciona perfecta. En la aplicación wireguard para el móvil hay un apartado vacío en la configuración del cliente llamado mantenimiento persistente. En la documentación oficial de wireguard recomiendan poner ese ajuste en 25 segundos. En mis pruebas con ese ajuste el problema citado antes persistía. Lo he solucionado poniendo ese ajuste en 1 segundo.

Este ajuste hay que realizarlo también en el apartado correspondiente en el servidor wireguard.

Haciendo esto reálmente no se envía un paquete keepalive cada segundo si no que tarda algo más de tiempo pero haciéndolo así se mantiene activa la conexión wireguard. El problema que he citado se refería a la recepción de mensajes de Signal pero ocurre con cualquier otra aplicación que tengamos en nuestro móvil tanto para el envío de datos cómo en la recepción. Como digo, esto ocurre cuando el móvil está sin desbloquear durante algún tiempo, la conexión wireguard " se pausa " y aunque el móvil quiera enviar o recibir datos si lleva bastante tiempo sin desbloquearse no los envía o recibe hasta que se desbloquea, o los recibe pasados mucho tiempo.

El mandar y recibir paquetes keepalive cada segundo no aumenta para nada el consumo de datos del móvil ( comprobado ). Eso sí, aumenta ligéramente el consumo de batería.
  Responder
#3
Despues de unos dias de prueba con el descubrimiento lo de que aumenta ligéramente la batería tengo que reconocer que me he quedado corto. No se producen errores en las transmisiones de datos pero si aumenta bastante la batería en el cliente móvil. Así que os indico los nuevos ajustes que resuelven ese problema:

En mi caso he puesto en el servidor wireguard un mantenimiento persistente con un valor de 5 segundos.
En el cliente móvil wireguard he dejado ese ajuste en blanco ( por defecto )

En el caso de que resulte complicado poner ese ajuste en el servidor wireguard propongo ponerlo en el smartphone.

A tener en cuenta: Cualquier valor superior a 5 segundos da error de transmisión de datos. Esto lo afirmo porque al tener el servidor wireguard en Opnsense puedo ver todos los datos de conexión producidos por wireguard tanto salientes como entrantes. Y si no se hacen los ajustes indicados antes se producen errores en la conexión wireguard tanto si esta se mantiene activa permanéntemente cómo si se realiza ocasionálmente. Por lo que me he informado todo esto ocurre al estar wireguard en un entorno NAT o que exista un firewall y es relativo a la persistencia de las tablas NAT. No me pregunteis por esto que no tengo ni idea a que se refiere.
  Responder
#4
Hola, muchas gracias por el tutorial. acabo de probarlo y funciona muy bien, solo hubo un problema en la instalación, tuve que cambiar en el archivo "clientewg_1.conf"
la linea AllowedIPs = 0.0.0.0/0, la tuve que poner en [Peer] por que si la dejaba en [Interface] no me aceptaba el archivo como valido el cliente de iPad/iPhone/Mac, y después en el funcionamiento en comparación con openvpn que es el que utilizo habitualmente, funciona muy fluido, solo tengo dos problemas no tengo acceso desde WireGuard a Nginx proxy manager y Portainer que también tengo instalados en docker, Home Assistant al contrario lo tengo instalado en docker si tengo acceso desde WireGuard, excelente trabajo el tutorial, muchas gracias por compartirlo, un saludo
  Responder
#5
Hola
Gracias por comentar que te funciona [emoji106].

En cuanto a que no accedes a otros contenedores ¿están en la misma red?
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#6
(16-06-2021, 02:08 PM)Ganekogorta escribió: Hola
Gracias por comentar que te funciona [emoji106].

En cuanto a que no accedes a otros contenedores ¿están en la misma red?
Hola buenas, todos están en la 192.168.2.XX, en 192.168.2.10 que es la ip del Qnap, estan tanto portainer como nginx, home Assistant tiene otra ip que hice el tuto del foro y está en la 192.168.2.98 y pihole en 192.168.2.97 a estos dos últimos accedo sin problema con WireGuard, un saludo
  Responder
#7
Hola

No me queda claro, pero si no accedes a ninguno de los contenedores de la nas (usando sus puertos correspondientes mediante la ip de la nas), pero si accedes a otras ip de tu red, el problema estará en la visión entre dockers.

Acabo de comprobarlo y a mi me ocurre igual. A ver si puedo este fin de semana y miro las redes de los docker. Se seguro que wireguard lo tengo en un rango distinto al resto de los docker que si comparten rango.
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#8
(17-06-2021, 07:47 AM)Ganekogorta escribió: Hola

No me queda claro, pero si no accedes a ninguno de los contenedores de la nas (usando sus puertos correspondientes mediante la ip de la nas), pero si accedes a otras ip de tu red, el problema estará en la visión entre dockers.

Acabo de comprobarlo y a mi me ocurre igual. A ver si puedo este fin de semana y miro las redes de los docker. Se seguro que wireguard lo tengo en un rango distinto al resto de los docker que si comparten rango.

Hola Buenos dias, exacto eso pasa, los contenedores que tienen su propia ip si hay acceso, acabo de instalar un contenedor de Jelyfin con acceso en la ip del nas en el puerto 8096 para probar y pasa lo mismo sin acceso con wireguard, un saludo
  Responder
#9
Hola
Probaré el fin de semana.
Justo a mi me interesaba NO acceder a los otros docker y por ello lo puse en otra red.

De hecho creo que es el único docker que lo tengo en otra red distinta. Todos los demás comparten redes.

Hay veces que interesa hacerlo. Por ejemplo tener un docker de cara al público y otros docker en otra red por si hubiese alguna intrusión desde el docker público.
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder
#10
Hola

He hecho la prueba de poner ese container en la misma red que otros y si me contestan a los pings desde el móvil.

Es decir veo a la red donde está la nas y también a los contenedores del rango de red de wireguard.
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Responder




Usuarios navegando en este tema: 1 invitado(s)