Haz que OpenClaw sea privado con una VPN de malla NetBird
+
En Artículo 2 colocamos Caddy frente a
OpenClaw para HTTPS, y en Artículo 3
agregamos un canal de Telegram. La puerta de enlace funciona — pero Caddy sigue escuchando en
0.0.0.0, accesible por cualquier cosa que pueda enrutar hacia la caja. Este es el proyecto final
de la serie: unimos el servidor y tu laptop a una malla NetBird,
redirigimos openclaw.local a la IP de la malla y cerramos los puertos públicos. La misma
URL https://openclaw.local/chat sigue funcionando — pero solo para tus dispositivos.
Cada comando y error a continuación proviene de la ejecución real.
Continúa desde los Artículos 1–3 en la misma Instancia WEC — Ubuntu, OpenClaw detrás de Caddy 2. Usamos NetBird gestionado (el nivel gratuito en app.netbird.io) con el agente 0.73.2 tanto en el servidor (Linux, núcleo WireGuard) como en el cliente (macOS, espacio de usuario). NetBird es WireGuard-basado y de código abierto; también puedes autoalojar el plano de control, que es un tema más amplio para otro día.
Cómo funciona NetBird (y lo que construirás)
NetBird tiene dos partes, y la distinción es el punto principal:
- El plano de control (el servicio de gestión + señal gestionado de NetBird) — esta es la única cosa con una presencia pública. Cada dispositivo que quiere unirse se autentica (con tu clave de configuración o inicio de sesión SSO), y media el intercambio de la clave pública WireGuard de cada par.
- El plano de datos — una vez autenticados, los pares se comunican directamente entre sí, cifrados de extremo a extremo a través de WireGuard. Tu tráfico real nunca fluye a través de un puerto público que gestionas; el plano de control solo hizo las presentaciones.
Así que estás construyendo una malla donde Peer A (tu laptop) alcanza a Peer B (la caja OpenClaw) por su dirección privada 100.x — y openclaw.local apunta allí, con Caddy vinculado solo a esa interfaz. El lado público/LAN no tiene nada escuchando.
La idea clave para más adelante: la malla no está limitada a dos pares. Autentica una vez, y cada nuevo servicio — Ollama, un VDI, WordPress — se une como otro par con su propia dirección 100.x, accesible de forma privada sin puertos públicos que abrir. Configuras el modelo de autenticación una vez; agregas servicios para siempre.
El internet público solo llega a el plano de control de NetBird — y eso solo autentica pares, nunca transporta tu tráfico de aplicación. Tus servicios no están "protegidos" tanto como invisibles: OpenClaw no tiene IP pública, así que simplemente no hay ruta hacia él desde internet. La única forma de entrar es ser un par autenticado en la malla.
En este tutorial conectamos los primeros dos pares — tu laptop y la
caja OpenClaw. Los otros servicios hacen el punto: una vez que la autenticación está configurada,
Ollama, un VDI, WordPress simplemente se unen a la misma malla como otro par 100.x
— sin puertos públicos, sin exposición por servicio.
Establecer un plano de control de NetBird
Cada malla de NetBird tiene dos roles: pares — tus máquinas, es decir, la caja OpenClaw de las Partes 1–3 y tu laptop — y un plano de control que autentica esos pares y emite sus claves de unión. Ya tienes el par (tu caja OpenClaw); ahora necesitas un plano de control al que unirse. Dos formas de obtener uno:
- Opción A — autoalojarlo en WiLine (recomendado). Despliega la plantilla de NetBird Marketplace de WEC: una Instancia WEC dedicada que ejecuta tu propio plano de control de NetBird — panel, certificado de confianza, cero shell. Ahora tu entera red privada vive en WiLine — la caja OpenClaw y su plano de control — sin dependencia de terceros.
- Opción B — NetBird gestionado (sin caja extra). ¿No quieres ejecutar tu propio plano de control? Usa el nivel gratuito en app.netbird.io — inicia sesión y listo; el plano de control es la nube de NetBird. Luego salta a Inscribir tus máquinas.
Con la Opción A ejecutarás dos instancias: tu caja OpenClaw (Partes 1–3, sin cambios) y una segunda caja de plano de control dedicada (esta plantilla). Esa es la topología correcta — un plano de control debe ser su propia máquina, nunca compartiendo con una carga de trabajo. Con la Opción B solo hay tu una caja OpenClaw. De cualquier manera nunca reconstruyes la caja OpenClaw — en Inscribir tus máquinas solo instalas el agente de NetBird en ella y se une a la malla como un par.
Los pasos a continuación configuran la Opción A. WEC ejecuta la instalación; le das un correo electrónico y una
IP pública, y unos minutos después tienes tu propio panel de NetBird en
https://<your-ip>.apps.wiline.cloud con un certificado válido.
1. Obtener una IP pública (Elástica)
El panel necesita una dirección pública. Bajo Redes → IPs Elásticas, asigna una
nueva IP o elige una libre, y anota su valor (la nuestra: 108.60.112.165). Debe estar
en la VPC y zona en la que desplegarás. Pasos completos:
Configurar IPs Elásticas.

