Instalar y configurar WireGuard en CentOS 8

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.
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
- Generar clave privada/pública en el cliente.
- Copiar la clave pública al administrador del servidor (canal seguro).
- Añadir bloque [Peer] en /etc/wireguard/wg0.conf del servidor con AllowedIPs =
/32. - Añadir bloque [Peer] en el cliente con PublicKey del servidor y Endpoint.
- 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.
Materiales similares

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

Cambiar navegador predeterminado en Windows 11

Pool y espejo con Btrfs en Linux

CyanogenMod 12.1 en Lenovo A2010 — Guía

Animar textos y emojis en Mensajes de iPhone
