WireGuard es un protocolo VPN moderno y de alto rendimiento que se ha convertido rápidamente en la opción preferida para administradores de sistemas y profesionales de seguridad. Integrado directamente en el kernel de Linux desde la versión 5.6, WireGuard ofrece una configuración dramáticamente más simple, una superficie de ataque más pequeña y un rendimiento superior en comparación con soluciones VPN tradicionales como OpenVPN e IPsec/IKEv2.
Esta guía te lleva a través de la configuración de un servidor VPN WireGuard en Ubuntu, la configuración de clientes para Linux, Windows, macOS y dispositivos móviles, y la protección de toda la configuración con reglas de firewall adecuadas.
Requisitos Previos
Antes de comenzar, asegúrate de tener:
- Un servidor Ubuntu (22.04 o 24.04) con una dirección IP pública
- Acceso root o sudo al servidor
- Acceso a la terminal vía SSH
- Un dispositivo cliente (Linux, Windows, macOS, iOS o Android)
- Comprensión básica de conceptos de redes (direcciones IP, subredes, puertos)
¿Por Qué WireGuard Sobre OpenVPN o IPsec?
Antes de entrar en la configuración, aquí está por qué WireGuard se ha convertido en el protocolo VPN de referencia:
| Característica | WireGuard | OpenVPN | IPsec/IKEv2 |
|---|---|---|---|
| Tamaño del código | ~4,000 líneas | ~100,000+ líneas | ~400,000+ líneas |
| Cifrado | Moderno (ChaCha20, Curve25519) | Configurable (puede ser mal configurado) | Configurable |
| Rendimiento | Casi velocidad de cable | Bueno, pero mayor sobrecarga | Bueno |
| Configuración | Simple, mínima | Archivos XML/conf complejos | Muy compleja |
| Integración con kernel | Integrado en el kernel de Linux | Espacio de usuario | Kernel (varía) |
| Soporte de roaming | Excelente (transparente) | Requiere reconexión | Depende del protocolo |
| Velocidad de conexión | Casi instantánea | Segundos para establecer | Segundos para establecer |
El pequeño código base de WireGuard lo hace significativamente más fácil de auditar en busca de vulnerabilidades de seguridad. Su uso de primitivas criptográficas modernas significa que no hay vulnerabilidades de negociación de cifrado, y su implementación en espacio de kernel ofrece un rendimiento que el enfoque de espacio de usuario de OpenVPN no puede igualar.
Paso 1: Instalar WireGuard
WireGuard está disponible en los repositorios predeterminados de Ubuntu. Instálalo junto con las herramientas necesarias:
sudo apt update
sudo apt install -y wireguard wireguard-tools
Verifica la instalación:
wg --version
Asegúrate de que el módulo del kernel de WireGuard esté cargado:
sudo modprobe wireguard
lsmod | grep wireguard
Paso 2: Generar las Claves del Servidor
WireGuard utiliza criptografía de clave pública. Cada par (servidor y cliente) necesita su propio par de claves privada y pública.
Crea un directorio para las claves con permisos restrictivos y genera el par de claves del servidor:
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
Restringe los permisos del archivo de clave privada:
sudo chmod 600 /etc/wireguard/server_private.key
Visualiza las claves (las necesitarás para la configuración):
sudo cat /etc/wireguard/server_private.key
sudo cat /etc/wireguard/server_public.key
Advertencia de Seguridad: La clave privada nunca debe ser compartida ni transmitida por canales inseguros. Trátala como una contraseña. Si se ve comprometida, genera un nuevo par de claves inmediatamente.
Paso 3: Configurar el Servidor WireGuard
Crea el archivo de configuración de la interfaz WireGuard:
sudo nano /etc/wireguard/wg0.conf
Añade la siguiente configuración, reemplazando los valores de ejemplo:
[Interface]
# La clave privada del servidor (de server_private.key)
PrivateKey = <SERVER_PRIVATE_KEY>
# Subred VPN - el servidor obtiene .1
Address = 10.0.0.1/24
# Puerto UDP en el que WireGuard escuchará
ListenPort = 51820
# Reglas NAT - aplicadas cuando la interfaz se activa/desactiva
# Reemplaza eth0 con el nombre real de tu interfaz de red
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
# Las configuraciones de pares se añadirán abajo
Consejo: Para encontrar el nombre de la interfaz de red principal de tu servidor, ejecuta
ip route show default. La interfaz aparece después dedev, típicamenteeth0,ens3,enp0s3o similar.
Establece permisos restrictivos en el archivo de configuración:
sudo chmod 600 /etc/wireguard/wg0.conf
Paso 4: Habilitar el Reenvío de IP
Para que el servidor VPN enrute tráfico entre los clientes e internet, el reenvío de IP debe estar habilitado:
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf
Verifica la configuración:
sysctl net.ipv4.ip_forward
La salida debería mostrar net.ipv4.ip_forward = 1.
Paso 5: Configurar el Firewall (UFW)
Si estás usando UFW (Uncomplicated Firewall), permite el puerto de WireGuard y SSH:
# Permitir tráfico WireGuard
sudo ufw allow 51820/udp
# Asegurar que SSH esté permitido (para no quedarte bloqueado)
sudo ufw allow OpenSSH
# Habilitar UFW si no está habilitado aún
sudo ufw enable
# Verificar las reglas
sudo ufw status verbose
También necesitas permitir el tráfico reenviado en UFW. Edita la configuración de UFW:
sudo nano /etc/ufw/before.rules
Añade las siguientes líneas antes de la sección *filter al inicio del archivo:
# Reglas de tabla NAT para WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
Luego edita la política de reenvío predeterminada de UFW:
sudo nano /etc/default/ufw
Cambia DEFAULT_FORWARD_POLICY de DROP a ACCEPT:
DEFAULT_FORWARD_POLICY="ACCEPT"
Recarga UFW:
sudo ufw reload
Para más información sobre cómo asegurar el acceso SSH de tu servidor, consulta nuestros artículos sobre almacenar claves públicas SSH y resolver problemas de permisos SSH.
Paso 6: Generar Claves de Cliente y Añadir un Par
Para cada cliente que se conectará a la VPN, genera un par de claves:
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
También puedes generar una clave pre-compartida para una capa adicional de cifrado simétrico:
wg genpsk > client1_preshared.key
Ahora añade el cliente como par en la configuración del servidor. Edita /etc/wireguard/wg0.conf y añade:
[Peer]
# Cliente 1
PublicKey = <CLIENT1_PUBLIC_KEY>
PresharedKey = <CLIENT1_PRESHARED_KEY>
AllowedIPs = 10.0.0.2/32
El campo AllowedIPs especifica qué direcciones IP este par tiene permitido usar. Para un solo cliente, usa /32 (un único host).
Paso 7: Iniciar el Servicio WireGuard
Inicia la interfaz WireGuard y habilítala para que se inicie al arranque:
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
Verifica que la interfaz esté funcionando:
sudo wg show
Deberías ver los detalles de la interfaz, el puerto de escucha y los pares configurados. Para verificar la dirección IP de la interfaz:
ip addr show wg0
Configuración del Cliente
Cliente Linux
Instala WireGuard en la máquina cliente:
sudo apt install -y wireguard
Crea el archivo de configuración del cliente:
sudo nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <CLIENT1_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <CLIENT1_PRESHARED_KEY>
Endpoint = <SERVER_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Explicación de la configuración:
- Address: La IP del cliente dentro de la subred VPN
- DNS: Servidores DNS a usar cuando la VPN está activa
- Endpoint: La IP pública del servidor y el puerto de WireGuard
- AllowedIPs:
0.0.0.0/0, ::/0enruta TODO el tráfico a través de la VPN (túnel completo). Usa10.0.0.0/24para túnel dividido (solo el tráfico de la subred VPN pasa por el túnel) - PersistentKeepalive: Envía un paquete keepalive cada 25 segundos, lo cual es esencial para clientes detrás de NAT
Inicia la conexión VPN:
sudo wg-quick up wg0
Para desconectar:
sudo wg-quick down wg0
Para habilitar la conexión automática al arranque:
sudo systemctl enable wg-quick@wg0
Cliente Windows
- Descarga el cliente oficial de WireGuard desde wireguard.com/install
- Instala y abre la aplicación
- Haz clic en Add Tunnel luego Add empty tunnel (o importa un archivo
.conf) - Pega la misma configuración del cliente Linux anterior
- Haz clic en Save y luego Activate
Cliente macOS
- Instala WireGuard desde la Mac App Store o vía Homebrew:
brew install wireguard-tools
- Para la aplicación con interfaz gráfica, descárgala desde la Mac App Store
- Haz clic en Import tunnel(s) from file y selecciona tu archivo
.conf, o crea la configuración manualmente - Activa el túnel desde la aplicación o el icono en la barra de menú
Para uso por línea de comandos en macOS:
sudo wg-quick up /path/to/wg0.conf
iOS y Android (Dispositivos Móviles)
- Instala la aplicación WireGuard desde la App Store (iOS) o Google Play Store (Android)
- Puedes ingresar la configuración manualmente o escanear un código QR
Generar un Código QR para Móviles
Este es el método más conveniente para la configuración móvil. En el servidor, instala qrencode:
sudo apt install -y qrencode
Crea un archivo de configuración temporal para el cliente:
cat << 'EOF' > /tmp/client1-mobile.conf
[Interface]
PrivateKey = <CLIENT1_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <CLIENT1_PRESHARED_KEY>
Endpoint = <SERVER_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
Genera y muestra el código QR en la terminal:
qrencode -t ansiutf8 < /tmp/client1-mobile.conf
Abre la aplicación WireGuard en tu teléfono, toca el botón +, selecciona Create from QR code y escanea el código mostrado en tu terminal.
Consejo de Seguridad: Elimina el archivo de configuración temporal inmediatamente después de escanear:
rm -f /tmp/client1-mobile.conf
Probar la Conexión VPN
Después de conectar un cliente, verifica que la VPN esté funcionando correctamente.
En el cliente, verifica tu IP VPN e IP pública:
# Verificar la interfaz WireGuard
sudo wg show
# Verificar que tienes la IP VPN
ip addr show wg0
# Verificar tu IP pública (debería mostrar la IP del servidor si usas túnel completo)
curl -s https://ifconfig.me
# Probar conectividad con la IP VPN del servidor
ping 10.0.0.1
En el servidor, verifica que el par esté conectado:
sudo wg show
Deberías ver una marca de tiempo de latest handshake y datos de transfer para el par conectado. Si estos valores se están actualizando, el túnel está activo y pasando tráfico.
Añadir Más Clientes
Para añadir clientes adicionales, repite el proceso de generación de claves con claves y direcciones IP únicas:
# Generar claves para el cliente 2
wg genkey | tee client2_private.key | wg pubkey > client2_public.key
wg genpsk > client2_preshared.key
Añade el nuevo par a la configuración del servidor. Puedes hacer esto sin reiniciar el servicio:
sudo wg set wg0 peer <CLIENT2_PUBLIC_KEY> preshared-key client2_preshared.key allowed-ips 10.0.0.3/32
Para hacer el cambio persistente, también añade el bloque [Peer] a /etc/wireguard/wg0.conf.
Solución de Problemas
El Handshake No Se Completa
Si sudo wg show nunca muestra un latest handshake para un par:
- Verifica las reglas del firewall: Asegúrate de que el puerto UDP 51820 esté abierto en el servidor
- Verifica las claves: La sección de pares del servidor debe tener la clave pública del cliente, y viceversa
- Verifica el endpoint: El cliente debe poder alcanzar la IP pública del servidor en el puerto 51820
- Prueba la conectividad UDP:
nc -u -z <SERVER_IP> 51820
El Tráfico No Se Enruta a Través de la VPN
Si el handshake se completa pero el tráfico de internet no fluye a través de la VPN:
- Verifica que el reenvío de IP esté habilitado:
sysctl net.ipv4.ip_forward - Verifica las reglas NAT:
sudo iptables -t nat -L POSTROUTING - Verifica que la interfaz de red correcta en las reglas PostUp/PostDown coincida con la interfaz real de tu servidor
Fugas de DNS
Si las consultas DNS no pasan por la VPN:
- Asegúrate de que la línea
DNSesté presente en la configuración del cliente - En clientes Linux, puede que necesites configurar
systemd-resolved:
sudo resolvectl dns wg0 1.1.1.1 8.8.8.8
Caídas de Conexión Detrás de NAT
Si la conexión VPN se cae después de un período de inactividad, asegúrate de que PersistentKeepalive = 25 esté configurado en la sección [Peer] del cliente. Esto envía un paquete keepalive cada 25 segundos para mantener el mapeo NAT.
Revocar un Cliente
Para eliminar el acceso de un cliente, elimina su par del servidor:
sudo wg set wg0 peer <CLIENT_PUBLIC_KEY> remove
También elimina el bloque [Peer] correspondiente de /etc/wireguard/wg0.conf para hacer el cambio persistente.
Conclusión
WireGuard proporciona una solución VPN rápida, moderna y segura que es notablemente fácil de configurar en comparación con sus predecesores. Con su integración a nivel de kernel, configuración mínima y criptografía de última generación, es una excelente opción tanto para uso personal como para despliegues empresariales.
Para una configuración de servidor más segura en general, considera también revisar tu configuración SSH. Consulta nuestras guías sobre añadir claves SSH a otra máquina y gestionar conexiones SSH. Para configuraciones de red avanzadas en Ubuntu, consulta nuestro artículo sobre asignar múltiples direcciones IP a una sola interfaz.