WireGuard VPN: Instalación y configuración de la mejor VPN del momento

WireGuard VPN: Instalación y configuración de la mejor VPN del momento

Sergio De Luz

WireGuard VPN es una aplicación software completamente gratuita que nos permitirá establecer túneles VPN. Este completo software incorpora todos los protocolos de comunicación y criptografía necesarios, para levantar una red privada virtual entre varios clientes y un servidor. WireGuard proporciona mejor rendimiento que el protocolo IPsec y que OpenVPN (tanto en velocidad como en latencia de las conexiones), hoy en RedesZone os vamos a explicar sus principales características, cómo instalarlo y configurarlo fácilmente.

Características de WireGuard VPN

WireGuard VPN es un software para crear una red privada virtual (VPN) extremadamente sencilla de configurar, muy rápida (más rápida que IPsec y OpenVPN) y que utiliza la criptografía más moderna por defecto, sin necesidad de seleccionar entre diferentes algoritmos de cifrado simétrico, asimétrico y de hashing. El objetivo de WireGuard VPN es convertirse en un estándar, y que más usuarios domésticos y empresas comiencen a utilizarlo, en lugar de usar IPsec o el popular OpenVPN que son más difíciles de configurar y más lentos. Este software está diseñado para ser utilizado por todos los públicos, tanto para usuarios domésticos como en súper ordenadores.

Con WireGuard VPN no es necesario administrar las conexiones, preocuparse por el estado de la propia red privada virtual, administrar procesos ni saber qué hay debajo del software para hacerlo funcionar, tal y como ocurre con IPsec, donde muchas veces es necesario mirar logs e investigar qué está ocurriendo. Otro de los puntos fuertes es que la configuración es extremadamente básica, pero muy potente.

Este software es una VPN L3, es decir, utiliza tunneling únicamente, no ocurre como OpenVPN donde tenemos la posibilidad de trabajar en modo transporte o modo túnel. En este caso utilizaremos siempre modo túnel, además, es compatible tanto con redes IPv4 como redes IPv6, además, puede encapsular paquetes IPv4 en IPv6 y viceversa. El protocolo de capa transporte utilizado por WireGuard es UDP, por lo que tendremos que abrir un puerto determinado (a elegir, se puede cambiar) en nuestro router que hace NAT.

Compatibilidad con sistemas operativos

Este nuevo software de VPN primero fue lanzado para el Kernel de Linux, pero es multiplataforma, ya que es compatible con sistemas operativos Windows, Linux, MacOS, FreeBSD, Android y también iOS. Uno de los puntos fuertes de este software es que la configuración del cliente y servidor es exactamente igual en los diferentes sistemas operativos, utilizando la misma sintaxis, por lo que podrás configurar el servidor y clientes en Linux, y posteriormente «pasar» la configuración al resto de dispositivos con otros sistemas operativos en su interior.

Criptografía utilizada

Con los protocolos IPsec y OpenVPN, es necesario que tanto los clientes como el servidor «acuerden» los protocolos criptográficos a utilizar, tanto en la fase 1 y fase 2 (de IPsec), como en el canal de control y datos (de OpenVPN), de lo contrario, no se establecerá la conexión correctamente. WireGuard proporciona un «paquete» criptográfico entero, garantizando la conectividad sin necesidad de seleccionar nosotros nada. Si en un determinado momento uno de los protocolos criptográficos utilizados por esta VPN se considera inseguro, es tan fácil como lanzar una segunda versión de WireGuard con un nuevo protocolo que no tenga un fallo de seguridad, y entre los clientes y el servidor se indicarán que usen la «versión 2», siendo completamente transparente a nosotros.

Otro detalle muy importante, es que esta VPN utiliza un código fuente muy pequeño. Hay muy pocas líneas de código en comparación con StrongSwan o OpenVPN, por lo que se podrían realizar auditorías en muy poco tiempo, también será más fácil encontrar posibles vulnerabilidades o fallos de seguridad. Al tener menos líneas de código, la superficie de un posible ataque a la programación de la VPN también es menor.

Actualmente WireGuard VPN utiliza ChaCha20 para el cifrado simétrico, autenticado con Poly1305, utilizando una construcción AEAD. También utiliza Curve25519 para ECDH, BLAKE2 para el hashing, SipHash24 para las claves hashtable, y HKDF para la derivación de claves, lo que significa que estamos utilizando los algoritmos criptográficos más modernos, con el objetivo de proporcionar la máxima seguridad y rendimiento.

Compatibilidad con roaming y Kill-Switch

Este software está diseñado para poder realizar roaming de manera fácil y rápida, si nuestro dispositivo cambia de redes, y lógicamente cambia de IP pública, como por ejemplo cuando pasamos de la red Wi-Fi y la red 4G/LTE de nuestro operador, la conexión VPN seguirá levantada porque se volverán a autenticar rápidamente con el servidor VPN, de tal forma que siempre estaremos conectados a la VPN.

