Material Design 3 · CLI v1.0.5

Tu localhost,
visible en Internet

Proxy inverso seguro para desarrolladores. HTTP, HTTPS, JSON, imágenes y WebSocket — funciona detrás de NAT, VPN o red corporativa sin abrir puertos.

$ dtunnel --port 88080 https://a7f3c2.dtunnel.desarrollado.com ⟶ http://localhost:88080

Comenzar en 2 minutos

  1. Instala dtunnel

    Linux, macOS o WSL — un solo comando (incluye frpc):

    curl -O https://install.desarrollado.com/dtunnel/install && sudo bash install

    Windows sin WSL: npm install -g @desarrollado/dtunnel · npm

  2. Levanta tu app y abre el túnel
    python -m http.server 88080
    dtunnel --port 88080

Inicio rápido · Actualizar CLI · Changelog

Funciona con todo

code

Node / React / Vite

Dev servers en cualquier puerto.

deployed_code

Docker / K8s

Contenedores con puerto mapeado a localhost.

dns

Nginx / APIs

REST, JSON, archivos estáticos.

sync_alt

WebSocket

WSS a través del túnel sin config extra.

Cómo funciona

Sin abrir puertos en tu router: tu app sigue en localhost y dtunnel crea un puente seguro hacia Internet a través del VPS dtunnel.desarrollado.com.

  1. Instalas el CLI
  2. Levantas tu app local
  3. dtunnel --port N
  4. URL HTTPS pública
  5. Visitantes / webhooks

Arquitectura general

flowchart TB
  subgraph INET["Internet"]
    U["Visitante / Webhook"]
  end

  subgraph VPS["VPS — HestiaCP"]
    NG["Nginx :443 TLS"]
    WEB["Landing · Docs · Admin"]
    API["API Node :3001"]
    FRPS["frps broker\n:18080 HTTP · :7000 control"]
    NG -->|"dtunnel.desarrollado.com"| WEB
    NG -->|"/api/*"| API
    NG -->|"*.dtunnel.desarrollado.com"| FRPS
  end

  subgraph DEV["Tu máquina"]
    CLI["dtunnel CLI"]
    FRPC["frpc cliente"]
    APP["localhost:PUERTO\n(tu app)"]
    CLI -->|"POST /api/tunnels"| API
    CLI -->|"genera config"| FRPC
    FRPC --> APP
  end

  U -->|"HTTPS"| NG
  FRPC <-->|"túnel TCP :7000"| FRPS

Flujo de una petición

sequenceDiagram
  autonumber
  participant Dev as Desarrollador
  participant CLI as dtunnel CLI
  participant API as API
  participant FRPC as frpc
  participant FRPS as frps
  participant NG as Nginx
  participant User as Visitante

  Dev->>CLI: dtunnel --port 88080
  CLI->>API: POST /api/tunnels
  API-->>CLI: subdominio + token frp
  CLI->>FRPC: iniciar con frpc.toml
  FRPC->>FRPS: conectar :7000

  User->>NG: GET https://mi-app.dtunnel.desarrollado.com
  NG->>FRPS: proxy HTTP
  FRPS->>FRPC: reenviar al túnel activo
  FRPC->>Dev: http://127.0.0.1:88080
  Dev-->>User: respuesta HTTP/HTTPS

Componentes en el VPS

flowchart LR
  subgraph Publico["Expuesto a Internet"]
    P443["Nginx :443"]
    P7000["frps :7000\ncontrol clientes"]
  end

  subgraph Interno["Solo localhost / red interna"]
    P3001["API :3001"]
    P18080["frps :18080\nvhost HTTP"]
  end

  P443 --> P3001
  P443 --> P18080
  P7000 --> FRPS["frps"]
  FRPS --> P18080

  style P443 fill:#2b4278,color:#dce1ff
  style P7000 fill:#2b4278,color:#dce1ff

Más detalle en la documentación técnica y en architecture.md.

Seguridad y SSL

Los visitantes siempre acceden por HTTPS. El certificado TLS wildcard (*.dtunnel.desarrollado.com) lo gestiona Hestia con Let's Encrypt. Tu app local no abre puertos en el router: solo frpc inicia una conexión saliente autenticada.

Dónde se cifra el tráfico

flowchart LR
  subgraph PUBLIC["Internet — cifrado TLS"]
    U["Visitante / Webhook"]
    U -->|"HTTPS :443\nTLS 1.2 / 1.3"| NG["Nginx\nterminación SSL"]
    LE["Let's Encrypt\nwildcard *.dtunnel.*"]
    LE -.->|"certificado"| NG
  end

  subgraph VPS_INT["VPS — red interna"]
    NG -->|"HTTP localhost\n(no sale a Internet)"| FRPS["frps :18080"]
  end

  subgraph TUNNEL["Túnel frp — autenticado"]
    FRPS <-->|"TCP :7000\ntoken frp"| FRPC["frpc"]
  end

  subgraph LOCAL["Tu PC — loopback"]
    FRPC -->|"HTTP 127.0.0.1\nsolo local"| APP["tu aplicación"]
  end

  style PUBLIC fill:#1e3a5f,color:#dce1ff
  style VPS_INT fill:#282a31,color:#e3e2e9
  style TUNNEL fill:#2b4278,color:#dce1ff
  style LOCAL fill:#1e4e4f,color:#bcebec

Capas de protección

flowchart TB
  L1["① Borde HTTPS\nCertificado wildcard · TLS en Nginx"]
  L2["② Túnel frp\nToken compartido · solo frpc autorizado"]
  L3["③ API y cuentas\nJWT en login · reserva de subdominios"]
  L4["④ Localhost\nSin puertos abiertos en router/NAT"]

  L1 --> L2 --> L3
  L2 --> L4

  style L1 fill:#2b4278,color:#dce1ff
  style L2 fill:#424659,color:#dee0f9
  style L3 fill:#1e4e4f,color:#bcebec
  style L4 fill:#33353c,color:#e3e2e9
Cifrado

Visitante → VPS (https://). Certificado válido en el navegador.

Autenticado

frpcfrps con token; sin token no hay túnel.

Local

Tu app en 127.0.0.1 — no expuesta directamente a Internet.

Importante

Quien tenga la URL puede entrar. Protege rutas sensibles en tu app.

Guía completa: Seguridad y SSL en la documentación.

Precios

Gratis

$0

  • URL aleatoria
  • 1 túnel simultáneo
  • HTTP + HTTPS

Obtener ayuda

Consulta la documentación, abre un issue en GitHub o escríbenos a dtunnel@desarrollado.com.

Solución de problemas

Contacto

Email: dtunnel@desarrollado.com