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.
¿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:
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:
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
De esta manera ya funciona correctamente la comunicación entre ambos:
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: