WireGuard es el protocolo VPN que debería haber existido desde el principio. Es rápido (más que OpenVPN e IPsec), simple (un archivo de configuración de 10 líneas), seguro (criptografía moderna sin opciones inseguras) y está integrado en el kernel de Linux desde la versión 5.6. Si necesitas conectar tu equipo de forma segura a tus servidores, WireGuard es la respuesta.
En esta guía vas a tener un servidor VPN funcionando en menos de 10 minutos.
Requisitos previos
Un servidor Ubuntu 24.04 con IP pública y acceso root. Tu firewall UFW debe permitir el puerto UDP que elijas para WireGuard.
Paso 1: Instalar WireGuard
sudo apt update
sudo apt install wireguard -y
WireGuard ya está en los repositorios oficiales de Ubuntu 24.04. Verifica:
sudo modprobe wireguard
lsmod | grep wireguard
Paso 2: Generar llaves del servidor
WireGuard usa criptografía de llave pública — cada peer (servidor y cada cliente) tiene un par de llaves:
# Generar llaves del servidor
wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
# Proteger la llave privada
sudo chmod 600 /etc/wireguard/server_private.key
Guarda las llaves — las necesitarás en la configuración:
echo "Privada: $(sudo cat /etc/wireguard/server_private.key)"
echo "Pública: $(sudo cat /etc/wireguard/server_public.key)"
Paso 3: Configurar el servidor
Crea el archivo de configuración de la interfaz WireGuard:
sudo tee /etc/wireguard/wg0.conf > /dev/null <<EOF
[Interface]
# Llave privada del servidor
PrivateKey = $(sudo cat /etc/wireguard/server_private.key)
# IP del servidor dentro del túnel VPN
Address = 10.10.0.1/24
# Puerto UDP donde escucha WireGuard
ListenPort = 51820
# Reglas para enrutar tráfico de los clientes a internet
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF
Interfaz de red
Cambia eth0 por el nombre de tu interfaz de red principal. Puedes verificarlo con ip route | grep default. En muchos servidores cloud es ens3, ens5 o enp0s3.
Habilita el reenvío de paquetes IP (necesario para que los clientes puedan acceder a internet o a otras redes a través del servidor):
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Paso 4: Abrir el puerto en el firewall
sudo ufw allow 51820/udp comment 'WireGuard VPN'
Paso 5: Arrancar WireGuard
# Levantar la interfaz
sudo systemctl enable --now wg-quick@wg0
# Verificar estado
sudo wg show
Deberías ver la interfaz wg0 con la llave pública del servidor y el puerto de escucha.
Paso 6: Agregar un cliente
Para cada cliente que quieras conectar, necesitas generar un par de llaves y agregar su configuración al servidor.
Generar llaves del cliente
# En el servidor (o en cualquier máquina con wg)
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
Agregar el peer al servidor
sudo tee -a /etc/wireguard/wg0.conf > /dev/null <<EOF
[Peer]
# Cliente: laptop-juan
PublicKey = $(cat client1_public.key)
AllowedIPs = 10.10.0.2/32
EOF
Recarga la configuración sin desconectar clientes existentes:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
Crear la configuración del cliente
Este archivo se copia al dispositivo del usuario:
cat > client1.conf <<EOF
[Interface]
PrivateKey = $(cat client1_private.key)
Address = 10.10.0.2/24
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = $(sudo cat /etc/wireguard/server_public.key)
Endpoint = TU_IP_PUBLICA:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
AllowedIPs = 0.0.0.0/0 enruta TODO el tráfico del cliente por la VPN (full tunnel). Si solo quieres que el tráfico hacia tu red interna pase por la VPN (split tunnel), cámbialo por la subred específica:
AllowedIPs = 10.10.0.0/24, 10.0.1.0/24
Generar código QR para móviles
Para conectar desde el celular, genera un QR que la app de WireGuard puede escanear:
sudo apt install qrencode -y
qrencode -t ansiutf8 < client1.conf
Seguridad de las llaves
La llave privada del cliente es como una contraseña. Envíala por un canal seguro (no por correo sin cifrar) y borra los archivos de llaves del servidor después de entregar la configuración al usuario.
Paso 7: Conectar el cliente
Linux
sudo apt install wireguard -y
sudo cp client1.conf /etc/wireguard/wg0.conf
sudo wg-quick up wg0
Verifica la conexión:
# Ver estado de WireGuard
sudo wg show
# Ping al servidor dentro del túnel
ping 10.10.0.1
# Verificar que tu IP pública cambió (si usas full tunnel)
curl ifconfig.me
macOS y Windows
Descarga la app oficial de WireGuard, importa el archivo client1.conf y activa el túnel.
iOS y Android
Descarga la app WireGuard desde la App Store o Play Store, escanea el código QR y activa.
Agregar más clientes
Para cada cliente nuevo, repite el proceso:
- Generar par de llaves
- Agregar
[Peer]al archivo del servidor con una IP diferente (10.10.0.3/32,10.10.0.4/32, etc.) - Recargar con
wg syncconf - Crear el archivo de configuración del cliente
Script para automatizar
#!/bin/bash
# add-client.sh — Agrega un nuevo cliente WireGuard
# Uso: sudo ./add-client.sh nombre-del-cliente 10.10.0.X
CLIENT_NAME=$1
CLIENT_IP=$2
SERVER_PUBKEY=$(sudo cat /etc/wireguard/server_public.key)
SERVER_ENDPOINT="TU_IP_PUBLICA:51820"
# Generar llaves
wg genkey | tee "/etc/wireguard/clients/${CLIENT_NAME}_private.key" \
| wg pubkey > "/etc/wireguard/clients/${CLIENT_NAME}_public.key"
CLIENT_PRIVKEY=$(cat "/etc/wireguard/clients/${CLIENT_NAME}_private.key")
CLIENT_PUBKEY=$(cat "/etc/wireguard/clients/${CLIENT_NAME}_public.key")
# Agregar peer al servidor
cat >> /etc/wireguard/wg0.conf <<EOF
[Peer]
# ${CLIENT_NAME}
PublicKey = ${CLIENT_PUBKEY}
AllowedIPs = ${CLIENT_IP}/32
EOF
# Recargar
wg syncconf wg0 <(wg-quick strip wg0)
# Generar config del cliente
cat > "/etc/wireguard/clients/${CLIENT_NAME}.conf" <<EOF
[Interface]
PrivateKey = ${CLIENT_PRIVKEY}
Address = ${CLIENT_IP}/24
DNS = 1.1.1.1
[Peer]
PublicKey = ${SERVER_PUBKEY}
Endpoint = ${SERVER_ENDPOINT}
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOF
echo "Cliente ${CLIENT_NAME} creado. Config en /etc/wireguard/clients/${CLIENT_NAME}.conf"
qrencode -t ansiutf8 < "/etc/wireguard/clients/${CLIENT_NAME}.conf"
VPN sitio a sitio (conectar dos redes)
WireGuard también sirve para conectar dos redes — por ejemplo, la oficina con el centro de datos o con un cloud:
Oficina (10.0.1.0/24) ◄──WireGuard──► Datacenter (10.0.2.0/24)
La configuración es similar, pero en AllowedIPs de cada peer pones la subred del otro lado. Ambos lados pueden iniciar tráfico — ideal para que los usuarios de la oficina accedan a los servidores del datacenter y viceversa.
Siguientes pasos
Con WireGuard corriendo, puedes mejorar la configuración:
- DNS privado — configura un servidor DNS dentro de la VPN (Pi-hole o Unbound) para resolver nombres internos
- Monitoreo — agrega métricas de WireGuard a Prometheus y Grafana con
wireguard_exporter - Alta disponibilidad — dos servidores WireGuard con failover DNS para que la VPN no tenga punto único de falla
- Redes empresariales — diseño de VPN multi-sitio con segmentación y políticas de acceso por grupo
Conectividad segura
¿Necesitas conectar sucursales o equipos remotos de forma segura?
Diseñamos e implementamos VPN con WireGuard para conectar tus ubicaciones con seguridad, rendimiento y simplicidad.



