Saltar al contenido principal
intermedioPart 4

Haz que OpenClaw sea privado con una VPN de malla NetBird

· 20 min de lectura
Rafael Fernandes
Ingeniero de PLN y Redactor Técnico en WiLine
Share:
OpenClaw+NetBird
0/6
🎯 Skill path0/6 earned
Self-hosting OpenClaw

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.

Reproducibilidad

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:

  1. 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.
  2. 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.
Dos cajas, a propósito — y tu caja OpenClaw está intacta

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.

Una IP Elástica disponible en Redes → 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 Local en Princeton-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.

Configuración de Plantilla — correo electrónico de Let&#39;s Encrypt y la IP Elástica

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.

Asignando la IP Elástica a la nueva VM

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.
  • 301 luego 200 → 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:

El panel de NetBird autoalojado

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:

Agregar Par en el panel autoalojado — nota la bandera --management-url

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.

De dónde proviene tu clave de configuración

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).

¿Primera vez en el panel? Salta los desvíos

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.
  1. Abre https://app.netbird.io/setup-keys.
  2. Crear Clave de Configuración → nombre openclaw-tutorial, alterna Reutilizable (para que funcione también para la laptop), por defecto de otro modo.
  3. Copia la clave.

Creando una clave de configuración reutilizable en el panel de NetBird

Conecta la VM (reemplaza con tu clave):

sudo netbird up --setup-key <YOUR_SETUP_KEY>
Trata la clave de configuración como un secreto

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

estado de netbird en la VM — Gestión y Señal Conectadas, IP de malla 100.87.239.229, conteo de Pares 0/0

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.

Lo ejecutamos en macOS

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).

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:

Salida
WARNING: ... dial unix /var/run/netbird.sock: connect: no such file or directory
Connected

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

Estado de netbird en Mac mostrando Conteo de Pares 1/1 Conectado, además de un ping exitoso a la IP de malla de la VM

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):

La VM y la laptop conectadas como pares en el panel de NetBird

¿Por qué ~200 ms?

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:

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

Prueba a través de la malla — antes de tocar ningún puerto:

curl -kI https://openclaw.local/
Salida
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ó.

El chat de OpenClaw cargando a través de la malla en https://openclaw.local

Paso 5 — Cerrar los puertos públicos

Aquí está el estado que estamos corrigiendo. En la VM:

sudo ss -tlnp | grep -E ':(80|443)'
Salida — escuchando en 0.0.0.0 (todas las interfaces)
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).

La trampa de ufw

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)'

ss después del cambio — Caddy ahora escuchando solo en la IP de la malla 100.87.239.229, ya no en 0.0.0.0

Los puertos han desaparecido de 0.0.0.0 — ahora viven solo en la interfaz de malla.

Orden de inicio

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/

En la VM, curl a la antigua IP LAN ahora devuelve Conexión rechazada

Ese es el resultado: la misma URL, accesible solo a través de tu malla, rechazada en todas partes.

Habilidad desbloqueada 🏅

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 needrestart no acepta Tab. Usa teclas de flecha / Espacio / Enter. El paquete ya está instalado para cuando aparece la caja.
  • Advertencia de gRPC netbird.sock en el primer up. El socket del daemon se retrasa un momento respecto al cliente. Si termina en Conectado, ignórala.
  • Las reglas de ufw no bloquean la puerta de enlace. Los puertos publicados por Docker evitan ufw — vincula el puerto a una IP específica (como arriba) o usa la propia cadena DOCKER-USER de Docker.
  • Caddy en bucle de crash después de reiniciar. Se inició antes de que wt0 tuviera la IP de la malla. restart: unless-stopped lo recupera; o ordena Docker después de netbird.service.
  • Ping alto a un par. Estás retransmitido, no directo — funcional, solo más lento. Verifica Tipo de Interfaz y el detalle del par de NetBird para el tipo de conexión.
Finished this tutorial?
Mark it complete to earn Private mesh access on your skill path.

¿Qué sigue?

Eso cierra la serie de Autoalojamiento de OpenClaw:

  1. Desplegar OpenClaw en una Instancia WEC a través de Docker Compose
  2. Asegurar OpenClaw con un proxy inverso Caddy + HTTPS
  3. Agregar un canal de Telegram a OpenClaw
  4. 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 HermesAutoalojar el Agente Hermes con memoria persistente — desplegado en esta misma Instancia WEC, con contexto que sobrevive a los reinicios.

Comments & questions

Hit an error, spotted a typo, or have a question? Leave a note below.