Cómo instalar Pangolin y exponer tus servicios sin Cloudflare Tunnel
Índice de contenidos
- Puntos clave
- Qué es Pangolin y por dónde sale la conexión
- Qué necesitas antes de instalar Pangolin
- Cómo desplegar Pangolin en el VPS con Docker Compose
- Qué valores hay que tocar en config.yml
- Cómo instalar Newt en la máquina de tu red
- Exponer el primer servicio de principio a fin
- Qué autenticación trae de serie
- Qué mirar cuando un recurso no responde
- Pangolin frente a Cloudflare Tunnel y frente a una malla de WireGuard
- Para quién es Pangolin y para quién no
- Preguntas frecuentes
- ¿Necesito abrir algún puerto en mi router?
- ¿Puedo usar Pangolin sin túnel, como proxy inverso normal?
- ¿Qué pasa si el VPS se cae?
- Conclusión
- Fuentes
Pangolin es un proxy inverso con túnel y control de identidad que se instala en un VPS con Docker Compose. El conector Newt abre la conexión desde tu red hacia el servidor, así que en casa no queda ningún puerto escuchando, y Traefik emite los certificados de Let's Encrypt en el otro extremo.
Quieres llegar desde internet a un servicio que corre en tu casa. No tienes IP fija, no piensas abrir un puerto en el router y tampoco te apetece que todo tu tráfico pase por Cloudflare. Pangolin resuelve exactamente ese caso: un servidor pequeño en un VPS recibe las peticiones, las autentica y las manda por un túnel que tu red abrió hacia fuera. Esta guía instala Pangolin con Docker Compose, da de alta el conector Newt y publica un primer servicio.
Puntos clave
- El conector Newt sale de tu red hacia el VPS por WebSocket y WireGuard, de modo que en casa no hay ningún puerto escuchando ni hace falta IP fija.
- La versión estable en el momento de escribir esto es Pangolin 1.22.0, publicada el 27 de agosto de 2026, con Newt 1.16.0 del 19 de agosto.
- El despliegue son tres contenedores: el servidor de Pangolin, Gerbil para los túneles de WireGuard y Traefik v3.7 como entrada, con el complemento Badger haciendo de autenticación.
- Los certificados los pide Traefik a Let’s Encrypt por desafío HTTP, así que necesitas los puertos 80 y 443 abiertos en el VPS, más 51820 y 21820 en UDP.
- Ganas control y pierdes comodidad: el VPS pasa a formar parte de tu perímetro de seguridad, y su ancho de banda y su tiempo de servicio son ahora tuyos.
Qué es Pangolin y por dónde sale la conexión
Pangolin es un proxy inverso con túnel y control de identidad, publicado por Fossorial bajo licencia dual AGPL-3 y licencia comercial propia. El repositorio fosrl/pangolin[1] se abrió en septiembre de 2024 y a finales de agosto de 2026 acumula 22.550 estrellas y 769 bifurcaciones. Está escrito en TypeScript; el conector va en Go y sí es AGPL-3 puro.
La pieza que cambia la ecuación es la dirección de la conexión. En un montaje clásico de proxy inverso, tú abres un puerto en el router y esperas a que el mundo llame. Aquí ocurre al revés: el conector Newt, instalado en tu red, abre dos conexiones salientes hacia el servidor.
Una es un WebSocket contra el plano de control, por donde recibe la configuración. La otra es un túnel de WireGuard[2] contra Gerbil, por donde viajan los datos.