También podremos habilitar el Kill-Switch en el dispositivo, de esta forma, si la conexión VPN se interrumpe, el propio software también se encargará de interrumpir todo el tráfico de red hasta que se vuelva a reestablecer la conexión VPN, con el objetivo de que no naveguemos sin la protección que nos brinda esta VPN.

Instalación de WireGuard VPN

La instalación de este software es realmente fácil, simplemente tenemos que ir a la web oficial de WireGuard, y descargarnos el ejecutable para sistemas operativos Windows o MacOS. Si utilizas un sistema operativo basado en Linux con sus correspondientes repositorios, es probable que tengas que añadir los repositorios específicos de WireGuard, ya que actualmente por defecto no se encuentra en la rama «stable».

Por ejemplo, nosotros hemos instalado el servidor VPN en un Debian última versión, para poder instalarlo hemos seguido los pasos que nos indica en la web oficial. Es necesario permisos de superusuario para poder realizar correctamente la instalación.

sudo echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
sudo printf 'Package: *nPin: release a=unstablenPin-Priority: 90n' > /etc/apt/preferences.d/limit-unstable
sudo apt update
sudo apt install wireguard

No debemos olvidar que esta VPN también es compatible con sistemas operativos como FreeBSD, OpenBSD e incluso también con OpenWRT para los routers, ya que simplemente basta con instalarlo a través de «opkg» como se instala habitualmente todo el software adicional.

Si vas a instalar el cliente VPN en tu smartphone con Android o iOS, actualmente ya disponemos de las aplicaciones oficiales, por lo que podrás instalarlo sin problemas desde Google Play y App Store respectivamente:

WireGuard
WireGuard
Price: Free
WireGuard
WireGuard
Price: Free

Configuración de WireGuard: claves públicas, privadas y archivos de configuración

Una vez que hemos instalado correctamente WireGuard, tanto en el equipo que actúe como servidor, así como en todos los clientes que queramos conectar, es necesario configurarlo. Lo primero que debemos hacer es crear la pareja de claves pública-privada, tanto en el servidor como en todos los clientes que nosotros deseemos conectar. Nosotros hemos utilizado un sistema operativo Debian para la generación de las claves, y también para configurar el servidor, no obstante, también podríamos hacerlo directamente en el software para Windows.

La ruta para ejecutar el servidor WireGuard en Debian, es /etc/wireguard/, por lo que nos vamos a ir a esta ruta con el siguiente comando:

cd /etc/wireguard/

Generación pareja de clave pública-privada para el servidor

Para generar la pareja de claves pública y privada justamente en esta ubicación, simplemente tenemos que poner:

wg genkey | tee claveprivadaservidor | wg pubkey > clavepublicaservidor

Ahora tendremos dos archivos, uno con la clave pública y otra con la privada:

  • Clave privada: 6JcquylvtJsHNCdWrYMj28XsLIFJUVjlr2y5o27rO2c=
  • Clave pública: xeTkJjjBUyp8paxTgajwDa+qWjrD2RpXlJRSHMwcGDQ=

Estas claves son las que usaremos para el «servidor» WireGuard VPN.

Generación pareja de clave pública-privada para un cliente

Para generar otra pareja de claves pública y privada, que usaremos en un cliente, podemos crearlas en una carpeta nueva, o crearlas en la misma ubicación, pero con otro nombre.

wg genkey | tee claveprivadacliente1 | wg pubkey > clavepublicacliente1

Ahora tendremos dos archivos, uno con la clave pública y otra con la privada:

  • Clave privada: yPMpP2raY4FoCEJkmzQMlxzm/6RBIW9HkjY6pVFIOnI=
  • Clave pública: 6c12jLkKzgU9len1kQ/6Fc61xm+LL98TPPlLsri8klE=

Estas claves son las que usaremos para un cliente WireGuard VPN.

Archivo de configuración para el servidor

La configuración del servidor WireGuard es bastante sencilla en comparación con los servidores IPsec o OpenVPN, sin embargo, debemos tener en cuenta varias cosas que os explicamos a continuación.

En el servidor tendremos que tener una sección de «Interface«, en esta sección podremos indicar la dirección IP privada que identifica al servidor cuando los clientes se conecten. Debemos recordar que esta VPN es L3, por lo que podremos poner cualquier dirección IP privada que no esté en uso en un determinado momento. Por ejemplo, en OpenVPN la subred por defecto es 10.8.0.0/24, aquí también podremos poner esa misma o cualquier otra como la subred 192.168.2.0/24 (y que 192.168.2.1 sea el propio servidor, y las otras IPs que sean los clientes). Con la sintaxis de «Address» pondremos la subred VPN que nosotros deseemos.