2. Desplegar una VM con la plantilla
Esta nueva instancia se convierte en tu plano de control de NetBird — una caja separada de tu instancia OpenClaw, que permanece intacta. Abre Desplegar → Desplegar una VM (guía completa: Desplegar una Máquina Virtual). Las elecciones que importan aquí:
- Red — elige la red en la misma VPC/zona que tu IP Elástica (usamos
Subred LocalenPrinceton-VPC), para que la IP pueda adjuntarse después. - Plantilla → Marketplace → Ubuntu 24.04 LTS Netbird.
- Configuración de Plantilla — tu correo electrónico de Let's Encrypt y la IP Elástica del paso 1 como la dirección externa.

Termina el asistente y despliega.
3. Adjuntar la IP Elástica a la nueva instancia
La IP no está vinculada en el momento del despliegue — la adjuntas una vez que la VM esté activa. Ve a
Redes → IPs Elásticas → tu IP → ⋯ → Asignar, y selecciona tu nueva instancia
(netbird-tutorial). Solo las VMs en la misma VPC aparecen en la lista.

4. Espera el primer arranque, luego verifica que esté activa
La instancia muestra Ejecutándose en Cómputo → Instancias en un minuto — pero la plantilla sigue trabajando durante unos minutos después de eso, descargando e iniciando los contenedores de NetBird y levantando el panel. No esperes que la URL responda inmediatamente.
Verifica desde tu laptop a través de HTTPS (no ping — ICMP está bloqueado, así que un
ping fallido no significa que esté caída):
curl -skS -m 10 -o /dev/null -w "%{http_code}\n" https://<your-ip>.apps.wiline.cloud
000/ conexión rechazada → aún en provisión; espera un minuto y vuelve a intentar.301luego200→ está activa (HTTP redirige a HTTPS).
Para verlo directamente, accede por SSH (ssh ubuntu@<your-ip>) y confirma que los contenedores están
ejecutándose y los puertos están vinculados:
cloud-init status
sudo docker ps
sudo ss -tlnp | grep -E ':(80|443)'
Está listo una vez que netbird-dashboard, netbird-traefik, y netbird-server muestran
Arriba y 80/443 están escuchando.
5. Abre el panel y crea tu cuenta
Abre https://<your-ip>.apps.wiline.cloud — haz clic en la advertencia del certificado
si recibes una (el mismo clic de paso de certificado autofirmado que en
Artículo 2).
Este es tu propio plano de control de NetBird, ejecutándose en tu Instancia WEC. En la primera visita te pide que crees la cuenta de administrador — ingresa un nombre, correo electrónico y contraseña, haz clic en Crear, luego inicia sesión con esas mismas credenciales. (Esa pantalla de configuración aparece solo una vez; después el panel muestra una página normal de Iniciar sesión.)
Llegas al panel de NetBird — tu plano de control privado en tu propio dominio:

Haz clic en Agregar Par y NetBird te entrega el comando de inscripción para tu servidor —
nota el --management-url apuntando a tu propio dominio:

