Problema
Muchos entornos de homelab o pequeñas oficinas dependen de un único enlace de Internet que, por limitaciones del ISP, ofrece ancho de banda insuficiente para varios equipos simultáneos. Cuando se habilita un túnel VPN como Cloudflare WARP en una máquina, la velocidad mejora notablemente, pero solo esa máquina se beneficia. La necesidad típica es proporcionar esa mejora a todos los servidores y contenedores sin instalar WARP en cada uno, manteniendo al mismo tiempo una política de “corte total” si el túnel falla.
Causa
- Rutas estáticas por host – Instalar WARP en cada VM genera rutas locales que no se comparten. Cuando el número de máquinas crece, la gestión se vuelve impracticable.
- Falta de aislamiento de firewall – Un router que depende de la interfaz WAN del host permite que el tráfico salga directamente si el túnel se cae, lo que rompe la política de “no‑escape”.
- Configuración de MTU incompatible – Cloudflare WARP usa una MTU de 1280 bytes. Si la red interna mantiene una MTU mayor, los paquetes fragmentados se pierden y la conectividad se degrada.
- Servicios que crean sus propias tablas nftables – warp‑svc inserta una tabla
warpautomáticamente, lo que puede sobrescribir reglas personalizadas si no se planifica una estrategia aditiva. - DHCP/DNS no centralizado – Sin un servidor DHCP/DNS dentro del túnel, los clientes pueden seguir usando los resolvers del ISP, perdiendo la ventaja de la latencia reducida que ofrece WARP.
Solución
Implementar un contenedor LXC sin privilegios que actúe como router dedicado:
- Crear una bridge VLAN en el host Proxmox y asignarle la etiqueta VLAN que se quiere encapsular (por ejemplo, 1111).
- Instalar Cloudflare WARP dentro del LXC. El servicio crea su propia tabla
warp; todas las reglas del contenedor deben añadirse a esa tabla para evitar colisiones. - Ejecutar dnsmasq + AdGuard Home en el mismo contenedor. dnsmasq gestiona DHCP en la subred de la VLAN, mientras que AdGuard Home proporciona resolución DNS segura y filtrado opcional.
- Configurar nftables con una política
droppor defecto y reglas explícitas que solo permitan tráfico desde la bridge VLAN hacia la interfazwarp. De esta forma, si el túnel desaparece, el contenedor no reenviará paquetes a la red del ISP. - Ajustar la MTU anunciada en los Router Advertisements (RA) a 1280‑1300 bytes, de modo que los clientes adapten su MTU antes de enviar tráfico al túnel.
- Programar un reinicio periódico del proceso
warp-svcmediantecron. La memoria de warp‑svc tiende a crecer con el tiempo; un reinicio semanal mantiene el consumo estable sin interrumpir el flujo de tráfico.
Esta arquitectura es reutilizable: basta cambiar la etiqueta VLAN y el rango DHCP para crear nuevos “segmentos” que también pasen por WARP.
Cuándo aplicar esta solución
- Entornos con un único enlace de salida que necesita ser compartido entre varias máquinas virtuales o contenedores.
- Política de “corte total”: se requiere que, si el túnel falla, el tráfico no se desvíe a la red del ISP.
- Necesidad de DNS centralizado bajo el mismo túnel (por ejemplo, para evitar filtrado ISP).
- Limitaciones de MTU en la red del ISP que hacen que los paquetes fragmentados se pierdan.
No es apropiado cuando:
- Cada host ya dispone de su propio túnel y la gestión centralizada no aporta valor.
- La infraestructura de red ya incluye un router físico con capacidad de VPN y reglas de firewall avanzadas.
Código
# 1. Crear bridge VLAN en el host Proxmox
cat <<EOF > /etc/network/interfaces.d/vlan1111.cfg
auto vmbr1
iface vmbr1 inet manual
bridge-ports none
bridge-stp off
bridge-fd 0
vlan-raw-device eth0
vlan-id 1111
EOF
systemctl restart networking
# 2. Dentro del LXC: instalar warp, dnsmasq y AdGuard Home
apt update && apt install -y cloudflare-warp dnsmasq curl
curl -sSL https://github.com/AdguardTeam/AdGuardHome/releases/latest/download/AdGuardHome_linux_amd64.tar.gz | tar xz -C /opt
/opt/AdGuardHome/AdGuardHome -s install
# 3. Configurar warp (aceptar términos y registrar)
warp-cli register
warp-cli set-mode proxy
warp-cli connect
# 4. nftables: política drop y regla de forward a warp
cat <<'EOF' > /etc/nftables.conf
table inet warp {
chain forward {
type filter hook forward priority 0; policy drop;
iifname "vmbr1" oifname "warp0" accept
iifname "warp0" oifname "vmbr1" accept
}
}
EOF
systemctl enable --now nftables
# 5. dnsmasq: DHCP para la VLAN 1111 (subred 10.111.1.0/24)
cat <<EOF > /etc/dnsmasq.conf
interface=vmbr1
dhcp-range=10.111.1.10,10.111.1.200,12h
dhcp-option=option:router,10.111.1.1
dhcp-option=option:mtu,1300
server=1.1.1.1#53
EOF
systemctl restart dnsmasq
# 6. Cron: reinicio semanal de warp-svc
(crontab -l 2>/dev/null; echo "0 3 * * 0 systemctl restart warp-svc") | crontab -
Verificación
-
Conectividad del cliente
- Asigna la VLAN 1111 a la interfaz de una VM o contenedor.
- Verifica que recibe una IP dentro del rango
10.111.1.0/24. - Ejecuta
ping 1.1.1.1y comprueba que la latencia corresponde al túnel WARP (≈ 30 ms desde Vietnam).
-
Política de corte
- Detén
warp-cli disconnectdentro del LXC. - Intenta hacer ping a cualquier dirección pública desde la VM. El ping debe fallar inmediatamente, confirmando que el tráfico no sale por la interfaz física.
- Detén
-
MTU
- En la VM, ejecuta
ping -M do -s 1270 1.1.1.1. - Si los paquetes llegan sin fragmentación, la MTU está bien anunciada.
- En la VM, ejecuta
-
Consumo de memoria
- Observa
systemctl status warp-svcantes y después del reinicio programado. La memoria debería volver a valores bajos (< 50 MiB).
- Observa
Notas adicionales
- Orden de carga: nftables debe iniciarse antes que
warp-clipara que la tablawarpexista cuando el servicio añada sus reglas. - Persistencia de la bridge: en Proxmox, cualquier cambio manual en
/etc/network/interfaces.d/se sobrescribe al actualizar el host; guarda una copia de seguridad y usahooksde LXC si necesitas automatizar la recreación. - AdGuard Home puede usar la interfaz
warp0como upstream DNS para que las consultas también se beneficien del túnel. - Depuración:
nft list rulesetmuestra la tablawarp. Si ves reglas concounteren cero, probablemente la interfaz de origen/destino no coincide con los nombres reales (vmbr1vsvethXYZ). - Escalado: para múltiples VLANs, replica la bridge y ajusta el rango DHCP; el mismo contenedor puede manejar varios segmentos siempre que la tabla
warptenga reglasiifname/oifnamepara cada bridge.