Configurar una VPN con Wireguard.

El teletrabajo y las necesidades de conexión remota aumentan. Hoy te enseño a configurar una VPN con Wireguard. Explicaremos brevemente qué es una VPN. Configuraremos Wireguard sin necesidad de usar scripts como pivpn. Vamos a configurar Wireguard en Windows, Linux, macOS, Android e IOS. Ya seas particular, profesional de la ciberseguridad o una empresa, este tutorial puede ser de tu interés. Intentaremos explicar como implementar el servicio con el menor número de detalles técnicos posible. Os adelantamos que va a ser más rápido y sencillo que por ejemplo con OpenVPN. Por último comparamos estas dos redes privadas virtuales en un Wireguard vs OpenVPN. ACTUALIZADO 03/03/2021. Guía completa para configurar el Servidor y un cliente con cualquier sistema operativo.

Anteriormente y por si son de vuestro interés hemos dejado otros artículos como Software libre: Aplicaciones de Home Office, Programas gratis que no pueden faltar en tu PC, Problemas de seguridad en la APP Zoom. Hoy traemos el tutorial completo para que nuestros lectores puedan disponer de una Red Privada Virtual.

¿Qué es una VPN?

Una red privada virtual (RPV) (en inglés, Virtual Private Network, VPN) es una tecnología de red de ordenadores que permite una extensión segura de la red de área local (LAN) sobre una red pública o no controlada como Internet. Permite que el ordenador en la red envíe y reciba datos sobre redes compartidas o públicas como si fuera una red privada, con toda la funcionalidad, seguridad y políticas de gestión de una red privada. Esto se realiza estableciendo una conexión virtual punto a punto mediante el uso de conexiones dedicadas, cifrado o la combinación de ambos métodos.

FUENTE: Wikipedia.

¿Para que sirve una VPN?

Ejemplos comunes son la posibilidad de conectar dos o más sucursales de una empresa utilizando como vínculo Internet, permitir a los miembros del equipo de soporte técnico la conexión desde su casa al centro de cómputo o bien que un usuario pueda acceder a su equipo doméstico desde un sitio remoto, como por ejemplo un hotel. Todo ello utilizando la infraestructura de Internet.

La conexión VPN a través de Internet es técnicamente una unión wide area network (WAN) entre los sitios, pero al usuario le parece como si fuera un enlace privado: de allí la designación virtual private network.

FUENTE: Wikipedia.

Configurar una VPN con Wireguard.

Esquema gráfico del funcionamiento de una red privada virtual.

Wireguard

¿Qué es Wireguard?

WireGuard es una VPN extremadamente simple pero rápida y moderna que utiliza criptografía de última generación. Su objetivo es ser más rápida, más simple, más ágil y más útil que IPsec. Tiene la intención de tener un rendimiento considerablemente mayor que OpenVPN. WireGuard está diseñado como una VPN de propósito general para ejecutarse en interfaces integradas y supercomputadoras por igual, aptas para muchas circunstancias diferentes. Lanzado inicialmente para el kernel de Linux, ahora es multiplataforma (Windows, macOS, BSD, iOS, Android) y se puede implementar ampliamente. Actualmente se encuentra en un gran desarrollo, pero ya podría considerarse la solución VPN más segura, fácil de usar y más simple de la industria.

FUENTE: Wireguard.

 

Configurar una VPN con Wireguard.

Partimos de la base que tenéis un servidor (ya sea VPS, Raspberry Pi, etc) en el que vamos a realizar la instalación de Wireguard. Este servidor contará con una distribución basada en Debian y es el que vamos a utilizar para configurar una VPN con Wireguard.

Desde el kernel 5.4 Wireguard se encuentra en los repositorios de Linux en su versión estable. Concretamente en la versión 20.04 de Ubuntu ya disponemos de este kernel, de todas maneras la podemos instalar en su versión inestable en casi cualquier distribución basada en Debian.

Instalando Wireguard en el servidor.

Una vez nos hayamos conectado a nuestro servidor con distro basada en Debian, nos hacemos “root”:

sudo su

Antes de instalar cualquier programa en Linux es recomendable actualizar los repositorios:

apt update

Damos la siguiente orden a la terminal para instalar Wireguard:

apt install wireguard