curl -fsSL https://pkgs.netbird.io/install.sh | sh
netbird up --management-url https://<your-ip>.apps.wiline.cloud
(Ese segundo comando abre un inicio de sesión SSO en el navegador. Para un servidor sin cabeza,
agrega --setup-key <KEY> desde la página de Claves de Configuración de tu panel en su lugar — igual que el flujo gestionado, solo que con --management-url agregado.)
Este es el panel donde creas las claves de configuración que inscriben máquinas — que es exactamente lo que hacemos a continuación.
Ahora inscribe tus máquinas
Tienes un plano de control (tu propio panel de plantilla, o NetBird gestionado). Ahora coloca las dos máquinas en la malla — la caja OpenClaw de las Partes 1–3 y tu laptop — y luego cierra los puertos públicos de la caja. Estos pasos son los mismos sin importar qué plano de control elegiste.
Los comandos a continuación utilizan NetBird gestionado (app.netbird.io) como ejemplo. Si
desplegaste la plantilla de WEC en su lugar, es idéntico excepto: crea la clave de configuración
en tu propio panel (https://<your-ip>.apps.wiline.cloud) y agrega
--management-url https://<your-ip>.apps.wiline.cloud a netbird up, para que el
agente apunte a tu servidor en lugar de a la nube gestionada.
Requisitos previos: OpenClaw ejecutándose detrás de Caddy de
Artículos 1–3 (accesible en
https://openclaw.local), un plano de control del paso anterior, y acceso a la shell en
la caja más administrador en tu laptop.
Paso 1 — Instalar el agente de NetBird en la caja OpenClaw
Esta es la caja de las Partes 1–3 (una Instancia WEC) — la estamos inscribiendo como un par, que es separado de cualquier servidor de plano de control. NetBird envía un instalador de una línea:
curl -fsSL https://pkgs.netbird.io/install.sh | sh
Problema (real): en Ubuntu la instalación activa el diálogo needrestart —
una caja azul "¿Qué servicios deberían reiniciarse?". Tab entre botones puede ser
absorbido por algunas configuraciones de SSH/terminal; usa las teclas de flecha para moverte,
Espacio para alternar, Enter para confirmar (<Ok> es el predeterminado). El paquete ya está
en su lugar para cuando aparece esta caja, así que incluso si sales con Ctrl+C, el agente
está instalado — volver a ejecutar el instalador solo te lo dirá:
NetBird parece estar ya instalado, por favor elimínalo antes de continuar
(Si vuelves a ejecutar el instalador después de este tutorial, verás en su lugar
El servicio de NetBird está en ejecución, por favor deténlo antes de continuar — el agente ya está
activo, así que no hay nada que reinstalar.)
Confirma la versión:
netbird version
# 0.73.2
Paso 2 — Crear una clave de configuración y unirse a la caja OpenClaw
Una clave de configuración es el token que inscribe un dispositivo en tu malla — ideal para un servidor sin cabeza (sin necesidad de SSO en el navegador).
Algunas cosas intentarán enviarte en la dirección equivocada en una cuenta nueva — aquí está la línea directa:
- ¿Sin cuenta aún? Crea una primero (inicia sesión con Google/GitHub/correo electrónico). No puedes generar una clave hasta que estés dentro.
- El asistente de incorporación ("Agrega tu primer recurso" — IP única / Subred completa / Dominio) aparece de inmediato. Sáltalo. Los recursos son para exponer subredes/dominios; solo necesitamos dos pares simples, así que no es necesario.
- El botón naranja "Agregar Par" abre el flujo de instalación SSO (descargar la aplicación, registrarse con correo electrónico, conectarse desde la bandeja). Eso está destinado a un escritorio con un navegador — no a un servidor sin cabeza. No lo sigas.
- En su lugar, ve directamente a la página de Claves de Configuración:
https://app.netbird.io/setup-keys.
- Abre
https://app.netbird.io/setup-keys. - Crear Clave de Configuración → nombre
openclaw-tutorial, alterna Reutilizable (para que funcione también para la laptop), por defecto de otro modo. - Copia la clave.

Conecta la VM (reemplaza con tu clave):
sudo netbird up --setup-key <YOUR_SETUP_KEY>
Cualquiera con una clave reutilizable puede agregar dispositivos a tu red. No la pegues en chats o commits, y elimínala del panel una vez que tus dispositivos estén inscritos (los pares existentes permanecen conectados).
Verifica la conexión:
netbird status

Esa IP de NetBird (100.87.239.229) es la dirección a la que apunta todo lo que sigue.
Conteo de Pares: 0/0 es esperado — nada más se ha unido aún.
Paso 3 — Unir tu laptop
Instala el cliente de NetBird en lo que estés usando, luego conéctate con la
misma clave de configuración reutilizable. El comando de conexión (netbird up --setup-key …) es
idéntico en cada SO — solo la instalación difiere.
La salida capturada a continuación es de un Mac. Las pestañas de Windows y Linux dan la
instalación equivalente; los pasos de netbird up, netbird status, y ping son los
mismos en todas partes (Windows usa ping -n en lugar de -c).
- macOS
- Windows
- Linux
Instala a través de Homebrew, luego inicia el servicio y conéctate:
brew install netbirdio/tap/netbird
sudo netbird service install
sudo netbird service start
netbird up --setup-key <YOUR_SETUP_KEY>
Puede que veas una advertencia de gRPC única mientras el socket del daemon se activa un momento después
de que el cliente lo llama — termina en Conectado, así que es inofensivo:
WARNING: ... dial unix /var/run/netbird.sock: connect: no such file or directory
Connected
Descarga y ejecuta el instalador de NetBird para Windows desde
app.netbird.io (Agregar Par → Windows) o
pkgs.netbird.io. Instala una aplicación en la bandeja del sistema y el
CLI netbird. Luego, en PowerShell como Administrador, conéctate con tu clave:
netbird up --setup-key <YOUR_SETUP_KEY>
(También puedes hacer clic en Conectar desde el icono de la bandeja y autenticarte a través de SSO, pero la clave de configuración es el mismo flujo de un solo uso que en las otras plataformas.)
El mismo instalador de una línea que la VM, luego conéctate:
curl -fsSL https://pkgs.netbird.io/install.sh | sh
sudo netbird up --setup-key <YOUR_SETUP_KEY>
Verifica que los dos nodos se vean entre sí, y que el túnel transporte tráfico:
netbird status
ping -c 3 100.87.239.229 # Windows: ping -n 3 100.87.239.229

Conteo de Pares: 1/1 — ese par es la VM. En el panel, ambas máquinas ahora
aparecen bajo Pares (porque las inscribimos con una clave de configuración en lugar de un
inicio de sesión SSO, aparecen bajo Servidores en lugar de Dispositivos de Usuario):

Este camino está pasando por un relay de NetBird (nota Tipo de Interfaz: Espacio de Usuario
en el Mac). Está bien para una interfaz web, y NetBird a menudo actualizará a un enlace directo
de par a par cuando las redes lo permitan. La latencia a un par retransmitido no es una
bandera roja.
Paso 4 — Redirigir openclaw.local a la IP de la malla
Desde Artículo 2, tu archivo de hosts mapea
openclaw.local a la IP LAN de la VM (10.80.4.212). Cámbiala por la IP de la malla
(100.87.239.229). La ruta del archivo y el comando de edición difieren según el SO:
- macOS
- Linux
- Windows
sed en macOS necesita el vacío -i '':
grep openclaw /etc/hosts
# 10.80.4.212 openclaw.local
sudo sed -i '' 's/^10\.80\.4\.212 openclaw\.local/100.87.239.229 openclaw.local/' /etc/hosts
grep openclaw /etc/hosts
# 100.87.239.229 openclaw.local
GNU sed toma -i sin argumento:
grep openclaw /etc/hosts
sudo sed -i 's/^10\.80\.4\.212 openclaw\.local/100.87.239.229 openclaw.local/' /etc/hosts
grep openclaw /etc/hosts
# 100.87.239.229 openclaw.local
El archivo de hosts está en C:\Windows\System32\drivers\etc\hosts y necesita admin.
En PowerShell como Administrador:
$h = "$env:WINDIR\System32\drivers\etc\hosts"
(Get-Content $h) -replace '^10\.80\.4\.212 openclaw\.local','100.87.239.229 openclaw.local' | Set-Content $h
Select-String openclaw $h
(O abre ese archivo en Notepad ejecutado como Administrador y cambia la IP a mano.)
Prueba a través de la malla — antes de tocar ningún puerto:
curl -kI https://openclaw.local/
HTTP/2 200
...
via: 1.1 Caddy
via: 1.1 Caddy a través de la IP de la malla — el chat ahora fluye a través de NetBird. Carga
https://openclaw.local/chat?session=main en el navegador para confirmar que se comporta
exactamente como antes. El certificado TLS sigue coincidiendo porque el nombre de host no ha cambiado;
solo la IP detrás de él se movió.

Paso 5 — Cerrar los puertos públicos
Aquí está el estado que estamos corrigiendo. En la VM:
sudo ss -tlnp | grep -E ':(80|443)'
LISTEN 0 4096 0.0.0.0:443 ... docker-proxy
LISTEN 0 4096 0.0.0.0:80 ... docker-proxy
Caddy escucha en 0.0.0.0 — todas las interfaces, incluyendo la LAN (y cualquier NAT
delante de ella).
Tu primer instinto es ufw deny 443. No funcionará. Los puertos de Caddy son
publicados por Docker, que escribe sus propias reglas de iptables que evitan la
cadena INPUT de ufw. Agregarías reglas de ufw, te sentirías seguro, y 443 seguiría abierto. En
esta caja ufw estaba incluso inactivo — y habilitarlo no habría cambiado nada
para los puertos publicados por Docker.
La solución confiable es vincular los puertos publicados a la IP de la malla en lugar de
0.0.0.0, para que Caddy solo escuche en wt0. Edita el servicio de Caddy en
docker-compose.override.yml (la sobreescritura del Artículo 2):
cd /home/ubuntu/openclaw
cp docker-compose.override.yml docker-compose.override.yml.bak
Cambia el bloque de puertos de:
ports:
- "80:80"
- "443:443"
a vincular a la IP de la malla:
ports:
- "100.87.239.229:80:80"
- "100.87.239.229:443:443"
Recrea solo Caddy y vuelve a verificar:
docker compose up -d caddy
sudo ss -tlnp | grep -E ':(80|443)'

Los puertos han desaparecido de 0.0.0.0 — ahora viven solo en la interfaz de malla.
Debido a que el enlace apunta a la IP de la malla, NetBird debe estar activo antes de que Caddy inicie
(por ejemplo, después de un reinicio, wt0 necesita su IP antes de que Docker se vincule a ella). La
política restart: unless-stopped ya cubre esto — Caddy reintenta hasta que
la interfaz exista — pero vale la pena saberlo si alguna vez ves a Caddy en un bucle de
crash justo después del arranque.
Paso 6 — Demostrar el bloqueo
Ambas direcciones, de la ejecución real.
Aún accesible a través de la malla (laptop):
curl -kI https://openclaw.local/
# HTTP/2 200 ... via: 1.1 Caddy
Ya no accesible en la LAN (VM, golpeando su propia IP LAN):
curl -kI --connect-timeout 5 --resolve openclaw.local:443:10.80.4.212 https://openclaw.local/

Ese es el resultado: la misma URL, accesible solo a través de tu malla, rechazada en todas partes.
Ahora puedes sacar cualquier servicio autoalojado de internet público sin romper cómo lo usas.
Limpieza
Elimina la clave de configuración reutilizable ahora que ambos dispositivos están inscritos —
Claves de Configuración → eliminar en el panel. Tus pares permanecen conectados; solo
estás cerrando la puerta que usaste para agregarlos. Para eliminar un dispositivo más tarde, elimínalo bajo
Pares → Dispositivos de Usuario y ejecuta netbird down en esa máquina.
Solución de problemas (real)
- El diálogo
needrestartno aceptaTab. Usa teclas de flecha / Espacio / Enter. El paquete ya está instalado para cuando aparece la caja. - Advertencia de gRPC
netbird.socken el primerup. El socket del daemon se retrasa un momento respecto al cliente. Si termina enConectado, ignórala. - Las reglas de
ufwno bloquean la puerta de enlace. Los puertos publicados por Docker evitanufw— vincula el puerto a una IP específica (como arriba) o usa la propia cadenaDOCKER-USERde Docker. - Caddy en bucle de crash después de reiniciar. Se inició antes de que
wt0tuviera la IP de la malla.restart: unless-stoppedlo recupera; o ordena Docker después denetbird.service. - Ping alto a un par. Estás retransmitido, no directo — funcional, solo más lento. Verifica
Tipo de Interfazy el detalle del par de NetBird para el tipo de conexión.
¿Qué sigue?
Eso cierra la serie de Autoalojamiento de OpenClaw:
- Desplegar OpenClaw en una Instancia WEC a través de Docker Compose
- Asegurar OpenClaw con un proxy inverso Caddy + HTTPS
- Agregar un canal de Telegram a OpenClaw
- Haz que OpenClaw sea privado con una VPN de malla NetBird ← estás aquí
Ahora tienes un agente autoalojado que está cifrado en tránsito, emparejado con tus dispositivos, accesible desde tu teléfono, e invisible para el internet público — todo en una pequeña Instancia WEC.
Continúa el viaje
¿Listo para un agente que recuerda? Comienza la serie de Autoalojamiento de Hermes — Autoalojar el Agente Hermes con memoria persistente — desplegado en esta misma Instancia WEC, con contexto que sobrevive a los reinicios.
