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.