En «PrivateKey» tendremos que introducir la clave privada que hemos generado anteriormente para el servidor. En «ListenPort» pondremos el puerto UDP que nosotros queremos utilizar de cara al servidor, este puerto es el que posteriormente tendremos que «abrir» en la NAT si estamos detrás de un router con NAT.

Por último, en esta sección de «Interface» también podremos definir comandos a ejecutar después de levantar la interfaz virtual con «PostUp» y después de tirar la interfaz virtual con «PostDown». Tal y como veis, lo tenemos actualmente comentado, ya que no queremos hacer NAT contra esta interfaz, pero se podría hacer perfectamente.

En la sección «Peer» es donde tendremos que poner el listado de clientes que permitimos conectar. En este caso, únicamente vamos a conectar un «peer», por lo que definiremos su clave pública con «PublicKey» que hemos creado anteriormente (o que el cliente nos ha proporcionado, ya que es posible que la haya generado él), y también podremos indicar si permitimos que ese cliente con una determinada dirección IP se pueda conectar. Con la directiva «AllowedIPs» podremos filtrar las direcciones IP de origen, si ponemos 0.0.0.0/0 significa que permitimos cualquier dirección IP.

[Interface]
Address = 192.168.2.1/24
PrivateKey = 6JcquylvtJsHNCdWrYMj28XsLIFJUVjlr2y5o27rO2c=
ListenPort = 51820

#PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
#PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens33 -j MASQUERADE

[Peer]
PublicKey = 6c12jLkKzgU9len1kQ/6Fc61xm+LL98TPPlLsri8klE=
AllowedIPs = 0.0.0.0/0

Si queremos añadir más «peers», basta con definirlos individualmente en el archivo de configuración de la siguiente forma:

[Interface]
Address = 192.168.2.1/24
PrivateKey = 6JcquylvtJsHNCdWrYMj28XsLIFJUVjlr2y5o27rO2c=
ListenPort = 51820

#PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
#PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens33 -j MASQUERADE

[Peer]
PublicKey = 6c12jLkKzgU9len1kQ/6Fc61xm+LL98TPPlLsri8klE=
AllowedIPs = 0.0.0.0/0

[Peer]
PublicKey = clave pública del cliente 2
AllowedIPs = 0.0.0.0/0

[Peer]
PublicKey = clave pública del cliente 3
AllowedIPs = 0.0.0.0/0

[/code]

Al archivo de configuración le podemos llamar «wg0.conf», ya que WireGuard crea interfaces virtuales con este nombre, ideal para distinguirlos perfectamente. Para ejecutar este archivo de configuración basta con ejecutar:

root@debian-vm:/etc/wireguard# wg-quick up wg0

Al iniciarlo, WireGuard se encargará de crear la interfaz virtual, ponerle dirección IP, MTU, e incluso crear las rutas correspondientes en la tabla de enrutamiento:

root@debian-vm:/etc/wireguard# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.2.1 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n

Un detalle muy importante, es que en el firewall de Linux tenemos que permitir la entrada de los clientes, concretamente en la nueva interfaz wg0 que se ha creado, por defecto está en todo aceptar, pero es posible que tu política sea denegar todo, por lo que debes asegurarte:

iptables -I INPUT 1 -i wg0 -j ACCEPT

Archivo de configuración para los clientes

La configuración del cliente WireGuard es bastante sencilla en comparación con los servidores IPsec o OpenVPN, sin embargo, debemos tener en cuenta varias cosas que os explicamos a continuación.

