Guía de tecnologías

Instalar y configurar WireGuard en CentOS 8

8 min read Linux VPN Actualizado 25 Sep 2025
WireGuard en CentOS 8: guía completa
WireGuard en CentOS 8: guía completa

WireGuard es un VPN moderno y ligero. Esta guía explica paso a paso cómo instalarlo en un servidor CentOS 8, configurar cortafuegos, activar el reenvío IPv4, añadir clientes y probar la conexión. Incluye listas de verificación, seguridad básica y solución de problemas para producción.

Vista frontal de equipo de red con cables y luces - ilustración de servidor y conectividad de red

Resumen rápido: instalamos EPEL y el repositorio de WireGuard, generamos claves, creamos la configuración del servidor y cliente, abrimos el puerto UDP, activamos el reenvío IP y validamos la conexión con ping y wg.

Qué es WireGuard

WireGuard es una implementación VPN multiplataforma de código abierto que usa criptografía moderna. Es más rápida, más simple y más fácil de auditar que IPSec y OpenVPN. Diseñada para uso general, funciona desde dispositivos embebidos hasta supercomputadoras y es compatible con Linux, Windows, macOS, iOS, Android y BSD.

Breve definición: WireGuard crea túneles seguros entre pares usando pares de claves públicas/privadas y paquetes UDP.

Importante: no inventamos números de rendimiento aquí; cada entorno tendrá latencias y rendimiento distintos según red y hardware.

Requisitos previos

  • Un servidor CentOS 8 con acceso root o sudo.
  • Un cliente Linux (CentOS/Fedora/Ubuntu) para pruebas.
  • Acceso a Internet y al puerto UDP que elijas (en el ejemplo usamos 37822).
  • Permisos para editar firewall (firewalld) y sysctl.

Paso 1 - Actualizar el sistema

Antes de continuar, actualiza el sistema para instalar las últimas actualizaciones.

$ sudo dnf update

Importante: ejecutar actualizaciones en máquinas de producción sin ventana de mantenimiento puede causar reinicios de servicios.

Paso 2 - Instalar y habilitar el repositorio EPEL

Los paquetes de WireGuard se encuentran en EPEL, así que habilítalo.

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

Nota: habilitamos PowerTools porque algunas dependencias de EPEL lo requieren.

Paso 3 - Instalar WireGuard

Habilita el repositorio de WireGuard y luego instala los paquetes.

$ sudo dnf copr enable jdoss/wireguard
$ sudo dnf install wireguard-dkms wireguard-tools

Este paso instala también el compilador GNU GCC necesario para construir módulos del kernel si procede.

Paso 4 - Configurar el servidor WireGuard

Crea el directorio de configuración y el archivo con permisos seguros.

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

Genera el par de claves del servidor (privada y pública).

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

Ver la clave privada (guárdala de forma segura):

$ sudo cat privatekey

Ahora edita el archivo de configuración del servidor:

$ sudo nano /etc/wireguard/wg0.conf

Añade el bloque siguiente (sustituye la clave privada por la tuya si corresponde):

[Interface]
## Dirección privada del servidor VPN ##
Address = 192.168.10.1/24
 
## Puerto del servidor VPN - puedes elegir otro puerto ##
ListenPort = 37822
 
## Clave privada del servidor, tal como /etc/wireguard/privatekey ##
PrivateKey = GCEXafeZKqSsuLfvuHE+zLzMYwoH4qQyBh7MZ4f/3kM=
 
## Guardar configuración activa al apagar ##
SaveConfig = true

Explicación rápida: la sección [Interface] define la identidad local (clave privada), el puerto UDP y las direcciones VPN del servidor. SaveConfig hace que wg-quick guarde la configuración al apagar.

Presiona Ctrl + W para cerrar en Nano y confirma con Y para guardar.

Paso 5 - Configurar el firewall (firewalld)

Debes abrir el puerto UDP elegido y definir el servicio para firewalld. Crea el archivo de servicio:

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

Pega esto (usa el mismo puerto que configuraste arriba):



  wireguard
  WireGuard open UDP port 37822 for client connections
  

Guarda y habilita el servicio en el firewall:

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

Activa el enmascaramiento (masquerade) para que el tráfico de 192.168.10.0/24 salga por la IP pública del servidor (ejemplo 203.1.114.98):

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

Recarga las reglas:

$ sudo firewall-cmd --reload

Lista las reglas actuales para confirmar:

$ 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: 

Nota: ajusta la zona, interfaces y servicios según la topología de tu servidor (por ejemplo, si usas ens3 en vez de eth0).

Paso 6 - Activar el reenvío IPv4 y ajustes de sysctl

Crea un archivo sysctl seguro:

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

Pega las siguientes opciones:

## 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

