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

Arreglar Instagram en Windows 11 — Guía rápida
Soporte técnico

Arreglar Instagram en Windows 11 — Guía rápida

Cambiar navegador predeterminado en Windows 11
Windows

Cambiar navegador predeterminado en Windows 11

Pool y espejo con Btrfs en Linux
Almacenamiento

Pool y espejo con Btrfs en Linux

CyanogenMod 12.1 en Lenovo A2010 — Guía
Android ROM

CyanogenMod 12.1 en Lenovo A2010 — Guía

Animar textos y emojis en Mensajes de iPhone
iPhone

Animar textos y emojis en Mensajes de iPhone

PWAs en Firefox: Agregar a la barra de tareas
Navegadores

PWAs en Firefox: Agregar a la barra de tareas