Instalar y configurar WireGuard VPN en Rocky Linux

El día de hoy vamos a ver cómo instalar WireGuard VPN en Rocky Linux. Ya que se trata de una excelente alternativa a otros productos de VPN como OpenVPN o IPSec. Además, los pasos explicados en esta entrada también son compatibles en distribuciones similares como Centos 8 o Alma Linux.

En esta ocasión para realizar la prueba de instalación voy a utilizar un VPS, esto es un servidor virtual en la nube, en mi proveedor de confianza Clouding.io, como viene siendo habitual en los últimos tiempos.

Pero, antes de nada, empecemos por el principio

¿Qué es una VPN?

Una VPN, esto es, una red privada virtual, permite crear una conexión a otra red, a través de Internet. Se utilizan, por ejemplo, para acceder a la red de un cliente que gestionemos, a la red de nuestra propia oficina, si trabajamos desde casa, para proteger nuestra navegación de miradas indiscretas o para saltarse las restricciones que podamos tener en el lugar donde vivamos.

A nivel un poco más técnico, 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.

Funcionamiento VPN (Créditos Wikipedia)

¿Qués es WireGuard?

WireGuard es una VPN simple, rápida y segura que utiliza una tecnología de criptografía avanzada. Su intención es ser más rápida y ágil que otros protocolos VPN como OpenVPN e IPSec. WireGuard todavía está en desarrollo, pero incluso en su estado no optimizado es más rápido que el popular protocolo OpenVPN.

Su configuración, si la comparamos con otros productos similares, es realmente simple, similar a lo que sería configurar SSH. La conexión se establece mediante un intercambio de llaves públicas entre el servidor y el cliente. Solo un cliente que tenga su clave pública en el archivo de configuración del servidor puede conectarse.

WireGuard se encarga de configurar las interfaces de red, como por ejemplo wg0 o wg1, que se comportan de manera similar a la interfaz más típica eth0. Esto hace posible configurar y administrar interfaces WireGuard utilizando herramientas comunes como ifconfig e ip.

Instalación de WireGuard VPN en Rocky Linux

Requisitos previos

Primero de todo actualizamos los repositorios:

sudo dnf update

Lo ideal es utilizar sudo desde un usuario diferente de ‘root’, pero esto ya es decisión de cada uno.

A continuación, habilitamos los repositorios EPEL y PowerTools:

sudo dnf install epel-release
sudo dnf install dnf-plugins-core
sudo dnf config-manager --set-enabled powertools

Para a continuación habilitar el repositorio de Wireguard:

sudo dnf copr enable jdoss/wireguard

Instalar WireGuard VPN en Rocky Linux

Ejecutamos lo siguiente:

sudo dnf install wireguard-dkms wireguard-tools

Comprobamos que entre otros paquetes instalamos herramientas como GNU GCC, imprescindibles para compilar.

Configurar el servidor WireGuard

Creamos la carpeta donde vamos a ubicar los ficheros de configuración y le asignamos permisos:

sudo mkdir -v /etc/wireguard/
sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
sudo ls -l /etc/wireguard/wg0.conf

Ahora viene una parte importante, que es crear el par de claves, la pública y la privada.

Accedemos a la carpeta que hemos creado antes:

sudo cd /etc/wireguard/

Y ejecutamos:

sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey

De esta manera ya tendemos que tener creadas ambas llaves:

sudo cat privatekey
sudo cat publickey

Y añadimos los parámetros al fichero de configuración:

sudo vi /etc/wireguard/wg0.conf

Añadimos:

[Interface]
## La ip privada de la VPN##
Address = 192.168.5.1/24
 
## El puerto de la VPN ##
ListenPort = 31194
 
## La llave privada ubicada en. /etc/wireguard/privatekey ##
PrivateKey = “Aquí va la llave privada”
 
## Guardamos y actualizamos esta configuración en el cliente ##
SaveConfig = true

Añadimos las reglas al cortafuegos

Siempre es recomendado tener habilitado un cortafuegos, en este caso con FirewallD, por lo que creamos este fichero:

vi /etc/firewalld/services/wireguard.xml

Con este contenido:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>wireguard</short>
  <description>Abrimos conexión UDP para Wireguard en el puerto 31194</description>
  <port protocol="udp" port="31194"/>
</service>

Ahora añadimos el fichero a la configuración del cortafuegos:

sudo firewall-cmd --permanent --add-service=wireguard --zone=public

Activamos el enmascaramiento para que todo el tráfico que entra y sale de la 192.168.5.0/24 sen enrute correctamente a través de nuestra IP pública.

sudo firewall-cmd --permanent --zone=public --add-masquerade

Y recargamos la configuración del cortafuegos:

sudo firewall-cmd --reload

Podemos listar la configuración actual del cortafuegos con este comando:

