Wireguard

La mejor manera de instalar WireGuard en Ubuntu 24.04 es usando APT, ya que WireGuard está completamente integrado en el kernel de Linux moderno y sus paquetes están en los repos oficiales de Ubuntu.
Enlaces
https://www.server-world.info/en/note?os=Ubuntu_22.04&p=wireguard&f=1
✅ Instalación
1. Actualizar el sistema
sudo apt update && sudo apt upgrade -y
2. Instalar WireGuard y herramientas necesarias
sudo apt install wireguard wireguard-tools -y
Esto instala:
-
wg→ cliente de línea de comandos -
wg-quick→ herramienta de alto nivel para subir/bajar interfaces -
Módulo del kernel WireGuard (
wireguard.ko), ya incluido en 24.04
3. Habilitar IP forwarding (si actúa como gateway)
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
Diagrama
+------------------------+
| [ WireGuard Server ] |10.0.0.1 (VPN IP)
| tu_servidor.com +--------+
| |wg0 |
+-----------+------------+ |
eth0|192.168.1.201/24 |
| |
| Local Network |
+------+-----+ |
| Router_1 | |
+------+-----+ |
| |
Internet | Internet |
| |
+------+-----+ |
| Router_2 | |
+------+-----+ |
| Local Network |
| |
eth0|192.168.10.30/24 |
+-----------+------------+ |
| [ WireGuard Client ] |wg0 |
| +--------+
| |10.0.0.2 (VPN IP)
+------------------------+
A partir de aquí, usaremos usuario root para que los fichero se creen con los permisos adecuados
# con usuario root
sudo su
umask 077
Estructura final de los ficheros en el servidor:
/etc/wireguard/
├── wg0.conf # Config servidor
├── server.key # Clave privada servidor
├── server.pub # Clave pública servidor
├── client.key # Clave privada cliente
├── client.pub # Clave pública cliente
└── client.conf # Config cliente
4. Generar claves
# generate private key for server
wg genkey | tee /etc/wireguard/server.key
# generate public key for server
cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub
# generate private key for client
wg genkey | tee /etc/wireguard/client.key
# generate public key for client
cat /etc/wireguard/client.key | wg pubkey | tee /etc/wireguard/client.pub
5. Archivo de configuración
Servidor
Ubicación típica: /etc/wireguard/wg0.conf
[Interface]
PrivateKey = <clave_privada_servidor> # Contenido de /etc/wireguard/server.key
Address = 10.0.0.1 # IP_address for VPN interface
ListenPort = 51820 # UDP port WireGuard server listens
# Commands after WireGuard starts/stops.Set routing rules like follows to access to local network via VPN session
# [wg0] ⇒ VPN interface name
# [eth0] ⇒ Ethernet interface name
PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = echo 0 > /proc/sys/net/ipv4/ip_forward; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <clave_publica_cliente> # Contenido de /etc/wireguard/client.pub
# clients' VPN IP addresses you allow to connect
AllowedIPs = 10.0.0.0/24
Cliente
Ubicación típica: /etc/wireguard/client.conf
[Interface]
PrivateKey = <clave_privada_del_cliente> # Contenido de /etc/wireguard/client.key
Address = 10.0.0.2/24 # IP del cliente en la VPN
DNS = 1.1.1.1 # Opcional
[Peer]
PublicKey = <clave_pública_del_servidor> # Contenido de /etc/wireguard/server.pub
Endpoint = tu_servidor.com:51820 # IP o dominio del servidor + puerto
AllowedIPs = 0.0.0.0/0 # Enruta todo el tráfico por la VPN (o usa 10.0.0.0/24 para solo la red VPN)
PersistentKeepalive = 25 # Opcional: Mantiene la conexión activa tras NAT
6. Activar y habilitar la interfaz
sudo wg-quick up wg0 sudo systemctl enable wg-quick@wg0
Comandos
# interfaces activas y estadísticas
sudo wg show
# detalles específicos de una interfaz
sudo wg show wg0
# estado del servicio
sudo systemctl status wg-quick@wg0
# Reiniciar WireGuard d (para aplicar cambios en la configuración)
sudo systemctl restart wg-quick@wg0
# Monitorizar conexiones en tiempo real
sudo journalctl -u wg-quick@wg0 -f
QR para autoconfigurar los clientes Wireguard
Para generar un código QR que permita a los clientes de WireGuard (especialmente móviles) configurarse fácilmente, sigue estos pasos:
Instalar qrencode
sudo apt update && sudo apt install qrencode -y
Generar el código QR
qrencode -t ansiutf8 < /etc/wireguard/client.conf # Muestra el QR en la terminal (copiable)
Creación de clientes automática
script completo y automatizado para crear nuevos peers en WireGuard, incluyendo:
- Generación de claves pública/privada
- Creación del archivo de configuración del cliente (
.conf) - Actualización automática del servidor (
wg0.conf) - Generación de código QR (opcional)
#!/bin/bash
# Uso: ./crear_peer_wg.sh <nombre_del_peer> <ip_del_peer> [opcional: generar QR]
# --- Configuración (ajusta estas variables) ---
WG_DIR="/etc/wireguard"
SERVER_PUBKEY=$(cat "$WG_DIR/server.pub") # Clave pública del servidor
SERVER_ENDPOINT="tu-servidor.com:51820" # IP/Dominio + puerto del servidor
DNS="1.1.1.1" # DNS para el cliente
ALLOWED_IPS="0.0.0.0/0" # Redes accesibles a través del VPN
# --- Validación de argumentos ---
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Error: Faltan argumentos."
echo "Uso: $0 <nombre_del_peer> <ip_del_peer>"
echo "Ejemplo: $0 juan-laptop 10.0.0.2"
exit 1
fi
PEER_NAME="$1"
PEER_IP="$2"
PEER_PRIVKEY=$(wg genkey)
PEER_PUBKEY=$(echo "$PEER_PRIVKEY" | wg pubkey)
PEER_CONF="$WG_DIR/${PEER_NAME}.conf"
# --- Crear archivo de configuración del peer ---
cat > "$PEER_CONF" <<EOF
[Interface]
PrivateKey = $PEER_PRIVKEY
Address = $PEER_IP/24
DNS = $DNS
[Peer]
PublicKey = $SERVER_PUBKEY
Endpoint = $SERVER_ENDPOINT
AllowedIPs = $ALLOWED_IPS
PersistentKeepalive = 25
EOF
# --- Actualizar wg0.conf del servidor ---
cat >> "$WG_DIR/wg0.conf" <<EOF
# Peer: $PEER_NAME
[Peer]
PublicKey = $PEER_PUBKEY
AllowedIPs = $PEER_IP/32
EOF
# --- Generar QR (opcional) ---
if command -v qrencode &> /dev/null && [ -n "$3" ]; then
qrencode -t ansiutf8 < "$PEER_CONF"
echo "Código QR generado para $PEER_NAME"
fi
# --- Recargar WireGuard ---
wg syncconf wg0 <(wg-quick strip wg0)
# --- Resultados ---
echo "✔ Peer '$PEER_NAME' creado correctamente."
echo "Archivo de configuración: $PEER_CONF"
echo "Clave pública: $PEER_PUBKEY"
Cómo Usarlo
-
Guarda el script en
/usr/local/bin/crear_peer_wg.shy dale permisos:sudo chmod +x /usr/local/bin/crear_peer_wg.sh
-
Ejecútalo (como root):
sudo crear_peer_wg.sh juan-smartphone 10.0.0.2 qr # El último argumento genera QR
Failover Cluster
Requisitos
- 2 x Ubuntu 24.04 hosts con Wireguard (MASTER+BACKUP)
- Rsync instalado en el nodo MASTER
- Cluster Keepalived instalado.
- Acceso SSH sin contraseña MASTER->BACKUP (como root)
Script
Script para copiar el contenido del directorio /etc/wireguard desde un servidor MASTER a un BACKUP:
sudo vi /usr/local/bin/wg_backup.sh
#!/bin/bash
# Descripción: Copia /etc/wireguard desde MASTER a BACKUP vía rsync (requiere SSH sin password)
# Uso: Ejecutar como root en el MASTER
# Variables (ajusta según tu entorno)
BACKUP_USER="root"
BACKUP_SERVER="ip_del_backup" # Ej: 192.168.1.100
WG_DIR="/etc/wireguard"
LOG_FILE="/var/log/wg_backup.log"
# ---- Copia segura con rsync ----
echo "==== Iniciando copia el $(date) ====" >> "$LOG_FILE"
rsync -avz --delete \
-e "ssh -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa_wgbackup" \
"$WG_DIR/" "$BACKUP_USER@$BACKUP_SERVER:$WG_DIR/" >> "$LOG_FILE" 2>&1
# Verifica el resultado
if [ $? -eq 0 ]; then
echo "[OK] Copia completada exitosamente." >> "$LOG_FILE"
else
echo "[ERROR] Fallo en la copia. Revisa $LOG_FILE" >> "$LOG_FILE"
fi
Permisos del script
sudo chmod 700 /usr/local/bin/wg_backup.sh
sudo chown root:root /usr/local/bin/wg_backup.sh
Verificación y Monitoreo
Ejecuta estos comandos con root $ sudo su
-
Revisa el log de copia:
cat /var/log/wg_backup.log
-
Prueba el script manualmente:
/usr/local/bin/wg_backup.sh
Automatiza con cron
Configuración de Cron (Ejecución diaria a las 00:00)
-
Abre el cron de root:
sudo crontab -e -
Añade esta línea al final:
0 0 * * * /usr/local/bin/wg_backup.sh