Cada nodo de Pangolin ejecuta tres procesos con nombre propio. Traefik termina el TLS y enruta. Badger es un complemento de Traefik que aplica la autenticación antes de dejar pasar nada. Gerbil mantiene los pares de WireGuard y hace de repetidor cuando la perforación de NAT falla.
Si ya tienes Traefik montado con Docker Compose, reconocerás casi todo el fichero de configuración.
Una garantía que conviene tener clara desde el principio: instalar un conector no expone nada. La documentación lo dice así: "Sites are software-defined proxies and deny traffic by default". Hasta que no defines un recurso y le das acceso a alguien, ese túnel no lleva a ninguna parte.
Qué necesitas antes de instalar Pangolin
Cuatro cosas, y ninguna es opcional.
Un servidor Linux con IP pública. El proyecto pide como mínimo 1 vCPU, 2 GB de memoria y 8 GB de disco, y recomienda 2 vCPU con 20 GB para uso normal. Por debajo de 1 GB de memoria vas a necesitar espacio de intercambio para que la instalación no se atragante.
Un dominio propio, con acceso a su zona de DNS. Necesitas un registro A comodín apuntando al VPS, porque cada servicio que publiques será un subdominio distinto:
Tipo: A Nombre: * Valor: IP_DE_TU_VPS TTL: 300
Tipo: A Nombre: @ Valor: IP_DE_TU_VPS TTL: 300
Cuatro puertos abiertos en el cortafuegos del VPS: 80 y 443 en TCP, 51820 en UDP para los túneles de los sitios y 21820 en UDP para los clientes. Ese último solo hace falta si vas a usar recursos privados con el cliente de escritorio.
Y una dirección de correo real, que es la que Let’s Encrypt asocia a tus certificados y la que usarás para la primera cuenta de administrador.
Cómo desplegar Pangolin en el VPS con Docker Compose
Existe un instalador automático (curl -fsSL https://static.pangolin.net/get-installer.sh | bash) que hace preguntas y escribe los ficheros por ti. Aquí vamos por el camino manual, que es el mismo resultado con la ventaja de que entiendes qué has puesto. Son cuatro pasos:
- Crea el árbol de directorios del proyecto.
- Escribe los tres ficheros de configuración con tu dominio.
- Levanta la pila y espera a que los contenedores queden sanos.
- Abre la página de alta inicial con el testigo que Pangolin imprime en su registro.
El árbol es fijo y conviene respetarlo, porque los montajes del compose dependen de él:
mkdir -p config/db config/letsencrypt config/traefik/logs
El fichero docker-compose.yml levanta las tres piezas. Fíjate en que Traefik no publica puertos: comparte la pila de red de Gerbil, que es quien los expone. Esa línea network_mode: service:gerbil es la que más gente borra por parecer rara, y sin ella el TLS deja de funcionar:
name: pangolin
services:
pangolin:
image: docker.io/fosrl/pangolin:latest
container_name: pangolin
restart: unless-stopped
volumes:
- ./config:/app/config
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3001/api/v1/"]
interval: "10s"
timeout: "10s"
retries: 15
gerbil:
image: docker.io/fosrl/gerbil:latest
container_name: gerbil
restart: unless-stopped
depends_on:
pangolin:
condition: service_healthy
command:
- --reachableAt=http://gerbil:3004
- --generateAndSaveKeyTo=/var/config/key
- --remoteConfig=http://pangolin:3001/api/v1/
volumes:
- ./config/:/var/config
cap_add:
- NET_ADMIN
- SYS_MODULE
ports:
- 51820:51820/udp
- 21820:21820/udp
- 443:443
- 80:80
traefik:
image: docker.io/traefik:v3.7
container_name: traefik
restart: unless-stopped
network_mode: service:gerbil
depends_on:
pangolin:
condition: service_healthy
command:
- --configFile=/etc/traefik/traefik_config.yml
volumes:
- ./config/traefik:/etc/traefik:ro
- ./config/letsencrypt:/letsencrypt
- ./config/traefik/logs:/var/log/traefik
networks:
default:
driver: bridge
name: pangolin
Con los ficheros escritos, el arranque es una orden y una comprobación:
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs pangolin | grep -i token
En el primer arranque Pangolin crea config/db/db.sqlite, Gerbil escribe su clave en config/key y el servidor imprime por consola un testigo de alta de un solo uso. Con ese testigo entras en https://pangolin.tudominio.com/auth/initial-setup y creas la cuenta de administrador. Si el navegador se queja del certificado durante el primer minuto, es normal: Let’s Encrypt todavía está validando.
Qué valores hay que tocar en config.yml
El fichero de la aplicación es corto y todo lo que trae de ejemplo hay que sustituirlo. Estos son los valores que no puedes dejar como vienen:
gerbil:
start_port: 51820
base_endpoint: "pangolin.tudominio.com"
app:
dashboard_url: "https://pangolin.tudominio.com"
log_level: "info"
domains:
domain1:
base_domain: "tudominio.com"
server:
secret: "genera-uno-con-openssl-rand-hex-32"
cors:
origins: ["https://pangolin.tudominio.com"]
flags:
require_email_verification: false
disable_signup_without_invite: true
allow_raw_resources: true
El secreto del servidor se genera con openssl rand -hex 32 y no se reutiliza de ningún otro sitio. Si algún día hay que rotarlo, la herramienta interna pangctl rotate-server-secret lo hace sin tocar la base de datos a mano.
Hay dos ajustes de red que se deciden ahora o nunca. Gerbil reparte direcciones dentro de 100.89.137.0/20, un rango de la zona CGNAT elegido para no chocar con las redes privadas habituales, y asigna una /30 a cada sitio, es decir cuatro direcciones. Si ese rango se solapa con tu red, cámbialo antes de registrar el primer Gerbil; después ya no.
En el fichero de Traefik hay dos sustituciones más. Una es tu correo en el resolvedor letsencrypt, que usa desafío HTTP contra el punto de entrada web. La otra es la versión del complemento Badger, fijada en v1.4.0 en la plantilla oficial.
Cómo instalar Newt en la máquina de tu red
Primero se crea el sitio en el panel, y el panel te devuelve tres datos: un identificador, un secreto y el punto de conexión. Con eso, la instalación del conector en la máquina de casa es directa:
curl -fsSL https://static.pangolin.net/get-newt.sh | bash
newt
--id 31frd0uzbjvp721
--secret h51mmlknrvrwv8s4r1i210azhumt6isgbpyavxodibx1k2d6
--endpoint https://pangolin.tudominio.com
Eso vale para probar. Para dejarlo funcionando, el proyecto documenta un servicio de systemd que lee las credenciales de /etc/newt/newt.env con permisos 600. Así el secreto no acaba en la lista de procesos ni en el historial del intérprete de órdenes.
Si prefieres contenedor, la imagen es fosrl/newt y las tres variables son PANGOLIN_ENDPOINT, NEWT_ID y NEWT_SECRET. La documentación propone además una variante más limpia: meter la configuración en un fichero JSON y pasarlo como secreto de Compose con CONFIG_FILE=/run/secrets/newt-config.
services:
newt:
image: fosrl/newt
container_name: newt
restart: unless-stopped
environment:
- PANGOLIN_ENDPOINT=https://pangolin.tudominio.com
- NEWT_ID=2ix2t8xk22ubpfy
- NEWT_SECRET=nnisrfsdfc7prqsp9ewo1dvtvci50j5uiqotez00dgap0ii2
Hay otros dos tipos de sitio y conviene saber que existen para descartarlos. El sitio local expone servicios que viven en el propio VPS, sin túnel. El sitio de WireGuard básico usa una conexión cruda sin canal de control, exige NAT para alcanzar otras máquinas de la red. Renuncia a los recursos privados, a las comprobaciones de estado y al descubrimiento del socket de Docker.
Newt es el camino recomendado y el único con el juego completo.
Exponer el primer servicio de principio a fin
Un recurso público de tipo HTTP es lo que la mayoría busca. Le asignas un nombre completo dentro del dominio que registraste. Añades uno o más destinos con su dirección y su puerto en la red remota, y eliges el sitio por el que se llega. Pangolin termina el TLS, aplica las reglas de acceso y solo entonces mete la petición en el túnel.
Con más de un destino en sitios distintos obtienes reparto de carga por turnos y relevo automático cuando una comprobación de estado falla. Con uno solo tienes lo que necesitas para publicar tu servidor de notas o tu panel de métricas.
El certificado no requiere ninguna acción por tu parte: al crear el recurso, Traefik pide el certificado a Let’s Encrypt contra el subdominio nuevo y lo guarda en config/letsencrypt/acme.json. Ese es el motivo por el que el puerto 80 tiene que seguir abierto aunque no sirvas nada sin cifrar.
Qué autenticación trae de serie
Todos los recursos públicos nacen con la sesión única de Pangolin activada. A partir de ahí las opciones se acumulan y se pueden compartir mediante políticas entre los recursos que elijas:
| Método | Para qué sirve |
|---|---|
| Sesión única de Pangolin | Usuario, contraseña y segundo factor dentro del propio panel |
| Proveedor de identidad externo | Google, Azure Entra ID, Okta o cualquier OIDC genérico |
| Usuarios y roles | Acceso por persona o por grupo, recurso a recurso |
| PIN o contraseña de acceso | Barrera simple para algo que no merece una cuenta |
| Cabecera de autorización | Peticiones de máquina a máquina con usuario y contraseña |
| Código temporal por correo | Lista blanca por dominio, del estilo *@tuempresa.com |
| Enlaces compartibles | Acceso puntual con caducidad, revocable borrando el enlace |
| Reglas ordenadas | Permitir o denegar por IP, por país o por ruta |
La lista blanca por dominio de correo es la que resuelve el caso doméstico más habitual: dar acceso a la familia sin crear cuentas. Los enlaces compartibles llevan un testigo que viaja como parámetro p_token o en las cabeceras P-Access-Token-Id y P-Access-Token, y hay que enviarlo en cada petición, no solo en la primera.
Un detalle que se pasa por alto: el acceso por enlace no propaga las cabeceras de identidad del usuario a la aplicación de destino. No sirve, por tanto, para integrar la sesión con la aplicación que hay detrás. Para eso, un proveedor de identidad propio como Pocket ID con llaves de acceso encaja mejor.
Qué mirar cuando un recurso no responde
Por orden de probabilidad:
- El DNS no resuelve. El comodín tarda en propagarse. Comprueba el subdominio concreto, no solo el dominio raíz.
- El certificado no se emite. Casi siempre es el puerto 80 cerrado, o el correo de ejemplo sin sustituir en el fichero de Traefik.
- El sitio aparece desconectado. Mira el registro de Newt en tu red. Si sale una y otra vez, es el UDP 51820 bloqueado en el VPS.
- El túnel está bien y el recurso da error 502. El destino apunta a una dirección que Newt no alcanza. Recuerda que resuelve desde tu red, no desde el VPS.
- Todo funciona salvo el cliente de escritorio. Falta el UDP 21820, que es el que usa el repetidor cuando la perforación de NAT no sale.
- Direcciones que se pisan. Si tu red usa el rango 100.64.0.0/10, el bloque por defecto de Gerbil colisiona y ya no se puede cambiar sin rehacer el registro.
Pangolin frente a Cloudflare Tunnel y frente a una malla de WireGuard
Las tres opciones evitan abrir un puerto. Se diferencian en quién ve tu tráfico y en qué te cuesta.
| Pangolin | Cloudflare Tunnel | Malla de WireGuard | |
|---|---|---|---|
| Conexión saliente desde tu red | Sí | Sí | Sí |
| Infraestructura que mantienes | Un VPS | Ninguna | Un nodo coordinador |
| Quién descifra el tráfico | Tu VPS | Cloudflare | Nadie por el camino |
| Acceso desde un navegador ajeno | Sí | Sí | No, hace falta cliente |
| Identidad y reglas por recurso | Integradas | Con Cloudflare Access | Fuera del alcance |
| Límite de subida | El de tu VPS | 100 MB en los planes gratuito y Pro | El de tu enlace |
| Coste mensual | El del VPS | Cero | Cero o el del nodo |
Ese límite de subida está documentado por la propia Cloudflare: 100 MB en los planes gratuito y Pro[3], 200 MB en Business y 500 MB o más en Enterprise. Si publicas un Immich o un Nextcloud, lo vas a encontrar el primer día.
Contra la malla, la comparación es distinta. Headscale o wg-easy te dan acceso privado entre tus propias máquinas, cifrado de extremo a extremo, sin intermediario que descifre nada. Lo que no te dan es una dirección que puedas mandar por correo a alguien que jamás instalará un cliente de red privada. Pangolin cubre los dos casos, con recursos públicos por navegador y recursos privados por cliente, y por eso su repositorio se describe hoy como red privada y proxy inverso a la vez.
Ahora la parte incómoda, y la documentación de Pangolin la escribe sin adornos: "By tunneling out to the VPS, you are effectively including the VPS in your security boundary, so you must secure it as part of your overall network strategy". Ese servidor deja de ser una caja alquilada y pasa a ser parte de tu red. Sus actualizaciones, su tiempo de servicio y su factura de tráfico son ahora responsabilidad tuya. Con Cloudflare eso lo lleva otro; el precio es que ese otro ve tus peticiones en claro.
Para quién es Pangolin y para quién no
Tiene sentido si publicas más de un servicio, quieres una sola pantalla de acceso delante de todos y te molesta que un tercero termine tu TLS. No lo tiene si publicas uno solo y no te importa que Cloudflare lo vea, porque estarías pagando un VPS por nada. Tampoco si tu requisito es que nadie ajeno pueda siquiera intentar entrar: eso lo hace mejor una malla cerrada como la alternativa libre a Tailscale.
Conviene además saber dónde está la línea de la edición libre. La Community Edition es AGPL-3 y desde la versión 1.22.0 incluye los recursos de SSH, RDP y VNC por navegador, además de HTTP y SSH privados. La Enterprise, con agrupación de nodos para alta disponibilidad, va con licencia comercial: gratuita por debajo de 100.000 dólares de facturación anual, de pago por encima. Un nodo suelto sigue siendo un punto único de fallo.
Preguntas frecuentes
¿Necesito abrir algún puerto en mi router?
No. El conector Newt inicia las dos conexiones hacia el VPS, una por WebSocket y otra por WireGuard. Los puertos que hay que abrir están en el VPS, no en tu casa. Tampoco necesitas IP fija ni DNS dinámico.
¿Puedo usar Pangolin sin túnel, como proxy inverso normal?
Sí. El instalador pregunta si quieres Gerbil, y hay un modo documentado sin túnel en el que se elimina ese contenedor y Traefik publica los puertos directamente. En ese caso pierdes la parte del conector y te queda un proxy inverso con autenticación.
¿Qué pasa si el VPS se cae?
Se cae todo lo que publicabas. La edición libre corre en un solo nodo y no tiene agrupación, así que el VPS es un punto único de fallo. La alta disponibilidad con más de un nodo es una función de la edición Enterprise.
Conclusión
Instalar Pangolin son cuatro ficheros, tres contenedores y un conector. Lo que compras con ese trabajo es un punto de entrada que controlas tú, con identidad integrada y certificados automáticos, sin abrir un puerto en casa. Lo que pagas es un VPS que ahora forma parte de tu perímetro y que tienes que cuidar como tal.
Si esa cuenta te sale, es la mejor respuesta que hay hoy para publicar servicios domésticos sin depender de nadie. La versión en inglés de esta guía está en How to install Pangolin.
Fuentes
Código fuente
Accede a todo el código fuente de este artículo en GitHub.
Ver en GitHub