sudo firewall-cmd --list-all

Finalmente, en este parte, añadimos otro fichero, donde indicamos el forwarding entre IPv4 e IPv6

sudo vi /etc/sysctl.d/99-custom.conf

Con estos parámetros:

## Encendemos en bbr ##
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
 
## Para IPv4 ##
net.ipv4.ip_forward = 1
 
## Habilitamos la protección básica ##
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
 
## Para IPv6 debemos descomentar esta línea ##
#net.ipv6.conf.all.forwarding = 1

Y cargamos la configuración:

sudo sysctl -p /etc/sysctl.d/99-custom.conf

Permitir la conexión de igual a igual

De forma predeterminada, FirewallD eliminará todas las comunicaciones entre la red interna (wg0) y la pública (eth0). Por lo tanto, agregamos la interfaz wg0 a la red interna y activamos el enmascaramiento:

sudo firewall-cmd --add-interface=wg0 --zone=internal
sudo firewall-cmd --permanent --zone=internal --add-masquerade

Habilitar y encender el servicio de WireGuard

En esta parte habilitamos el servicio utilizando el comando systemctl:

sudo systemctl enable wg-quick@wg0 
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0

Para muestra un botón:

Comprobamos el estado del servicio

Verificamos que la interfaz efectivamente esta levantada:

sudo wg
sudo ip a show wg0

Instalar el cliente de WireGuard en GNU/Linux

El cliente de WireGuard se puede instalar y configurar en prácticamente todas las distribuciones GNU/Linux. En mi caso voy a utilizar Pop!-OS 20.04, que es una distribución similar a Debian o Ubuntu, y está patrocinada por la compañía System76. En este caso los paquetes de WireGuard ya vienen en los repositorios principales:

sudo apt install wireguard-dkms wireguard-tools wireguard

En el caso de una distribución Rocky Linux, Centos, RHEL, Fedora o similar:

sudo dnf install epel-release
sudo dnf install dnf-plugins-core
sudo dnf config-manager --set-enabled powertools
sudo dnf copr enable jdoss/wireguard
sudo dnf install wireguard-dkms wireguard-tools

Al igual que hemos hecho en la parte del servidor, creamos la carpeta correspondiente y creamos el par de llaves:

sudo mkdir -v /etc/wireguard/
sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
cd /etc/wireguard/
sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'

Comprobamos la llave privada generada:

sudo cat privatekey

Editamos el fichero de configuración:

sudo vi /etc/wireguard/wg0.conf

Con el contenido:

[Interface]
## La llave privada del cliente ##
PrivateKey = "Aquí va la llave privada"
 
## La IP privada del cliente ##
Address = 192.168.5.2/24
 
[Peer]
## La llave pública del servidor ##
PublicKey = "Aquí va la llave pública del servidor"
 
## Si hacen faltan las ACL##
#AllowedIPs = 192.168.5.0/24
## Turn on NAT for client so internet routed thorugh our vpn
AllowedIPs = 0.0.0.0/0
 
## Your CentOS 8 server's public IPv4/IPv6 address and port ##
Endpoint = "ip del servidor":31194
 
##  Tiempo de reconexión ##
PersistentKeepalive = 15

Añadimos al arranque, habilitamos el servicio y encendemos:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0

Y una vez encendido:

Estado del servicio en el cliente

Permitir la conexión de cliente y servidor

Necesitamos configurar el lado del servidor y permitir una conexión entre el cliente y el servidor. Regresamos a nuestro servidor CentOS 8 y editamos el archivo wg0.conf para agregar la información de [Peer] (cliente) de la siguiente manera. Estos pasos son el servidor Rocky Linux:

sudo systemctl stop wg-quick@wg0
sudo vi /etc/wireguard/wg0.conf

Y añadimos:

[Peer]
## Llave pública del cliente ##
PublicKey = "La llave pública del cliente"
 
## Habilitamos la IP del cliente, con una mascara de 32 bits##
AllowedIPs = 192.168.5.2/32

Volvemos a encender el servicio:

sudo systemctl start wg-quick@wg0

Verificamos la conexión entre ambos nodos:

ping -c 4 192.168.5.1
sudo wg

Si no nos reponde hay que mirar la configuración del cortafuegos, en nuestro proveedor, en mi caso, he añadido esta regla en la configuración del cortafuegos de Clouding.io

Añadimos reglas en el cortafuegos de nuestro proveedor

De esta manera ya funciona correctamente la comunicación entre ambos:

Realizamos pruebas de comunicación entre servidor y cliente.

Espero que esta información os sea de utilidad en algún momento.

También te puede interesar:

Instalar y configurar WireGuard VPN en Debian 10

Instalar y configurar OpenVPN en Centos 8

Adjunto las fuentes consultadas:

Cybercity.biz – CentOS 8 set up WireGuard VPN server