Introducción a WireGuard
Una VPN (Virtual Private Network o red privada virtual) recrea mediante software y cifrado una red que no existe a nivel físico pero que permite comunicar de manera segura a los equipos que participan en esta red.
El tráfico de la VPN acaba transmitiéndose por los adaptadores de red y la infraestructura física que comunica los equipos, pero antes de transmitir este tráfico se cifra y se encapsula en paquetes que lo transportan hasta su destino. En el destino, cuando se reciben los datos, se descifran y se recomponen los paquetes virtuales transmitidos por la VPN.
Así en el esquema se aprecia que los dos ordenadores ya están conectados a la red física (de color negro) pero al ejecutar una VPN parece que, además de la interfaz física, los ordenadores tienen otra interfaz de red con un enlace privado (de color rojo) para ellos.
Características de WireGuard
WireGuard es una herramienta libre y moderna para implementar VPNs. La herramienta clásica de GNU/Linux para implementar VPNs ha sido OpenVPN, una herramienta modular y muy completa. WireGuard no aspira a substituir a OpenVPN en todos sus modos de funcionamiento, aspira a facilitar la creación de VPNs con buena seguridad y rendimiento.
Al utilizar WireGuard:
- Se utiliza UDP como transporte.
- Un equipo WireGuard que acepte conexiones debe tener abierto un puerto UDP y una IP conocida.
- Se utiliza criptografía de clave pública. Cada equipo tendrá dos claves: la privada y la pública. La clave privada no debe salir nunca del equipo en el que se generó, la clave pública deberá llevarse a los otros equipos que quieran participar en la VPN.
- El equipo cliente que conecte con el servidor no necesita tener ninguna IP pública ni ningún puerto abierto y puede estar detrás de NAT.
- WireGuard no se encarga de asignar direcciones en la VPN, ni repartir las claves, ni de ninguna otra tarea que no sea mantener el túnel.
Instalación
WireGuard está disponible en los repositorios de las principales distribuciones de GNU/Linux y también se puede instalar en otros sistemas operativos.
La instalación en Ubuntu se puede realizar con un comando:
# apt install wireguard-tools
Una vez instalado se podrá utilizar la herramienta wg
.
Configuración de una VPN entre dos equipos
La configuración más básica consta de dos equipos: uno que actúa como servidor
(y tiene una IP y un puerto UDP abierto) y otro que actúa como cliente
. A partir de esta configuración se podrán añadir nuevos clientes que se conecten al servidor para que todos los equipos participen en una misma VPN o bien definir nuevas interfaces de red para mantener diferentes VPNs.
La configuración del servidor incluirá:
- Una sección
Interface
con:- La clave privada a utilizar.
- La dirección IP de la interfaz en la VPN.
- El puerto en el que se aceptarán conexiones de los clientes.
- La declaración de un
Peer
(el cliente) con:- La clave pública del cliente.
- La directiva
AllowedIPs
con la lista de direcciones que puede utilizar el par o que se pueden alcanzar a través del par.
La configuración del cliente incluirá:
- Una sección
Interface
con:- La clave privada a utilizar.
- La dirección IP de la interfaz en la VPN.
- La declaración de un
Peer
(el servidor) con:- La clave pública del servidor
- La directiva
AllowedIPs
con la lista de direcciones que puede utilizar el par o que se pueden alcanzar a través del par. - La directiva
Endpoint
indicando la dirección IP y el puerto UDP en el que atiende el servidor. - Posiblemente la directiva
PersistentKeepalive
para enviar un paquete a través de la VPN cada cierto número de segundos cuando no hay actividad para evitar que los cortafuegos y routers intermedios cierren la conexión.
Creación de un par de claves en cada equipo
Cada equipo en la VPN utilizará dos claves: pública y privada.
Estas claves se pueden generar con el siguiente comando:
umask 077; wg genkey | tee privatekey | wg pubkey > publickey
Después de ejecutar el comando se habrán creado los ficheros:
privatekey
con la clave privada.publickey
con la clave pública.
En realidad, como se puede ver, la generación de las claves se realiza en dos pasos:
- Se utiliza
wg genkey
para generar la clave privada. - Se utiliza
wg pubkey
para derivar la clave pública a partir de la clave privada.
Las claves se representan mediante una cadena de 45 carácteres de alfanuméricos. Idealmente las claves se pueden generar en cada equipo, de manera que la clave privada no tenga que transportarse nunca por la red pues únicamente se utilizará en el equipo en el que se creó. La clave pública deberá utilizarse en el fichero de configuración del otro equipo.
Configuración en el servidor
Una vez instalado wireguard
se podrá acceder al directorio /etc/wireguard
para crear en su interior el par de claves.
Después se podrá editar el fichero /etc/wireguard/wg0.conf
para que contenga:
[Interface] # IP que tendrá la interfaz wg0 Address = 192.168.6.1/24 # Puerto en el que escuchará el servidor ListenPort = 41194 # Clave privada del servidor. Guardada en /etc/wireguard/privatekey PrivateKey = hshshsh... [Peer] # Clave pública del cliente. PublicKey = adfadf... # IP exacta (/32) del cliente en la VPN AllowedIPs = 192.168.6.2/32
Después se podrá activar el servicio:
systemctl enable wg-quick@wg0
Y encenderlo:
systemctl start wg-quick@wg0
Configuración en el cliente
Una vez instalado wireguard
se podrá acceder al directorio /etc/wireguard
para crear en su interior el par de claves.
Después se podrá editar el fichero /etc/wireguard/wg0.conf
para que contenga:
[Interface]
# Clave privada del cliente
PrivateKey = ZzZz...
# IP para el cliente en la VPN
Address = 192.168.6.2/24
[Peer]
# Clave pública del servidor
PublicKey = XxXxX...
# Tráfico que se aceptará (toda la red /24)
AllowedIPs = 192.168.6.0/24
# IP y puerto UDP en el que escucha el servidor
Endpoint = 125.239.76.212:41194
# Si no hay tráfico transmitir un paquete cada 30 segundos
PersistentKeepalive = 30
Después se podrá activar el servicio:
systemctl enable wg-quick@wg0
Y encenderlo:
systemctl start wg-quick@wg0