Con esta orden instalaremos Wireguard (Ubuntu 20.04). Puede ser que en nuestra distribución no esté en los repositorios aún. Por ejemplo en Debian 10 en el momento de escrbir estas líneas. No habría problema, ejecutamos el siguiente comando en el caso de no estar en los repos:

add-apt-repository ppa:wireguard/wireguard

Una vez hecho esto ejecutaríamos nuevamente la orden apt install wireguard y comenzaría la instalación.

Instalando Wireguard inestable sobre S.O obsoleto (Debian 9) para configurar servidor VPN Wireguard.

Hemos utilizado en este caso una Orange Pi Zero y por necesidad el software más indicado que hay en su web oficial es Debian 9. Con Armbian, no hemos conseguido hacer funcionar Wireguard. Puedes descargar Debian para Orange Pi Zero desde aquí si tienes este dispositivo.

Le daremos a la terminal las siguientes órdenes:

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

 

Configurar una VPN con Wireguard.

Sobre una Orange Pi Zero con Debian 9, hemos instalado una versión inestable de Wireguard para mostraros como se añade el repositorio.

Configurando la interfaz del servidor.

Ya con Wireguard instalado procederemos a preparar la interfaz. Para ello utilizando el comando cd nos moveremos a la siguiente ruta:

cd /etc/wireguard/

Aquí generaremos nuestro par de claves pública y privada de esta forma:

umask 077
wg genkey | tee servidor_private.key | wg pubkey > servidor_public.key

Con el comando ll podemos comprobar que se han creado las claves pública y privada. Ahora por seguridad cambiaremos el permiso de acceso a las claves para que sólo tenga acceso el usuario root. De esta manera si se viera comprometido el servidor, no podrían suplantarnos y dirigir el tráfico hacía otro servidor distinto del que hemos creado. Lo haremos de esta manera:

chmod 600 -R ../wireguard/

Creamos nuestro archivo de configuración:

touch wg0.conf

Desde la ruta en la que estamos, vamos a copiar y a pegar desde la línea de comandos nuestra clave privada. También podríamos copiarla y pegarla a golpe de click, pero nos ahorraremos algo de tiempo de esta manera:

cat servidor_private.key >> wg0.conf

Editando el archivo wg0.conf

Procedemos a editar el archivo de configuración. Utilizaré Nano, pero cada uno puede utilizar el editor de texto que le apetezca:

nano wg0.conf

Inmediatamente se abrirá el editor y observaremos que nuestra clave privada ya está dentro (recordar que la hemos copiado y pegado anteriormente con el comando cat wg private.key >> wg0.conf). Ahora editaremos el archivo y lo dejaremos con este aspecto:

[Interface]
Address = 10.0.0.1
PrivateKey = Aquí va vuestra clave privada
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

 

Configurar una VPN con Wireguard.

El archivo wg0.conf quedaría así una vez añadido el cliente. Ahora sólo hemos puesto la interfaz.

Explicación paso a paso del apartado [Interface]

“Address” es la dirección en la VPN, le podéis dar la que queráis siempre y cuando no esté ocupada. Esta dirección es la que crea la red VPN, os sirve la que yo tengo perfectamente. Cada cliente deberá tener una distinta es decir, si el servidor es la 10.0.0.1 el cliente será la 10.0.0.2.

“PrivateKey” es vuestra clave privada, recordar que estaba copiada y pegada previamente.

“ListenPort” es el puerto donde va a trabajar Wireguard. Importante, por defecto 51820 UDP es el puerto en el que trabaja esta VPN, pero puede ser cualquier otro. Deberéis abrirlo en vuestro módem para que el servicio pueda funcionar.

“PostUp y PostDown” son las reglas del firewall. Sólo las necesitáis si tenéis reglas Iptables (lo lógico es que sí). Podéis copiar y pegar éstas pero deberéis conocer la interfaz, es decir la mía es eth0 pero la vuestra puede tener otro nombre. Lo podéis consultar de manera sencilla desde vuestra terminal con el comando ifconfig.

Con nuestro archivo ya editado con nano, presionamos Ctrl O para guardarlo y Ctrl X para cerrarlo. Vamos a activar Wireguard para que inicie con el sistema:

systemctl enable [email protected]

Arrancamos el servicio, comprobamos que esté activo y que se ha creado la interfaz (primero una orden y luego la otra):

systemctl start [email protected]
systemctl status [email protected]
ifconfig

Apunte importante sobre Forwarding.

Cuidado con esto porque nos puede robar tiempo. Necesitamos tener habilitado el forwarding:

