• 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


Mensajes en este tema
VPN WireGuard en docker v1.12 - por Ganekogorta - 03-05-2021, 07:13 PM
RE: VPN WireGuard en docker - por yeraycito - 16-05-2021, 05:08 PM
RE: VPN WireGuard en docker - por yeraycito - 18-05-2021, 05:52 PM
RE: VPN WireGuard en docker - por Jedha - 16-06-2021, 11:31 AM
VPN WireGuard en docker - por Ganekogorta - 16-06-2021, 02:08 PM
RE: VPN WireGuard en docker - por Jedha - 16-06-2021, 11:12 PM
VPN WireGuard en docker - por Ganekogorta - 17-06-2021, 07:47 AM
RE: VPN WireGuard en docker - por Jedha - 17-06-2021, 12:12 PM
VPN WireGuard en docker - por Ganekogorta - 17-06-2021, 12:27 PM
VPN WireGuard en docker - por Ganekogorta - 19-06-2021, 09:19 PM
RE: VPN WireGuard en docker - por Jedha - 20-06-2021, 10:38 AM
VPN WireGuard en docker - por Ganekogorta - 20-06-2021, 11:11 AM
RE: VPN WireGuard en docker - por Jedha - 20-06-2021, 11:36 AM
VPN WireGuard en docker - por Ganekogorta - 20-06-2021, 11:48 AM
RE: VPN WireGuard en docker - por Jedha - 20-06-2021, 03:06 PM
RE: VPN WireGuard en docker - por merlin64 - 10-07-2021, 07:34 PM
RE: VPN WireGuard en docker - por korrupto - 14-08-2021, 06:40 PM
VPN WireGuard en docker - por Ganekogorta - 14-08-2021, 11:50 PM
RE: VPN WireGuard en docker - por korrupto - 15-08-2021, 12:44 AM
RE: VPN WireGuard en docker v1.12 - por koldo - 16-10-2021, 09:19 PM
RE: VPN WireGuard en docker v1.12 - por koldo - 17-10-2021, 12:22 PM
RE: VPN WireGuard en docker v1.12 - por Ganekogorta - 17-10-2021, 05:06 PM



Usuarios navegando en este tema: 1 invitado(s)