Cómo configurar Wireguard VPN en CentOS 8

Wireguard es una implementación de VPN multiplataforma de código abierto que utiliza criptografía de última generación. Es más rápida, sencilla y funcional que los protocolos IPSec y OpenVPN. Está diseñada como una VPN de propósito general para funcionar en interfaces integradas y superordenadores, y se ejecuta en Linux, Windows, macOS, iOS, Android, BSD y varias otras plataformas.

Este tutorial explica cómo instalar Wireguard VPN en un servidor basado en CentOS 8 y cómo conectarse a él utilizando un cliente Linux (CentOS/Fedora/Ubuntu).

Paso 1 – Actualizar el sistema

Antes de seguir adelante, es imprescindible que actualices tu sistema para instalar las últimas actualizaciones.

$ sudo dnf update

Paso 2 – Instalar y habilitar el repositorio EPEL

Los paquetes necesarios de Wireguard se encuentran en el repositorio EPEL, así que tenemos que instalarlo y habilitarlo.

$ sudo dnf install epel-release
$ sudo dnf config-manager --set-enabled PowerTools

También habilitamos el repositorio PowerTools ya que los paquetes EPEL dependen de él.

Paso 3 – Instalar Wireguard

Habilita el repositorio de Wireguard.

$ sudo dnf copr enable jdoss/wireguard

Instala Wireguard.

$ sudo dnf install wireguard-dkms wireguard-tools

Este paso también instala el compilador GNU GCC necesario para construir los módulos del Kernel Linux.

Paso 4 – Configurar el servidor Wireguard

Crea un archivo de configuración vacío en el servidor para la configuración de Wireguard con los permisos adecuados.

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

El comando Touch crea el archivo wg0-server.conf en el directorio /etc/wireguard.

A continuación, crea un par de claves privada/pública para el servidor Wireguard.

$ cd /etc/wireguard
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'

Esto crea tanto la clave pública como la privada para el Wireguard y las escribe en los archivos respectivos.

Visualiza la clave privada que acabamos de crear.

$ sudo cat privatekey

Anota la clave y cópiala porque la necesitaremos para configurar Wireguard.

A continuación, edita el archivo de configuración.

$ sudo nano /etc/wireguard/wg0.conf

Añade el siguiente código.

[Interface]
## VPN server private IP address ##
Address = 192.168.10.1/24
 
## VPN server port - You can choose any port ##
ListenPort = 37822
 
## VPN server's private key i.e. /etc/wireguard/privatekey - the one from above ##
PrivateKey = GCEXafeZKqSsuLfvuHE+zLzMYwoH4qQyBh7MZ4f/3kM=
 
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true

Cada configuración tiene una sección llamada [Interface] donde se define la parte-servidor.

Contiene la clave privada del servidor local de WireGuard, el puerto UDP en el que debe escuchar las conexiones entrantes y sus propias direcciones IP VPN.

También definimos SaveConfig como true. Esto indicará al servicio Wireguard que guarde automáticamente su configuración activa en este archivo al apagarse.

Pulsa Ctrl + W para cerrar el archivo e introduce Y cuando se te pida guardar el archivo.

Paso 5 – Configurar el Cortafuegos

Tenemos que abrir el puerto que elegimos para Wireguard.

Primero, tenemos que definir el servicio Wireguard para el cortafuegos. Para ello, crea un archivo wireguard.xml con el editor Nano.

$ sudo nano /etc/firewalld/services/wireguard.xml

Pega el siguiente código en el archivo.

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>wireguard</short>
  <description>WireGuard open UDP port 37822 for client connections</description>
  <port protocol="udp" port="37822"/>
</service>

Pulsa Ctrl + W para cerrar el archivo e introduce Y cuando se te pida guardar el archivo.

A continuación, activa el servicio Wireguard en el cortafuegos.

$ sudo firewall-cmd --permanent --add-service=wireguard

Activa el enmascaramiento para que todo el tráfico que entra y sale de 192.168.10.0/24 se dirija a través de nuestra dirección IP pública del servidor 203.1.114.98/24.

$ sudo firewall-cmd --permanent --add-masquerade

Por último, recarga el cortafuegos para activar las reglas.

$ sudo firewall-cmd --reload

Enumera las reglas actuales del cortafuegos para confirmarlo.

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: wireguard ssh
  ports: 
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Paso 6 – Activar el reenvío IPv4

Crea el archivo /etc/sysctl.d/99-custom.conf.

$ sudo nano /etc/sysctl.d/99-custom.conf

Pega el siguiente código en el archivo.

## Turn on bbr ##
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
 
## for IPv4 ##
net.ipv4.ip_forward = 1
 
## Turn on basic protection/security ##
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1

## for IPv6 ##
net.ipv6.conf.all.forwarding = 1

Pulsa Ctrl + W para cerrar el archivo e introduce Y cuando se te pida guardar el archivo.

El alcance del código en el archivo anterior está fuera del alcance de este tutorial, así que por ahora, utilízalo tal cual.