sysctl -w net.ipv4.ip_forward=1

En caso de utilizar el gestor de cortafuegos UFW habilitamos los puertos de esta manera:

ufw allow 22/tcp
ufw allow 51820/udp
ufw enable

Este apunte es importante para poder tener salida a internet. Si no fuera así una vez montado el servicio, conviene revisar la ruta /etc/sysctl.d y el archivo que se llama 99-sysctl.conf. Lo abriremos con nano y buscaremos las siguientes líneas:

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

Observar que en inglés pone “Elimine el comentario de la siguiente línea para habilitar el reenvío de paquetes para IPv4“. Simplemente borrarremos el # de la línea que pone net.ipv4.ip_forward=1 guardamos con Ctrl O y salimos. Ya deberíamos tener salida a internet.

Configurar cliente Wireguard en Windows

Wireguard es multiplataforma. Funciona en Linux, Windows, MacOS, Android e IOS. Os voy a enseñar como configurar todos los dispositivos como clientes. Veamos como configuramos un cliente Wireguard en Windows 10.

Wireguard

Tenemos que descargar el cliente de Wireguard para Windows desde su web para configurar una VPN con Wireguard.

Desde nuestro PC Windows, nos vamos a la web de Wireguard y descargamos el programa para Windows. Lo instalamos y le damos permisos de administrador. A continuación en Add Tunnel presionamos sobre Add empty tunnel y rellenamos los datos tal y como salen en la imágenes. Las claves pública y privada ya nos las autogenera el propio programa.

Wireguard

Hacemos click e “Add Tunnel” y seguidamente “Add empty tunnel”

Wireguard

Rellenaremos los datos como en la imagen. Importante las claves pública y privada las autogenera el programa.

Configurando el servidor para añadir el cliente Windows.

Nuevamente dentro de nuestro servidor Linux y en la ruta /etc/wireguard/ vamos a modificar el archivo wg0.conf. Lo haremos así:

nano wg0.conf

Añadimos debajo de Interface el apartado Peer y queda de esta manera:

[Interface]
Address = 10.0.0.1
PrivateKey = Aquí va vuestra clave privada
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
Publickey = LA CLAVE PÚBLICA QUE GENERÓ TU CLIENTE WINDOWS
AllowedIPs =10.0.0.2/32
PersistentKeepAlive = 25

Hemos añadido el peer (nuestro cliente) con su clave pública generada previamente en el cliente windows (recordar que nos la generaba automáticamente cuando añadiamos el túnel). Tenemos también la IP 10.0.0.2 que corresponde con el cliente. Por último la línea PersistentKeepAlive = 25, es para que envíe un paquete cada 25 segundos, que es lo que recomiendan desde Wireguard.

Reiniciamos el servicio y comprobamos que se ha creado el cliente:

systemctl restart [email protected]
wg

Una vez en el cliente Windows, le daremos al botón “Activate” y ya estaría listo.

Instalando un cliente Linux.

Wireguard

Los comandos de configuración del cliente Linux, son idénticos a los del servidor.

No se puede realizar un artículo sobre Configuar una VPN en Wireguard y no hacerlo en Linux. Este programa está pensado para el S.O del pingüino así que vamos a ello.

Desde nuestro Cliente Linux y como root Instalamos Wireguard:

apt install wireguard

Es idéntico a realizar la instalación en el servidor así que no me extenderé demasiado:

Generaremos nuestro par de claves pública y privada de esta forma:

umask 077
wg genkey | tee clientelinux_private.key | wg pubkey > clientelinux_public.key

Creamos nuestro archivo de configuración del cliente Linux:

touch wg0.conf

Copiamos la clave privada de nuestro cliente Linux en el archivo de configuración:

cat clientelinux_private.key >> wg0.conf

Tecleamos nano wg0.conf para abrir el editor y dejamos el archivo de configuración de la siguiente forma:

[Interface]
Address = 10.0.0.3
PrivateKey = LA CLAVE PRIVADA DE TU CLIENTE LINUX 
[Peer]
Publickey = LA CLAVE PÚBLICA DE TU SERVIDOR
AllowedIPs = 0.0.0.0/0
EndPoint= TU IP PÚBLICA:51820.
Modificando el servidor para admitir el cliente Linux.

Volvemos al servidor y en la ruta /etc/wireguard editamos nuevamente el archivo wg0.conf con nano. Lo dejamos de esta manera (observar que ya teníamos previamente el cliente Windows):

[Interface]
Address = 10.0.0.1
PrivateKey = Aquí va vuestra clave privada
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = LA CLAVE PÚBLICA QUE GENERÓ TU CLIENTE WINDOWS
AllowedIPs = 10.0.0.2/32
PersistentKeepAlive = 25
[Peer]
PublicKey = LA CLAVE PÚBLICA DE TU CLIENTE LINUX
AllowedIPs = 10.0.0.3/32
PersistentKeepAlive = 25

 

Wireguard

El archivo de configuración de nuestro “servidor” quedará así una vez añadido el cliente Linux.

Reiniciamos el servicio y comprobamos que se ha creado el cliente:

systemctl restart [email protected]
wg

Nuevamente en nuestro cliente Linux vamos a arrancar el servicio de Wireguard:

systemctl enable [email protected]
systemctl start [email protected]

Si hacemos ping y ponemos la dirección Ip de nuestro servidor, comprobaremos si funciona perfectamente. Eso sería todo para la configuración de un cliente Linux.

Configuar una VPN con Wireguard en IOS y Android.

Wireguard puede tener como clientes smartphones y teléfonos móviles que tengan como sistema operativo IOS y Android. Os mostramos como configurarlos.

Desde la consola de comandos de nuestro servidor, una vez escalado privilegios como usuario root nos dirijimos a la ruta /etc/wireguard. Recordar que para eso utilizamos la orden cd /etc/wireguard.

Vamos a crear un directorio para los clientes IOS y Android. Nos moveremos dentro de esa carpeta:

mkdir clientes_moviles
cd clientes_moviles

Para el tutorial en nuestro caso vamos a utilizar un sólo dispositivo móvil, así que no voy a generar más carpetas. Vosotros si queréis ser ordenados podéis generar una carpeta para cada teléfono móvil que queráis utilizar como cliente.

Generamos las claves pública y privada del cliente móvil:

wg genkey | tee clientemovil_private.key | wg pubkey > clientemovil_public.key

Creamos un fichero de configuración para el cliente móvil:

touch clientemovil.conf

Enviamos la clave privada de nuestro cliente móvil al archivo de configuración y además la clave pública de nuestro servidor con los siguientes comandos:

cat clientemovil_private.key > clientemovil.conf
cat ../../servidor_public.key >> clientemovil.conf

Ahora con nano clientemovil.conf vamos a editar el archivo de configuración. Recordar que la primera línea que tenemos dentro del archivo es la clave privada del cliente movil. La segunda línea es la clave pública de nuestro servidor. Con los anteriores comandos los hemos copiado y por eso están dentro. Ahora dejamos el arhivo de esta manera:

[Interface] 
Address = 10.0.0.4 
PrivateKey = LA CLAVE PRIVADA DE TU CLIENTE MÓVIL
ListenPort = 51820 
[Peer] 
Publickey = LA CLAVE PÚBLICA DE TU SERVIDOR
Endpoint = TU IP PÚBLICA:51820
AllowedIPs = 0.0.0.0/0 
PersistentKeepAlive = 25
Configurar una VPN con Wireguard, añadiendo el cliente móvil al servidor.

Ahora vamos a por el archivo de configuración del servidor y lo que vamos a hacer es copiar dentro la clave pública del cliente móvil. Tener cuidado de poner bien este comando, que podéis borrar el contenido del archivo de configuración del servidor:

cat clientemovil_publica.key >> /etc/wireguard/wg0.conf

Ahora editamos con nano el archivo de confirugación del servidor:

nano /etc/wireguard/wg0.conf

Al final del archivo estará la clave pública de nuestro cliente movil, dejamos el archivo de configuración de esta manera:

[Interface]
Address = 10.0.0.1
PrivateKey = Aquí va vuestra clave privada
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = LA CLAVE PÚBLICA QUE GENERÓ TU CLIENTE WINDOWS
AllowedIPs = 10.0.0.2/32
PersistentKeepAlive = 25
[Peer]
PublicKey = LA CLAVE PÚBLICA DE TU CLIENTE LINUX
AllowedIPs = 10.0.0.3/32
PersistentKeepAlive = 25
[Peer] 
PublicKey = LA CLAVE PÚBLICA DE TU CLIENTE MÓVIL 
AllowedIPs = 10.0.0.4/32 
PersistentKeepAlive = 25

