Tutorial

Seguridad y monitorización

VPN mesh sin puertos abiertos con NetBird en VPS

Diez clientes, diez accesos VPS diferentes, diez conjuntos de claves WireGuard para gestionar manualmente. Por cada nueva estación de trabajo de administrador u oficina remota, hay que reabrir un firewall, redistribuir una clave y actualizar configuraciones en cada nodo. Este modelo falla a escala. NetBird 0.76 resuelve este problema automatizando completamente el descubrimiento de pares, el traversal NAT y los relés TURN — y su comando `netbird expose` permite hacer accesible un servicio interno desde el mesh sin abrir un solo puerto público en Internet.

13 min de lectura10 pasos
Contenido· El problema: gestionar diez túneles WireGuard manuales1/9
  1. 01El problema: gestionar diez túneles WireGuard manuales
  2. 02Requisitos previos
  3. 03Conectar un VPS ServOrbit a una red NetBird
  4. 04`netbird expose`: un servicio interno sin puerto público
  5. 05Caso de uso agencia: conectar VPS cliente, oficina y estación admin
  6. 06Resolución de problemas: 3 problemas frecuentes
  7. 07Resolución de problemas: el proxy de NetBird se queda en «Issuing certificate…»
  8. 08Origen cerrado: obtener el certificado por DNS-01 con lego
  9. 09Conclusión: menos reglas de firewall, más seguridad real

El problema: gestionar diez túneles WireGuard manuales

WireGuard es excelente — rápido, moderno, sólido criptográficamente. Pero su modelo de configuración es estático: cada par debe conocer la IP pública y la clave pública de todos sus homólogos. En un parque de diez clientes con estaciones de trabajo nómadas, oficinas detrás de CGNAT y VPS con IPs variables, se pasa más tiempo sincronizando archivos wg0.conf que haciendo trabajo productivo. Añadir un VPS implica modificar la lista de pares en nueve máquinas. Eliminar un técnico requiere revocar su clave en todas partes. ¿Cambió una subred? A empezar de nuevo. Esta es la pesadilla operativa que NetBird fue diseñado para eliminar.

  • Mesh automático: NetBird gestiona el plano de control — cada nuevo par se anuncia, los demás lo descubren sin intervención manual.
  • Traversal NAT y CGNAT: NetBird usa STUN para establecer conexiones directas entre pares a través de NATs residenciales y corporativos.
  • Relé TURN automático: cuando la conexión directa es imposible, NetBird cambia silenciosamente a un relé cifrado.
  • Auditoría de acceso granular: las políticas de control de acceso definen qué pares pueden alcanzar qué servicios.
  • Open source (BSD-3 para el cliente, AGPLv3 para el servidor): sin vendor lock-in, posibilidad de autoalojamiento.

Requisitos previos

Antes de instalar NetBird, verifica que tu infraestructura cumple los siguientes requisitos.

  • Un VPS ServOrbit con Ubuntu 22.04/24.04 o Debian 12, con acceso root.
  • Una cuenta de NetBird Cloud (gratuita hasta 5 pares) o un plano de control self-hosted ya desplegado.
  • Los puertos salientes 443 (HTTPS/WSS) y 3478 (STUN/UDP) no bloqueados desde el VPS.
  • La función Peer Expose activada en tu cuenta (disponible en los planes Team y superiores).

Conectar un VPS ServOrbit a una red NetBird

Aquí está el procedimiento completo para conectar un VPS ServOrbit a tu red mesh NetBird.

  1. Instalar el agente NetBird

    En el VPS, añade el repositorio oficial e instala el paquete:
    curl -fsSL https://pkgs.netbird.io/install.sh | sh
    Verifica la versión: netbird version debe mostrar 0.76.x.

  2. Generar una clave de configuración

    En el panel de NetBird, ve a Setup Keys y crea una clave reutilizable o de un solo uso. Cópiala — solo se muestra una vez.

  3. Conectar el par al plano de control

    En el VPS:
    netbird up --setup-key <TU_SETUP_KEY>
    El par aparece en el panel en segundos.

  4. Añadir el par al grupo de red

    En la interfaz NetBird, ve a Peers, selecciona el nuevo VPS y añádelo al grupo deseado. Las políticas de acceso se aplican inmediatamente.

  5. Verificar la conectividad mesh

    Desde otro par ya en la red:
    netbird status luego ping 100.x.x.x
    Un ping que responde confirma que el túnel está establecido.

`netbird expose`: un servicio interno sin puerto público

El comando netbird expose permite hacer accesible un servicio que escucha localmente a través del proxy inverso de NetBird — sin abrir ningún puerto en el firewall del VPS. El servicio creado es efímero: desaparece automáticamente al detener el comando.

Ejemplo práctico: tu panel de supervisión escucha en localhost:3000 y solo debe ser accesible para miembros autorizados del mesh:
netbird expose --protocol http --local-address localhost:3000 --with-user-groups supervision-admins
NetBird genera una URL pública en *.tunnel.netbird.io. El puerto 3000 del VPS permanece cerrado a nivel de firewall.