Vuelve a cargar los cambios.

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

Por defecto, el cortafuegos no permite que las interfaces wg0 y eth0 se comuniquen entre sí. Así que tenemos que añadir la interfaz Wireguard a la red interna y activar el enmascaramiento.

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

Paso 7 – Habilitar e iniciar el servicio Wireguard

A continuación, tenemos que habilitar e iniciar el servicio Wireguard.

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

Puedes comprobar si la interfaz Wireguard, wg0 está activada y en funcionamiento utilizando el siguiente comando.

$ sudo wg
interface: wg0
  public key: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
  private key: (hidden)
  listening port: 37822

$ sudo ip a show wg0
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 192.168.10.1/24 scope global wg0
       valid_lft forever preferred_lft forever

Paso 8 – Instalar y Configurar el Cliente WireGuard

Puedes encontrar las instrucciones de instalación del cliente Wireguard para tu distribución Linux en su página oficial de instalación.

Una vez instalado el cliente, tienes que crear el archivo de configuración del cliente.

$ sudo mkdir /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'
$ sudo cat privatekey

Fíjate en la clave privada que obtienes al final. A continuación, tenemos que editar el archivo de configuración que acabamos de crear.

$ sudo nano /etc/wireguard/wg0.conf

Añade las siguientes directivas al archivo.

[Interface]
## client private key ##
PrivateKey = OEM6D/zt2fVWOepVv3iEDD430V0gAshKp4+5oVVt5EE=
 
## client ip address ##
Address = 192.168.10.2/24
 
[Peer]
## CentOS 8 server public key ##
PublicKey = VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
 
## set ACL ##
AllowedIPs = 192.168.10.0/24
 
## Your CentOS 8 server's public IPv4/IPv6 address and port ##
Endpoint = 203.1.114.98:37822
 
##  Key connection alive ##
PersistentKeepalive = 15

Observa que hemos asignado la IP privada 192.168.10.1 al servidor y 192.168.10.2 al cliente. También hemos añadido al archivo la clave privada del cliente.

La sección [Peer] es donde introduces la configuración del servidor al que se conectará el cliente. Aquí hemos añadido la clave pública, la IP pública y un conjunto de IPs permitidas que contiene la IP privada de nuestro servidor. PersistentKeepalive le dice a WireGuard que envíe un paquete UDP cada 15 segundos, esto es útil si estás detrás de un NAT y quieres mantener viva la conexión.

Pulsa Ctrl + W para cerrar el archivo e introduce Y cuando se te pida guardar el archivo.

Ahora es el momento de habilitar e iniciar el cliente VPN.

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

Paso 9 – Configurar el Servidor para Añadir el Cliente

Ahora tenemos que volver a añadir la configuración del cliente al servidor para que sepa que existe el cliente.

Detén primero el servicio Wireguard.

$ sudo systemctl stop wg-quick@wg0

Abre el archivo wg0.conf para editarlo.

$ sudo nano /etc/wireguard/wg0.conf

Añade el siguiente código al final del archivo.

[Peer] 
## client VPN public key ## 
PublicKey = dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=  

## client VPN IP address (note /32 subnet) ## 
AllowedIPs = 192.168.10.2/32

Pulsa Ctrl + W para cerrar el archivo e introduce Y cuando se te pida guardar el archivo.

Las secciones [Peer] definen los demás miembros de la red VPN. Puedes añadir tantos como necesites.

Contienen su clave pública, que debe coincidir con la clave privada del peer en su sección [Interface].

Ten en cuenta que cualquier conexión entrante se autentica primero con una de las claves públicas. Si la conexión no procede de un par verificado, los paquetes entrantes se ignoran silenciosamente. Dado que las conexiones procedentes de hosts que no poseen una clave privada coincidente no reciben respuesta alguna, una VPN WireGuard no sólo proporciona una comunicación encriptada, sino que también permanece oculta a los extraños.

Inicia de nuevo el servicio Wireguard.

$ sudo systemctl start wg-quick@wg0

Paso 10 – Prueba

Comprobemos si tanto el cliente como el servidor están conectados de forma segura utilizando la VPN. Para probar la conexión, ejecuta los siguientes comandos en tu cliente.

$ ping -c 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=44.2 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=45.8 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=46.7 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=44.1 ms

--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2800ms
rtt min/avg/max/mdev = 41.729/47.829/48.953/5.046 ms

$ sudo wg
interface: wg0
  public key: dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA= 
  private key: (hidden)
  listening port: 
 
peer: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
  endpoint: 203.1.114.98:37822
  allowed ips: 192.168.10.0/24
  latest handshake: 1 minute, 40 seconds ago
  transfer: 938 B received, 45.67 KiB sent
  persistent: keepalive: every 15 seconds

Conclusión

Esto es todo lo que hay en este tutorial. Ahora deberías tener un servidor VPN basado en Wireguard y en un servidor CentOS 8. Si tienes alguna pregunta, hazla en los comentarios de abajo.

También te podría gustar...