En el cliente tendremos que tener una sección de «Interface«, en esta sección podremos indicar la dirección IP privada que identifica al cliente cuando nos conectamos. Debemos recordar que esta VPN es L3, por lo que podremos poner cualquier dirección IP privada que no esté en uso en un determinado momento. Por ejemplo, en OpenVPN la subred por defecto es 10.8.0.0/24, aquí también podremos poner esa misma o cualquier otra como la subred 192.168.2.0/24 (y que 192.168.2.1 sea el propio servidor, y la dirección 192.168.2.2 en adelante sean los clientes. Con la sintaxis de «Address» pondremos la subred VPN que nosotros deseemos.

En «PrivateKey» tendremos que introducir la clave privada que hemos generado anteriormente para el cliente.

En la sección «Peer» es donde tendremos que poner la clave pública con «PublicKey» del servidor WireGuard al que vamos a conectarnos, es decir, esta clave pública nos la ha tenido que proporcionar el servidor. En esta ocasión, también podremos utilizar la directiva «AllowedIPs«, pero el funcionamiento es diferente, en esta ocasión podremos definir si solamente queremos ir por la VPN a una determinada subred (o varias subredes), o queremos reenviar todo el tráfico de Internet por la red privada virtual. Si ponemos las subredes separadas por comas, podremos acceder a varias que tengamos en el servidor, si queremos reenviar todo el tráfico simplemente ponemos 0.0.0.0/0, tal y como ocurre con IPsec.

Finalmente, con la directiva «Endpoint» vamos a definir la dirección IP pública del servidor donde tenemos WireGuard VPN funcionando, seguido por dos puntos (:) del puerto UDP utilizado. Debemos recordar que WireGuard utiliza UDP, por lo que no debemos filtrarlo en los firewalls.

El software y la comunicación con WireGuard intenta pasar lo más desapercibido posible si no está en uso, es decir, no envía continuamente datos a través de la VPN para mantener el túnel activo, ideal para ahorrar batería y datos móviles en los smartphones. En la mayoría de las configuraciones habituales esto funciona perfectamente, pero si estamos detrás de un NAT o firewall, es posible que se corte la comunicación porque no se están transfiriendo datos, por lo que es necesario configurar un «keep alive». Para configurar el Keep Alive, basta con indicar la directiva «PersistentKeepAlive» y poner un número entero que significan los segundos de envío de keep alive. Según la documentación oficial, poner 25 segundos es suficiente para la mayoría de firewall y sistemas NAT, si ponemos 0 desactiva esta función. Si estamos detrás de NAT o un firewall y deseamos recibir conexiones entrantes después de mucho tiempo sin tráfico, será necesaria esta directiva, de lo contrario, podemos no ponerla.

[Interface]
PrivateKey = yPMpP2raY4FoCEJkmzQMlxzm/6RBIW9HkjY6pVFIOnI=
Address = 192.168.2.2/32

[Peer]
PublicKey = xeTkJjjBUyp8paxTgajwDa+qWjrD2RpXlJRSHMwcGDQ=
AllowedIPs = 0.0.0.0/0
Endpoint = 10.10.2.86:51820

#PersistentKeepalive = 25

En sistemas operativos Windows podemos importar esta misma configuración, y ya lo tendremos listo para conectarnos, aunque podremos conectar desde cero un cliente, pero deberemos «pasarle» al servidor WireGuard la clave pública generada.

Es muy importante también mirar los logs de WireGuard, para comprobar que se ha establecido correctamente la conexión VPN. No podemos poner en la sección de «Interface/Address» una dirección IP privada que ya esté en uso en los clientes Windows, ya que tendremos error en la conexión.

Tal y como habéis visto, la configuración de la VPN de WireGuard es realmente fácil y rápida. Os recomendamos entrar en este proyecto de GitHub donde encontraréis unos scripts que nos permitirán automatizar todo esto, y podrás instalarlo y configurarlo en pocos minutos.

Rendimiento de WireGuard VPN en comparación con L2TP/IPsec y OpenVPN

En RedesZone hemos comprobado el rendimiento de WireGuard VPN en comparación con L2TP/IPsec y OpenVPN, las pruebas se han realizado en red local para evitar problemas con el operador, por lo que podremos medir el rendimiento máximo real que es capaz de proporcionarnos con un hardware en concreto.

La configuración del servidor VPN que hemos utilizado (tanto para L2TP/IPsec, OpenVPN y WireGuard) es el siguiente:

  • QNAP TS-1277: procesador AMD Ryzen 7 2700; memoria RAM: 64GB RAM DDR4; conectividad a la red: QNAP QXG-10G2T-107 a 10Gbps con cableado Cat7, y un switch D-Link DXS-1210-10TS.
  • El software VPN para L2TP/IPsec y OpenVPN (utilizando UDP) es QVPN 2 de QNAP
  • En una segunda prueba con OpenVPN (utilizando UDP) y AES-256-GCM hemos utilizado Virtualization Station con Debian.
  • iperf3 instalado manualmente en QTS y también en Debian virtualizado.

La configuración del cliente VPN que hemos utilizado (tanto para L2TP/IPsec, OpenVPN y WireGuard) es el siguiente:

  • PC con procesador AMD Ryzen 7 3800x; memoria RAM: 32GB RAM DDR4 3200MHz; conectividad a la red: ASUS XG-C100C a 10Gbps con cableado CAT7 y un switch D-Link DXS-1210-10TS para la conexión de ambos equipos. Sistema operativo usado en las pruebas: Windows 10 1909.
  • Cliente L2TP/IPsec el propio de Windows 10
  • Última versión de OpenVPN (2.4.8)
  • iperf 3 en Windows 10.

El rendimiento obtenido en las pruebas es el siguiente:

Tal y como podéis ver, la velocidad real de WireGuard es del doble que L2TP/IPsec o que OpenVPN, por lo que podemos afirmar que esta VPN es realmente rápida.

Esperamos que este tutorial de configuración os sirva de ayuda, y podáis desplegar fácilmente servidores WireGuard y los clientes para conectarnos de manera segura a nuestro hogar, empresa, o a Internet desde cualquier lugar de manera segura.