Guía práctica: configurar WireGuard site-to-site entre dos VPS Debian paso a paso
Redes & Segurança · Por Kevin Marcondes · Publicado el · Actualizado el · 9 min de lectura
Aprende a configurar WireGuard site-to-site entre dos VPS Debian paso a paso. Instalarás los paquetes, generarás las claves, crearás los archivos de configuración, abrirás el firewall y probarás el túnel. Nos centramos en un escenario sencillo y robusto que puedes ampliar para enrutar subredes internas.
Requisitos previos y topología del túnel
Vamos a conectar dos VPS Debian con un túnel WireGuard dedicado. Cada extremo tendrá una dirección privada en el túnel y, opcionalmente, podrá enrutar subredes internas. Necesitarás acceso root o sudo en ambas VPS y la puerta UDP de WireGuard abierta.
Antes de comenzar, confirma: la IP pública de cada VPS, que el DNS resuelva correctamente, que el reloj esté sincronizado y que tengas autorización para abrir UDP. Si todavía estás escogiendo infraestructura, revisa cuándo optar por VPS, alojamiento compartido o baremetal y cómo elegir el tamaño de la VPS.
Topología propuesta: Sitio A ↔ Sitio B vía WireGuard, red del túnel 10.100.0.0/24. Cada VPS se comunica con la otra mediante las IPs del túnel. Las subredes locales son opcionales.
- Dos VPS con Debian soportado y IP pública (Sitio A y Sitio B)
- Acceso SSH con sudo/root
- Puerto UDP de WireGuard abierto (por defecto 51820)
- Sincronización horaria (NTP) fiable
- Conocimientos básicos de firewall (iptables o UFW)
| Elemento | Sitio A | Sitio B |
|---|---|---|
| IP público | <ip_publico_site_a> | <ip_publico_site_b> |
| Dirección del túnel | 10.100.0.1/24 | 10.100.0.2/24 |
| Puerto UDP | 51820 | 51820 |
1) Instalar WireGuard y habilitar el reenvío IPv4
Instala WireGuard en ambos servidores y activa el reenvío IPv4. El reenvío es necesario si pretendes enrutar tráfico más allá del propio host. Ejecutar actualizaciones y cambios de red puede interrumpir la sesión SSH; planifica una ventana segura.
# Em A e B
sudo apt update && sudo apt -y upgrade
sudo apt -y install wireguard wireguard-tools
# Verifique as versões e o módulo
wg --version
sudo modprobe wireguard || true
# Habilite IPv4 forwarding de forma persistente
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wireguard-forward.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard-forward.conf
# Opcional: confirme sincronização de horário (NTP)
timedatectl
2) Generar pares de claves en ambos extremos
Cada extremo del túnel necesita un par de claves, privada y pública. La privada se queda en el servidor; la pública se comparte con el par. Protege los archivos de clave. El comando abajo establece permisos restrictivos para no exponer material sensible.
# Em A e B: gere as chaves privadas e públicas
umask 077
sudo wg genkey | sudo tee /etc/wireguard/privatekey | sudo wg pubkey | sudo tee /etc/wireguard/publickey
# Mostre a chave pública para compartilhar com o outro lado
echo "Chave pública deste host:"
sudo cat /etc/wireguard/publickey
3) Configurar el Sitio A (wg0)
Crea el archivo wg0.conf en el Sitio A. Indica la dirección del túnel, el puerto de escucha y el peer apuntando al Sitio B. Usa la clave pública del Sitio B, su IP pública y el puerto UDP elegido.
PersistentKeepalive ayuda cuando hay NAT en el camino. Ajusta la MTU solo si notas síntomas de fragmentación o pérdida.
# No Site A — substitua os placeholders antes de rodar
PRIV_A=$(sudo cat /etc/wireguard/privatekey)
PUB_B="<cole_a_chave_publica_do_site_B>"
ENDPOINT_B="<ip_publico_site_b>:51820"
sudo tee /etc/wireguard/wg0.conf > /dev/null <<EOF
[Interface]
Address = 10.100.0.1/24
ListenPort = 51820
PrivateKey = ${PRIV_A}
# Regras básicas de proteção da interface (opcional)
PostUp = sysctl -w net.ipv4.conf.all.rp_filter=2
PostDown = sysctl -w net.ipv4.conf.all.rp_filter=0
[Peer]
PublicKey = ${PUB_B}
AllowedIPs = 10.100.0.2/32
Endpoint = ${ENDPOINT_B}
PersistentKeepalive = 25
EOF
sudo chmod 600 /etc/wireguard/wg0.conf
4) Configurar el Sitio B (wg0)
Ahora configura wg0 en el Sitio B, invirtiendo las direcciones y usando la clave pública del Sitio A. El Endpoint apunta a la IP pública del Sitio A con el puerto UDP elegido.
Mantén AllowedIPs lo más restringido posible. Así evitas enrutar tráfico no deseado y conflictos con rutas locales.
# No Site B — substitua os placeholders antes de rodar
PRIV_B=$(sudo cat /etc/wireguard/privatekey)
PUB_A="<cole_a_chave_publica_do_site_A>"
ENDPOINT_A="<ip_publico_site_a>:51820"
sudo tee /etc/wireguard/wg0.conf > /dev/null <<EOF
[Interface]
Address = 10.100.0.2/24
ListenPort = 51820
PrivateKey = ${PRIV_B}
PostUp = sysctl -w net.ipv4.conf.all.rp_filter=2
PostDown = sysctl -w net.ipv4.conf.all.rp_filter=0
[Peer]
PublicKey = ${PUB_A}
AllowedIPs = 10.100.0.1/32
Endpoint = ${ENDPOINT_A}
PersistentKeepalive = 25
EOF
sudo chmod 600 /etc/wireguard/wg0.conf
5) Abrir el puerto UDP y ajustar firewall/NAT
Libera el puerto UDP de WireGuard y permite el reenvío entre la interfaz wg0 y la interfaz WAN. En servidores que usan iptables puedes persistir las reglas con iptables-persistent. Si prefieres UFW, sigue su flujo de reglas — en el sitio existe una guía de UFW.
Si solo necesitas conectar las dos VPS entre sí, NAT no es necesario. Para enrutar subredes internas, consulta la sección de rutas adicionales.
- Puerto UDP por defecto 51820 (puede cambiarse siempre que ambos extremos coincidan)
- Permitir FORWARD entre wg0 y la interfaz WAN
- Persistir reglas tras reinicio
# Em A e B — descubra a interface WAN
echo "Detectando interface WAN..."
WAN=$(ip route list default | awk '{print $5}' | head -n1)
echo "Interface WAN: ${WAN}"
# iptables (legacy) — abrir porta UDP 51820 e permitir forward
sudo iptables -A INPUT -i ${WAN} -p udp --dport 51820 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -j ACCEPT
sudo iptables -A FORWARD -o wg0 -j ACCEPT
# Persistir regras (Debian)
sudo apt -y install iptables-persistent
sudo netfilter-persistent save
# Alternativa com UFW (se você usa UFW)
# sudo ufw allow 51820/udp
# sudo ufw route allow in on wg0 out on ${WAN}
# sudo ufw route allow in on ${WAN} out on wg0
# sudo ufw status verbose
6) Levantar el túnel y validar la comunicación
Con todo configurado, activa la interfaz wg0 y verifica el handshake. Haz ping entre las IPs del túnel para probar la conectividad. Si el handshake no ocurre, no sigas sin corregir el problema.
Para complementar la política de firewall con UFW, consulta nuestro artículo sobre cómo configurar firewall en Ubuntu con UFW y adáptalo a Debian.
- Activar y habilitar al arranque con wg-quick
- Verificar estado con wg show
- Probar ping entre 10.100.0.1 y 10.100.0.2
# Em A e B: subir e habilitar no boot
sudo systemctl enable --now wg-quick@wg0
# Verificar status
sudo wg show
ip addr show wg0
# Testes básicos
# No Site A:
ping -c 4 10.100.0.2
# No Site B:
ping -c 4 10.100.0.1
# Opcional: testar rota
# traceroute 10.100.0.2
7) Solución de problemas y rutas adicionales (opcional)
Si no hay handshake, revisa claves, puertos y AllowedIPs. Cuando existe NAT o IP dinámica, PersistentKeepalive reduce el tiempo de recuperación. Una MTU demasiado alta puede causar pérdida por fragmentación; ajústala si notas latencias anormales.
Para alcanzar subredes detrás de las VPS, añade las redes a AllowedIPs y, si no puedes crear rutas estáticas en el otro extremo, aplica MASQUERADE en wg0 como último recurso.
Planifica monitorizar el túnel y establecer alertas. Si todavía estás definiendo el sistema operativo, consulta cómo elegir la distribución Linux para servidor.
- Verifica DNS y resolución del Endpoint
- Confirma que el puerto UDP está realmente abierto
- Comprueba reloj/NTP y diferencias horarias
- Ajusta MTU si hay fragmentación
- Evita solapamiento de subredes en AllowedIPs
# Diagnóstico rápido
sudo journalctl -u wg-quick@wg0 -n 100 --no-pager
sudo wg show
sudo ss -lunp | grep 51820 || sudo ss -lun
sudo ip route show table main | grep -E 'wg0|default'
WAN=$(ip route list default | awk '{print $5}' | head -n1)
sudo tcpdump -ni ${WAN} udp port 51820
# Exemplo de wg0.conf com sub-redes atrás dos sites (opcional)
# Suponha LAN_A=10.10.1.0/24 (Site A) e LAN_B=10.10.2.0/24 (Site B)
# Site A (trecho):
# [Interface]
# Address = 10.100.0.1/24
# PostUp = iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o wg0 -j MASQUERADE
# PostDown = iptables -t nat -D POSTROUTING -s 10.10.1.0/24 -o wg0 -j MASQUERADE
# [Peer]
# PublicKey = <PUB_B>
# AllowedIPs = 10.100.0.2/32, 10.10.2.0/24
# Site B (trecho):
# [Interface]
# Address = 10.100.0.2/24
# PostUp = iptables -t nat -A POSTROUTING -s 10.10.2.0/24 -o wg0 -j MASQUERADE
# PostDown = iptables -t nat -D POSTROUTING -s 10.10.2.0/24 -o wg0 -j MASQUERADE
# [Peer]
# PublicKey = <PUB_A>
# AllowedIPs = 10.100.0.1/32, 10.10.1.0/24
# Após ajustar, reinicie a interface
# sudo systemctl restart wg-quick@wg0
Preguntas frecuentes
¿Puedo usar otro puerto además de 51820 para WireGuard?
Sí. Elige cualquier puerto UDP libre y usa el mismo valor en ambos extremos. Recuerda abrir el puerto en el firewall y ajustar el Endpoint. En proveedores cloud revisa también las reglas de seguridad en la consola.
¿Qué debo poner en AllowedIPs?
Incluye los destinos que deben atravesar el túnel. Para conectar solo las IPs del túnel, usa el /32 del par remoto. Para alcanzar subredes detrás del peer, añade las redes remotas. Evita solapamientos con rutas locales.
¿Y si la IP pública de la VPS cambia?
Usa un nombre DNS en el Endpoint en lugar de la IP. WireGuard resuelve periódicamente según el TTL. Con IPs muy dinámicas, PersistentKeepalive ayuda a mantener la ruta activa. Tras cambios bruscos, reiniciar la interfaz acelera la reconexión.
¿Qué MTU debo usar en WireGuard?
El valor por defecto funciona en la mayoría de los casos. Si hay pérdida o lentitud por fragmentación, prueba valores entre 1280 y 1420 en el bloque [Interface] como MTU=valor. Ajusta en ambos lados y valida con pruebas de paquetes sin fragmentar.
Uso nftables. ¿Los comandos con iptables funcionan?
En Debian reciente, iptables puede usar el backend nftables. Los comandos suelen funcionar, pero es recomendable mantener un único enfoque por servidor para evitar confusiones. Si ya usas reglas nativas nftables, replica las reglas equivalentes allí.
¿Es seguro exponer el puerto de WireGuard a Internet?
WireGuard usa criptografía moderna y no responde a paquetes inválidos. Aun así, mantén el sistema actualizado y limita orígenes por firewall si lo deseas. La seguridad también depende de buenas prácticas en gestión de claves y configuraciones correctas.
¿Necesitas adaptar el túnel para múltiples sitios o rutas complejas?
Puedo ayudarte a revisar tu topología, ajustar el firewall y automatizar la configuración para producción.
Hablar sobre tu casoVer también
- Tutorial: implementar Canary releases con Traefik en Docker Compose usando headers y weighted routing para despliegues graduales de aplicaciones PHP
- Tutorial: configurar HAProxy con Let's Encrypt y healthchecks para balanceo de tráfico entre contenedores Docker en VPS (paso a paso)
- Tutorial práctico: implementar mTLS entre Nginx y microservicios usando smallstep CA en Docker Compose
- Tutorial: configurar cgroup v2 y systemd ResourceControl para limitar CPU, memoria e I/O de contenedores Docker en Debian