Introducción a WireGuard

per Victor Carceler darrera modificació 2021-01-07T10:19:32+02:00

https://commons.wikimedia.org/wiki/File:Logo_of_WireGuard.svg

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.

https://commons.wikimedia.org/wiki/File:VPN_overview-en.svg

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:

  1. Se utiliza wg genkey para generar la clave privada.
  2. 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

Más información: