VPN WireGuard en docker v1.12 - Versión para impresión +- Foro QNAP en español (https://www.qnapclub.es) +-- Foro: GENERAL (https://www.qnapclub.es/forumdisplay.php?fid=3) +--- Foro: Firmware, Aplicaciones y Tutoriales (https://www.qnapclub.es/forumdisplay.php?fid=39) +---- Foro: VMs & Docker Containers (https://www.qnapclub.es/forumdisplay.php?fid=41) +---- Tema: VPN WireGuard en docker v1.12 (/showthread.php?tid=4068) |
VPN WireGuard en docker v1.12 - Ganekogorta - 03-05-2021 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:
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 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 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 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 Ahora con esta clave generamos la pública con el comando Código: echo -n "cliente clave publica: ";echo mF55NfksOINtgpsmT9tng1TWh/6YL1En1mhE7LiqZks=|wg pubkey 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 El contenido del archivo será el siguiente: Código: [Interface] En ese mismo directorio crearemos el archivo de configuración del cliente. Le daremos el nombre "clientewg_1.conf" Código: cd /etc/wireguard El contenido sería el siguiente: Código: [Interface] 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 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] 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 , 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.
Código: id nombre_usuario_nas 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 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 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] De nuevo crearemos un fichero equivalente que será el del equipo cliente con un contenido como Código: ## client configuration (client1.conf) 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 RE: VPN WireGuard en docker - yeraycito - 16-05-2021 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. RE: VPN WireGuard en docker - yeraycito - 18-05-2021 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. RE: VPN WireGuard en docker - Jedha - 16-06-2021 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 VPN WireGuard en docker - Ganekogorta - 16-06-2021 Hola Gracias por comentar que te funciona [emoji106]. En cuanto a que no accedes a otros contenedores ¿están en la misma red? RE: VPN WireGuard en docker - Jedha - 16-06-2021 (16-06-2021, 02:08 PM)Ganekogorta escribió: HolaHola 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 VPN WireGuard en docker - Ganekogorta - 17-06-2021 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. RE: VPN WireGuard en docker - Jedha - 17-06-2021 (17-06-2021, 07:47 AM)Ganekogorta escribió: Hola 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 VPN WireGuard en docker - Ganekogorta - 17-06-2021 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. VPN WireGuard en docker - Ganekogorta - 19-06-2021 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. |