Configuración de Red Mesh con WireGuard
WireGuard permite construir redes mesh privadas entre múltiples servidores Linux con mínima configuración, alto rendimiento y cifrado moderno de estado del arte. Esta guía cubre la creación de una red mesh completa con WireGuard, incluyendo la configuración de peers, tablas de enrutamiento, resolución DNS, scripts de auto-configuración y monitorización.
Requisitos Previos
- Ubuntu 20.04+ o Debian 11+ en todos los nodos (kernel 5.6+ para WireGuard nativo)
- Acceso root en todos los servidores
- Puertos UDP accesibles entre nodos (por defecto 51820)
- IPs públicas o acceso directo entre todos los nodos (para mesh completo)
Instalación de WireGuard
# Ubuntu 20.04+ (WireGuard incluido en el kernel desde 5.6)
apt update
apt install -y wireguard wireguard-tools
# En CentOS/Rocky Linux
dnf install -y epel-release
dnf install -y wireguard-tools
# Verificar la instalación
wg --version
modprobe wireguard
lsmod | grep wireguard
Generación de Claves
Cada nodo en la mesh necesita su propio par de claves:
# En cada nodo, generar las claves en el directorio de WireGuard
cd /etc/wireguard
# Generar la clave privada con permisos restrictivos
wg genkey | tee privatekey | wg pubkey > publickey
chmod 600 privatekey
# Ver la clave pública (se comparte con todos los peers)
cat /etc/wireguard/publickey
# Tabla de ejemplo con las claves públicas de todos los nodos:
# nodo1: A1B2C3D4E5F6... (IP pública: 203.0.113.10)
# nodo2: G7H8I9J0K1L2... (IP pública: 203.0.113.20)
# nodo3: M3N4O5P6Q7R8... (IP pública: 203.0.113.30)
Topología de la Red Mesh
En una red mesh completa, cada nodo es peer de todos los demás:
nodo1 (10.8.0.1)
/ \
/ \
nodo2 (10.8.0.2) --- nodo3 (10.8.0.3)
Planificación de direcciones:
- Red VPN mesh:
10.8.0.0/24 - Nodo 1: IP pública
203.0.113.10, IP mesh10.8.0.1 - Nodo 2: IP pública
203.0.113.20, IP mesh10.8.0.2 - Nodo 3: IP pública
203.0.113.30, IP mesh10.8.0.3
Configuración de los Nodos
Configuración del Nodo 1 (/etc/wireguard/wg0.conf):
[Interface]
# IP de este nodo en la red mesh
Address = 10.8.0.1/24
# Puerto en el que este nodo escucha conexiones WireGuard
ListenPort = 51820
# Clave privada de este nodo
PrivateKey = <CLAVE_PRIVADA_NODO1>
# Habilitar el reenvío IP al levantar la interfaz
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0
# ---- Peer: Nodo 2 ----
[Peer]
# Clave pública del nodo 2
PublicKey = <CLAVE_PUBLICA_NODO2>
# IP de destino y puerto del nodo 2 (IP pública o privada accesible)
Endpoint = 203.0.113.20:51820
# Rutas que se alcanzan a través de este peer
AllowedIPs = 10.8.0.2/32
# Keepalive para mantener la sesión a través de NAT
PersistentKeepalive = 25
# ---- Peer: Nodo 3 ----
[Peer]
PublicKey = <CLAVE_PUBLICA_NODO3>
Endpoint = 203.0.113.30:51820
AllowedIPs = 10.8.0.3/32
PersistentKeepalive = 25
Configuración del Nodo 2 (/etc/wireguard/wg0.conf):
[Interface]
Address = 10.8.0.2/24
ListenPort = 51820
PrivateKey = <CLAVE_PRIVADA_NODO2>
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0
[Peer]
# Peer: Nodo 1
PublicKey = <CLAVE_PUBLICA_NODO1>
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.1/32
PersistentKeepalive = 25
[Peer]
# Peer: Nodo 3
PublicKey = <CLAVE_PUBLICA_NODO3>
Endpoint = 203.0.113.30:51820
AllowedIPs = 10.8.0.3/32
PersistentKeepalive = 25
# Activar WireGuard en todos los nodos
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
# Verificar el estado
wg show
# Verificar la conectividad mesh
ping 10.8.0.2 -c 3 # Desde nodo 1 hacia nodo 2
ping 10.8.0.3 -c 3 # Desde nodo 1 hacia nodo 3
Tablas de Enrutamiento
Para enrutar subredes privadas a través de la mesh (no solo IPs de la VPN):
# En nodo 2, si quiere compartir su red LAN 172.16.0.0/24 con todos
[Interface]
Address = 10.8.0.2/24
ListenPort = 51820
PrivateKey = <CLAVE_PRIVADA_NODO2>
# Añadir rutas al levantar la interfaz
PostUp = ip route add 172.16.0.0/24 dev wg0
[Peer]
# En los otros nodos, la entrada para nodo 2 debe incluir la red LAN
PublicKey = <CLAVE_PUBLICA_NODO2>
Endpoint = 203.0.113.20:51820
# Permite alcanzar tanto la IP de mesh como la red LAN del nodo 2
AllowedIPs = 10.8.0.2/32, 172.16.0.0/24
PersistentKeepalive = 25
Configurar rutas persistentes:
# Verificar las rutas de WireGuard
ip route show | grep wg0
# Añadir una ruta estática que persista entre reinicios
# (incluida en PostUp del [Interface])
# PostUp = ip route add 172.16.0.0/24 via 10.8.0.2 dev wg0
# Ver la tabla de enrutamiento completa
ip route show table all | grep wg0
Resolución DNS en la Mesh
# Opción 1: Añadir entradas al /etc/hosts en cada nodo
cat << 'EOF' >> /etc/hosts
# Red mesh WireGuard
10.8.0.1 nodo1.mesh nodo1
10.8.0.2 nodo2.mesh nodo2
10.8.0.3 nodo3.mesh nodo3
EOF
# Opción 2: Servidor DNS interno con dnsmasq (en nodo1)
apt install -y dnsmasq
cat << 'EOF' > /etc/dnsmasq.d/mesh.conf
# Escuchar en la interfaz WireGuard
interface=wg0
bind-interfaces
# Registros DNS para los nodos de la mesh
address=/nodo1.mesh/10.8.0.1
address=/nodo2.mesh/10.8.0.2
address=/nodo3.mesh/10.8.0.3
# Zona de dominio de la mesh
domain=mesh
local=/mesh/
EOF
systemctl restart dnsmasq
# En el resto de nodos, usar nodo1 como servidor DNS de la mesh
# Añadir al /etc/wireguard/wg0.conf:
# DNS = 10.8.0.1
Scripts de Auto-Configuración
# Script para generar automáticamente la configuración de un nuevo nodo
cat << 'EOF' > /usr/local/bin/wg-mesh-add-node.sh
#!/bin/bash
# Generador de configuración de nodo WireGuard para la mesh
NODO_NOMBRE=${1}
NODO_IP_PUBLICA=${2}
NODO_IP_MESH=${3}
RANGO_MESH="10.8.0.0/24"
if [ -z "$NODO_NOMBRE" ] || [ -z "$NODO_IP_PUBLICA" ] || [ -z "$NODO_IP_MESH" ]; then
echo "Uso: $0 <nombre> <ip_publica> <ip_mesh>"
echo "Ejemplo: $0 nodo4 203.0.113.40 10.8.0.4"
exit 1
fi
# Crear directorio de trabajo
DIRECTORIO="/tmp/wg-${NODO_NOMBRE}"
mkdir -p $DIRECTORIO
# Generar par de claves
wg genkey | tee ${DIRECTORIO}/privatekey | wg pubkey > ${DIRECTORIO}/publickey
chmod 600 ${DIRECTORIO}/privatekey
PRIVKEY=$(cat ${DIRECTORIO}/privatekey)
PUBKEY=$(cat ${DIRECTORIO}/publickey)
echo "=== Configuración para ${NODO_NOMBRE} ==="
echo "Clave Pública: ${PUBKEY}"
echo ""
echo "Archivo /etc/wireguard/wg0.conf:"
echo ""
cat << CONF
[Interface]
Address = ${NODO_IP_MESH}/24
ListenPort = 51820
PrivateKey = ${PRIVKEY}
PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0
# Añadir aquí los [Peer] de todos los nodos existentes en la mesh
CONF
echo ""
echo "=== Entrada [Peer] a añadir en los nodos existentes ==="
cat << PEER
[Peer]
# ${NODO_NOMBRE}
PublicKey = ${PUBKEY}
Endpoint = ${NODO_IP_PUBLICA}:51820
AllowedIPs = ${NODO_IP_MESH}/32
PersistentKeepalive = 25
PEER
EOF
chmod +x /usr/local/bin/wg-mesh-add-node.sh
Solución de Problemas
# Ver el estado detallado de WireGuard
wg show wg0
# Ver las interfaces WireGuard
wg show
# Comprobar que el puerto UDP está abierto
ss -tulnp | grep 51820
# Verificar que el firewall permite WireGuard
# Ubuntu/Debian con UFW:
ufw allow 51820/udp
# CentOS/Rocky con firewalld:
firewall-cmd --permanent --add-port=51820/udp
firewall-cmd --reload
# Verificar el reenvío IP
sysctl net.ipv4.ip_forward
# Capturar paquetes WireGuard para depuración
tcpdump -i eth0 udp port 51820 -v
# Ver la última vez que se recibió tráfico de cada peer
wg show wg0 latest-handshakes
# Ver la cantidad de datos transferidos con cada peer
wg show wg0 transfer
# Reiniciar la interfaz WireGuard
wg-quick down wg0
wg-quick up wg0
# Recargar la configuración sin bajar la interfaz (añadir nuevo peer)
wg syncconf wg0 <(wg-quick strip /etc/wireguard/wg0.conf)
El handshake no se completa:
# Verificar que los endpoints son accesibles (UDP no bloqueado)
nc -zu 203.0.113.20 51820
# Verificar que las claves públicas son correctas
cat /etc/wireguard/publickey # En el nodo remoto
# Comparar con lo que está configurado en wg0.conf del nodo local
# Verificar que el MTU no causa fragmentación
ip link show wg0
# Si el MTU es demasiado alto, reducirlo
ip link set wg0 mtu 1380
Conclusión
WireGuard mesh proporciona una red privada segura y eficiente entre múltiples servidores con una configuración sorprendentemente sencilla comparada con otras soluciones VPN. La clave del éxito está en la gestión cuidadosa de las claves y las rutas AllowedIPs, que controlan tanto qué tráfico se cifra como cómo se enruta la red. Para infraestructuras con muchos nodos, los scripts de auto-configuración y herramientas como wg-gen-web o netmaker pueden simplificar enormemente la gestión.