Aplica los cambios:

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

Añade la interfaz WireGuard a la zona interna y habilita el masquerade permanente para esa zona:

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

Explicación: net.ipv4.ip_forward = 1 permite que el servidor reenvíe tráfico entre interfaces (wg0 ↔ eth0) y el masquerade NATea las conexiones hacia Internet.

Paso 7 - Habilitar y arrancar el servicio WireGuard

Activa y arranca el servicio wg-quick para la interfaz wg0:

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

Verifica el estado de la interfaz y las claves:

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

$ sudo ip a show wg0
3: wg0:  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

Si ves la dirección 192.168.10.1/24 y el puerto de escucha correcto, la interfaz está arriba.

Paso 8 - Instalar y configurar cliente WireGuard (Linux)

Instala el cliente según tu distribución (consulta la página oficial de WireGuard). Luego crea la 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

Edita /etc/wireguard/wg0.conf en el cliente:

$ sudo nano /etc/wireguard/wg0.conf

Ejemplo de configuración del cliente (sustituye claves y endpoint por los tuyos):

[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=
 
## Allowed IPs (rutas que pasarán por el túnel) ##
AllowedIPs = 192.168.10.0/24
 
## IP pública y puerto del servidor ##
Endpoint = 203.1.114.98:37822
 
## Mantener conexión viva (útil detrás de NAT) ##
PersistentKeepalive = 15

Habilita y arranca el cliente:

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

Explicación: AllowedIPs define qué tráfico enviará el cliente por el túnel. PersistentKeepalive mantiene NATs abiertas.

Paso 9 - Añadir el cliente al servidor

El servidor debe conocer la clave pública del cliente para aceptarlo. Para ello, detén wg-quick temporalmente, añade el bloque [Peer] con la clave pública del cliente y reinicia.

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

Añade al final del archivo del servidor:

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

## client VPN IP address (usar /32 para un host) ##
AllowedIPs = 192.168.10.2/32

Guarda y vuelve a arrancar:

$ sudo systemctl start wg-quick@wg0

Explicación: Cada [Peer] en el servidor contiene la clave pública del cliente y las IPs permitidas; WireGuard filtra y autentica antes de responder.

Paso 10 - Pruebas básicas

En el cliente, prueba conectividad con ping al servidor VPN:

$ ping -c 4 192.168.10.1

Salida esperada (ejemplo):

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

Comprueba el estado local con wg para ver peer, handshake y transferencia:

$ 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

Si observas handshake reciente y transferencia, la conexión funciona.

Seguridad y endurecimiento básico

  • Protege las claves privadas: chmod 600 y propietario root.
  • Usa claves únicas por peer; no reutilices claves.
  • Mantén SaveConfig = true solo si confías en que los cambios locales deben persistir; de lo contrario, gestiona peers desde archivos fuente controlados.
  • Habilita autenticación y registro en el firewall para detectar intentos de conexión.
  • Considera usar certificados y monitoreo adicional si el VPN pasa tráfico sensible.

Nota: WireGuard en sí no maneja control de acceso avanzado (ACLs por usuario); combina reglas de firewall y listas de control en hosts según necesidad.

Privacidad y cumplimiento (GDPR y similares)

  • WireGuard cifra túneles y protege la confidencialidad en tránsito.
  • Si procesas datos personales, documenta el flujo de datos y la retención de logs (p. ej. transferencias y handshakes). Minimiza logs identificables.
  • Informar a usuarios sobre la finalidad del procesamiento y aplicar acuerdos de tratamiento si corresponde.

Importante: las obligaciones legales dependen de tu jurisdicción; consulta al responsable legal si manejas datos personales.

Listas de verificación (role-based)

Administrador del servidor:

  • Actualizar CentOS 8 y dependencias.
  • Instalar EPEL y repositorio de WireGuard.
  • Generar claves y configurar /etc/wireguard/wg0.conf.
  • Configurar firewalld y masquerade.
  • Habilitar sysctl y reenvío IP.
  • Habilitar y probar servicio wg-quick@wg0.
  • Revisar logs y monitorizar handshakes.

Usuario cliente:

  • Instalar cliente WireGuard.
  • Generar claves y crear /etc/wireguard/wg0.conf.
  • Añadir PublicKey del servidor y Endpoint.
  • Activar interfaz y probar ping.

Equipo de seguridad:

  • Revisar permisos de archivo y cifrado de claves.
  • Configurar alertas por tráfico inusual.
  • Revisar políticas de retención de logs.

Mini metodología para añadir nuevos peers

  1. Generar clave privada/pública en el cliente.
  2. Copiar la clave pública al administrador del servidor (canal seguro).
  3. Añadir bloque [Peer] en /etc/wireguard/wg0.conf del servidor con AllowedIPs = /32.
  4. Añadir bloque [Peer] en el cliente con PublicKey del servidor y Endpoint.
  5. Reiniciar o recargar wg-quick en ambos extremos y verificar handshake.

Casos de prueba y criterios de aceptación

Criterios de aceptación básicos:

  • El servidor levanta la interfaz wg0 y escucha en el puerto configurado.
  • El cliente hace handshake con el servidor y aparece en sudo wg con latest handshake reciente.
  • El cliente puede hacer ping a 192.168.10.1 y navegar según AllowedIPs.
  • El servidor NATea correctamente el tráfico saliente del rango 192.168.10.0/24.

Pruebas:

  • Ping a 192.168.10.1 desde el cliente.
  • tcpdump -i wg0 para verificar paquetes UDP y handshakes en tiempo real.
  • Conexión a un recurso interno (si existe) para confirmar ruteo.

Solución de problemas comunes

Problema: no hay handshake

  • Verifica que el puerto UDP esté abierto en el firewall y accesible desde el cliente.
  • Comprueba que las claves públicas/privadas coincidan y no estén truncadas.
  • Revisa que Endpoint esté apuntando a la IP pública correcta y puerto.

Problema: ping falla pero wg muestra peers

  • Verifica AllowedIPs en cliente y servidor; debe incluir la ruta correcta.
  • Revisa ip_forward y reglas de masquerade en el servidor.
  • Asegúrate de que las reglas del firewall permitan forwarding entre interfaces.

Problema: cliente detrás de NAT pierde conexión

  • Aumenta PersistentKeepalive a 25 si el NAT es agresivo.
  • Revisa tiempos de espera en el router/NAT.

Rollback / Desactivación rápida

Si necesitas desactivar la VPN rápidamente en el servidor:

$ sudo systemctl stop wg-quick@wg0
$ sudo firewall-cmd --remove-service=wireguard --permanent
$ sudo firewall-cmd --reload

Y en clientes:

$ sudo systemctl stop wg-quick@wg0
$ sudo systemctl disable wg-quick@wg0

Diagramas de flujo (decisión rápida)

flowchart TD
  A[¿Necesitas un túnel VPN simple y rápido?] -->|Sí| B[Usar WireGuard]
  B --> C{¿Hay NAT en cliente?}
  C -->|Sí| D[Configurar PersistentKeepalive >= 15]
  C -->|No| E[Configurar Endpoint directo]
  D --> F[Agregar Peer en servidor]
  E --> F
  F --> G[Probar handshake y ping]
  G --> H{¿Funciona?}
  H -->|Sí| I[Producción]
  H -->|No| J[Revisar firewall, claves y AllowedIPs]

Cuadro de datos clave

  • Puerto UDP de ejemplo: 37822
  • Rango interno de ejemplo: 192.168.10.0/24
  • Dirección servidor en VPN: 192.168.10.1
  • Dirección cliente en VPN: 192.168.10.2
  • PersistentKeepalive recomendado: 15 segundos

Comparativa rápida con otras soluciones

  • WireGuard vs OpenVPN: WireGuard es más simple, menor huella de código y suele ofrecer mejor rendimiento; OpenVPN tiene más opciones de configuración avanzadas y compatibilidad con túneles TLS.
  • WireGuard vs IPSec: IPSec es estándar en ambientes corporativos y hardware; WireGuard es más moderno y fácil de auditar.

Notas finales

Esta guía cubre una implementación básica en CentOS 8. Para entornos productivos añade monitorización, copias seguras de claves, políticas de rotación y pruebas de recuperación. Si tienes preguntas sobre adaptaciones (múltiples peers, subredes, ruteo avanzado), comenta con detalles de tu topología.

Resumen final:

  • WireGuard es ligero y rápido; ideal para reemplazar soluciones legacy en muchos casos.
  • Configura correctamente firewall, sysctl y claves.
  • Usa listas de verificación y pruebas antes de mover a producción.

Importante: mantén siempre copias seguras de tus claves privadas y limita su acceso a root.

Autor
Edición

Materiales similares

Podman en Debian 11: instalación y uso
DevOps

Podman en Debian 11: instalación y uso

Apt-pinning en Debian: guía práctica
Sistemas

Apt-pinning en Debian: guía práctica

OptiScaler: inyectar FSR 4 en casi cualquier juego
Guía técnica

OptiScaler: inyectar FSR 4 en casi cualquier juego

Dansguardian + Squid NTLM en Debian Etch
Redes

Dansguardian + Squid NTLM en Debian Etch

Arreglar error de instalación Android en SD
Android

Arreglar error de instalación Android en SD

Conectar carpetas de red con KNetAttach
Redes

Conectar carpetas de red con KNetAttach