Para acceso protegido por contraseña sin SSO, añade --with-password: NetBird muestra una contraseña aleatoria que compartes con tus colaboradores. Útil para acceso de emergencia a un cliente sin cuenta en tu tenant NetBird.

Caso de uso agencia: conectar VPS cliente, oficina y estación admin

Topología NetBird recomendada para una agencia que gestiona diez clientes independientes: crea un grupo por cliente. El VPS de cada cliente es miembro de su grupo. Las estaciones de admin son miembros solo de su grupo de cliente. La oficina de la agencia está en un grupo agency-ops con acceso a todos los grupos de clientes.

Para SSH al VPS del cliente sin puerto público:
ufw allow in on netbird0 to any port 22 luego ufw deny 22

Desplace la tabla

CriterioNetBird 0.76TailscaleWireGuard manual
Gestión de paresAutomática (plano de control centralizado)Automática (nube Tailscale)Manual (archivos wg0.conf en cada nodo)
Traversal NAT/CGNATSTUN + TURN automáticoSTUN + DERP automáticoRequiere IP pública o port-forward
Modelo de preciosGratuito hasta 5 pares; planes Team/Business; self-hosted gratuitoGratuito hasta 3 usuarios; planes de pagoGratuito (software), coste operativo en tiempo
Open sourceSí (BSD-3 cliente, AGPLv3 servidor)Cliente open source (BSD-3), servidor propietarioSí (GPLv2 kernel, MIT userland)
Exponer servicio sin puerto abiertoSí (`netbird expose`)No (Funnel disponible pero diferente)No nativo (túnel SSH manual)
Auditoría y políticas de accesoInterfaz web completa, grupos y políticasACL vía archivo HuJSON, interfaz webNinguna — solo AllowedIPs por par

Resolución de problemas: 3 problemas frecuentes

1. Par inaccesible (Status: Disconnected) — Ejecuta netbird status --detail para ver el estado ICE. Verifica que el puerto 3478/UDP saliente esté abierto.

2. STUN/TURN bloqueado por firewall corporativo — NetBird soporta TURN sobre TCP/443. Configura Force TCP en el panel.

3. Leer los logs — En Linux con systemd:
journalctl -u netbird -f --since '5 minutes ago'

Resolución de problemas: el proxy de NetBird se queda en «Issuing certificate…»

Desde que NetBird ofrece su proxy inverso autoalojado, un síntoma vuelve una y otra vez en los tickets: el servicio creado en el panel se queda indefinidamente en «Issuing certificate…» y nunca es accesible. El ticket netbird #5517, abierto el 5 de marzo de 2026 y todavía abierto en su última actividad del 19 de octubre de 2026, suma 35 comentarios. El log del proxy muestra con más frecuencia este mensaje: acme/autocert: unable to satisfy "https://acme-v02.api.letsencrypt.org/acme/authz/…" for domain "subdomain.site.tld": no viable challenge type found. Dice que la autoridad de certificación no recibió ninguna respuesta válida a sus desafíos; no dice por qué. No existe, pues, una causa única: los participantes describen varias y solo una está confirmada por el equipo de NetBird. Este es un orden de diagnóstico que descarta las causas una a una.

  1. Leer el log del proxy

    Ejecuta docker compose logs proxy | grep -i acme: la documentación de NetBird señala este comando para los servicios que se quedan en certificate_pending o pasan a certificate_failed. Anota el texto exacto del error antes de cambiar nada, porque permission denied y no viable challenge type found no tienen el mismo remedio.

  2. Comprobar los permisos de la carpeta de certificados

    Un error del tipo open /certs/acme_account+key…: permission denied es el único caso zanjado por un colaborador del repositorio, que responde que ninguna actualización lo corregirá y que el problema son los permisos. Un participante cuenta que lo resolvió entregando la carpeta certs al usuario 1000:1000 (chown 1000:1000) y montando una carpeta vacía en /var/lib/netbird. Es una corrección reportada para su instalación: comprueba con qué usuario corre tu contenedor antes de copiarla.

  3. Verificar el DNS, los registros CAA y los puertos

    El nombre debe resolver a la dirección del proxy y ningún registro CAA debe excluir a la autoridad utilizada. El puerto 443 debe ser accesible desde Internet para el desafío tls-alpn-01, que es el valor por defecto; el puerto 80 también lo debe ser para http-01. La documentación indica que Let's Encrypt valida desde varias ubicaciones del mundo, así que un filtrado geográfico aguas arriba puede hacer fallar la validación.

  4. Descartar un CDN que no retransmite el desafío

    La documentación advierte de que un servicio situado delante del proxy, Cloudflare por ejemplo, puede no transmitir el protocolo ALPN acme-tls/1. En ese caso, pasa a NB_PROXY_ACME_CHALLENGE_TYPE=http-01. Estas comprobaciones descartan causas sin garantizar el éxito: un participante verificó el DNS, Cloudflare en solo DNS, los puertos 80 y 443 abiertos y la ausencia de CAA, y obtiene el mismo error con los dos tipos de desafío.

  5. Examinar el Traefik situado delante

    Si Traefik retransmite el TLS al proxy mediante un enrutador TCP con tls.passthrough=true, comprueba que el punto de entrada HTTPS lleva allowACMEByPass=true. El recuadro siguiente explica qué hace esta opción y qué no demuestra.

  • Confirmado por el equipo — un error permission denied en la carpeta /certs viene de los permisos del sistema de archivos y no de la versión del proxy; la advertencia failed to get active profile state sobre el perfil del cliente integrado no tiene relación con el proxy y no es crítica, y su mensaje se corregirá en una próxima versión.
  • Reportado por varios participantes — añadir allowACMEByPass=true al punto de entrada HTTPS de Traefik desbloquea la emisión. Varios lo confirman, pero otros dos indican que la opción ya estaba puesta en su caso y que el bloqueo persiste, uno de ellos con la versión 0.74.4 del proxy.
  • Reportado por un solo participante, sin verificar — en NetBird Cloud, una emisión lenta por parte de ZeroSSL, combinada con un plazo de 5 minutos de la biblioteca autocert de Go, explicaría los fallos. El autor aclara que razona desde fuera, sin confirmación del equipo.
  • No establecido — ninguna causa única hasta hoy: el ticket sigue llevando la etiqueta triage-needed en la lectura del 31 de octubre de 2026. No presentes ninguna de estas pistas como la causa de tu caso antes de haberla probado.