Reiniciamos Wireguard y comprobamos que el cliente móvil esté permitido:

systemctl restart [email protected]
wg
Generando código QR con Qrencode.

Qrencode es un programa que nos permite generar un código QR desde la línea de comandos. Lo instalamos de esta forma:

apt install qrencode

Generamos nuestro código QR para escanear con nuestro dispositivo Android o IOS.

qrencode -t ansiutf8 < clientemovil.conf
Wireguard en nuestro Smartphone.

Desde App Store en IOS o Play Store en el caso de Android, descargamos la aplicación de Wireguard. En ambos sistemas operativos disponemos de un botón “+”. Pulsamos ese botón volvemos a presionar sobre Escanear desde código QR, o Crear desde código QR dependiendo del S.O.

Wireguard

A la izquierda el cliente IOS Y a la derecha el cliente Android. En ambos se escanea el QR de forma idéntica.

Le damos un nombre a nuestro túnel y si todo ha ido bien, tenemos listo nuestro cliente móvil IOS o Android con su VPN Wireguard.

Configurar un cliente MacOS en Wireguard

El procedimiento para configurar una VPN con Wireguard, incluye que este programa funcione en un cliente cuyo sistema operativo sea MacOS. Para el sistema operativo de Apple la configuración es sencilla.

En el momento de escribir estas líneas, la versión mínima que debes tener es MacOS 10.14, si no es así no podrás instalar Wireguard. Verificado lo anterior nos dirijimos a la App Store y escribimos en el buscador de app “wireguard”. Obtenemos e instalamos como con cualquier otro programa.

Wireguard

Wireguard se encuentra disponible en la App Store de MacOS.

Abrimos la aplicación, presionamos en el símbolo “+” hacemos click en Add Empty Tunnel y rellenamos los apartados tal y como os muestro en la imagen de abajo. Recordar que Wireguard autogenera la clave privada del cliente MacOS y la clave pública, ésta última te hará falta para configurar el cliente en el servidor.

Wireguar

El archivo de configuración de Wireguard en MacOS. Recordar que se nos autogeneran clave pública y privada.

Nuevamente iríamos al servidor a la ruta /etc/wireguard, a crear otro Peer. Tal y como hemos explicado más arriba. Con Nano o tu editor favorito añadimos un nuevo cliente en el archivo wg0.conf con la dirección IP que le hemos asignado y la clave pública del cliente MacOS. Guardamos el archivo y reiniciamos el servicio de Wireguard escribiendo en la consola systemctl restart [email protected].

Volvemos al cliente MacOS y desde la App de Wireguard Activamos nuestra red.

Conclusiones

Como habéis podido observar Wireguard es un cliente más sencillo de configurar que por ejemplo Open VPN. Los resultados además son muy buenos. En nuestro afán de realizar artículos que puedan ayudar a los lectores que estén teletrabajando o incluso empresas y pymes, quisimos ofrecer el artículo más completo sobre Wireguard. Con esta guía podrás configurar un Servidor Linux para que tenga una Red Privada Virtual basada en Wireguard y además añadir un cliente en casi cualquier Sistema Operativo del mercado.

Este servidor podría ser una VPS, una placa de desarrollo SBC (como por ejemplo Raspberry Pi) o un ordenador utilizado para esta labor. En cualquier caso de los pocos problemas que se os podrían plantear en el montaje, me gustaría mencionar algunos importantes.

Imposibilidad de asignar una IP Pública para configurar una VPN con Wireguard

Imposibilidad de asignar una IP pública a tu servidor porque tu ISP no te lo permite, por ejemplo. Para este caso y por ser un problema muy común, realizaremos pronto un pequeño artículo que te ayude a solucionar el problema de la IP pública. Sigue atenta/o al blog.

Problemas para resolver DNS.

Te encuentras que tienes problemas con la resolución de nombres de dominio y aunque haces ping a los clientes desde el servidor y viceversa, no resuelve las direcciones. En este caso conviene revisar la configuración DNS de tu router. Deberían coincidir con la de tus clientes. Los utilizados por el servidor Linux se encuentran en la ruta /etc/resolv.conf. Con un editor como Nano puedes editarlos y comprobar si está ahí el problema.

En todo caso, ante cualquier duda recuerda que puedes dejarla en los comentarios y te intentaremos ayudar.