El script getting-started.sh del repositorio de NetBird pone --entrypoints.websecure.allowACMEByPass=true en Traefik. Según la documentación de Traefik, esta opción, desactivada por defecto, hace que tus propios enrutadores traten los desafíos ACME TLS y HTTP en lugar del enrutador ACME interno, y deja pasar el desafío TLS-ALPN hacia un enrutador TLS que tú defines. Usa el nombre de tu propio punto de entrada (websecure, https…): un participante tuvo que ponerla a la vez en el punto de entrada HTTP y en el HTTPS. No exime de leer el log.

Origen cerrado: obtener el certificado por DNS-01 con lego

Mientras el certificado dependa de un desafío tls-alpn-01 o http-01, la autoridad debe llegar a tu proxy desde Internet. Eso choca con un origen cerrado solo a los rangos de un CDN, con un firewall aguas arriba que no gestionas o con un filtrado geográfico. El desafío dns-01 elimina esa dependencia: demuestra el control del dominio con un registro TXT temporal creado mediante la API del proveedor DNS. A 31 de octubre de 2026, el proxy de NetBird no lo integra de forma nativa: la petición, ticket netbird #5450 abierto el 25 de febrero de 2026 y con 30 comentarios, sigue abierta. La documentación de NetBird sí describe una vía, «private proxy with lego»: lego obtiene y renueva un certificado wildcard por DNS-01, un hook de despliegue lo copia en un volumen compartido y el proxy lo carga y lo recarga en caliente tras cada renovación. Un participante del ticket dice haberla montado sin dificultad y que también sirve para servicios públicos.

  • Variables del proxy — NB_PROXY_WILDCARD_CERT_DIR señala la carpeta del certificado wildcard y NB_PROXY_PRIVATE="true" activa el modo privado. Fija la versión de la imagen: debe conocer ambas variables.
  • El modo privado no cierra nada por sí solo — NB_PROXY_PRIVATE no desactiva la escucha pública. Retira tú mismo los puertos públicos y las rutas de entrada hacia el proxy.
  • Alcance del wildcard — cubre un solo nivel de subdominio. Un nombre fuera de su cobertura vuelve al ACME integrado, que no puede completarse si el proxy es totalmente privado.
  • Exposición del certificado — las autoridades públicas registran el wildcard y el dominio base en los registros de Certificate Transparency, y una clave wildcard comprometida afecta a todos los nombres cubiertos.
  • Operación — usa el servidor ACME de producción, porque los certificados de prueba no son de confianza; haz copia de los volúmenes de lego y de los certificados; prevé un emisor único o una distribución segura del par de certificados para un clúster de varios hosts.

Política de control de acceso: crea una regla que solo permita al grupo agency-ops alcanzar el puerto 22 en los grupos de clientes. Esto evita que un equipo comprometido en el mesh sirva de pivote para acceder a todos los VPS de clientes.

Conclusión: menos reglas de firewall, más seguridad real

NetBird 0.76 representa un cambio de paradigma para gestionar un parque de VPS distribuido. En lugar de multiplicar reglas UFW y claves WireGuard estáticas, defines grupos y políticas una vez — y el plano de control se encarga del resto. El comando netbird expose va más lejos: elimina físicamente servicios de la exposición a Internet sin reconfigurar el firewall. Para una agencia que gestiona diez clientes o una empresa con oficinas distribuidas, esta es la reducción de superficie de ataque más impactante por hora invertida.

¿Necesitas infraestructura segura para tu agencia?

Pide tus VPS en tu cuenta, a tarifa pública, y mantén el control de tu red. Descubre lo que ofrecemos a las agencias.