koltyakov/expose

GitHub: koltyakov/expose

一款自托管的 HTTP 隧道工具,支持自动 HTTPS、内置 WAF 和实时仪表板,可将本地应用或静态站点安全地暴露到公网。

Stars: 4 | Forks: 0

# expose

expose logo

**expose** 是一个自托管的 HTTP 隧道。运行您自己的服务器,然后从任何机器暴露本地 HTTP 端口——无需第三方服务。 ![expose 客户端](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/dbc9b879ea153903.png) ## 功能特性 - **仅限 HTTPS** 的公开流量,支持自动 TLS (ACME) 或静态通配符证书 - **内置 WAF** 可在 SQL 注入、XSS、路径遍历和其他攻击到达您的应用之前将其阻止 - 通过 `expose static` 实现**静态站点发布**,适用于快速文档、SPA 和本地文件夹 - 通过 `expose.yml` 实现**多路由配置**——在一个子域名下通过基于路径的路由暴露多个服务 - **实时客户端仪表板**,包含请求日志、延迟百分位、WAF 计数器和连接统计信息 - **自动更新**——服务器和客户端可以在后台零停机自我更新 - **密码保护的隧道**,带有内置访问表单和边缘会话 cookie(按隧道或按配置) - **环境变量优先配置**——极简的 CLI 标志、`.env` 支持和交互式设置向导 - 隧道注册上的**速率限制**以防止滥用 - **持久登录**——使用 `expose login` 认证一次,凭据将保存在本地 - **自动重连**,带有指数退避和保活 ping - **基于 QUIC 的 HTTP/3 支持**——客户端可以使用兼容模式或协商的多流模式,并在 `--transport=auto` 中回退到 WebSocket ## 工作原理 ``` flowchart TB App["💻 Local app
127.0.0.1:PORT"] subgraph client["expose client"] Fwd["Forward"] --> Conn["Connect"] --> Reg["Register"] end subgraph server["expose server"] Hub{{"Session hub"}} Route["Route by hostname"] TLS["TLS · WAF"] DB[("SQLite")] Hub --> Route --> TLS Route -. resolve .-> DB end Browser["🌐 Browser"] App -- "HTTP" --> Fwd Hub <-- "WebSocket or HTTP/3 tunnel" --> Conn Conn -- "token" --> Hub Reg -- "API key" --> Route TLS -- "HTTPS *.domain" --> Browser ``` 1. **服务器** 终结 TLS,运行 WAF 检查,并根据主机名将请求路由到正确的隧道 2. **客户端** 通过 API 密钥注册,然后向服务器打开一个持久的 WebSocket 或 HTTP/3 隧道 3. 请求和响应通过隧道以 JSON 信封流传输,大主体使用二进制流 有关完整的请求生命周期和组件分解,请参阅 [架构概览](docs/architecture-overview.md)。 有关传输模式详情(`auto|ws|quic`)和 QUIC 要求,请参阅 [客户端配置](docs/client-configuration.md) 和 [UDP 部署拓扑](docs/udp-deployment-topologies.md)。 ## 快速开始 ### 前置条件 - 一台具有公网 IP 的 **服务器或 VPS**——或者配置了[端口转发](docs/port-forwarding.md)的家庭服务器 - 一个您控制的**域名**(例如 `example.com`) - 一个指向您服务器公网 IP 的 **DNS 通配符 A 记录**(`*.example.com`) ### 1. 安装 从 [Releases](https://github.com/koltyakov/expose/releases) 下载最新的二进制文件并将其放置在您的 `PATH` 中。 ### 2. 服务器 - 初始化并运行 在您的公网机器上,运行交互式设置(会为您写入一个 `.env` 文件): ``` expose server init # guided setup expose server # start the tunnel server ``` 然后为您的客户端创建一个 API 密钥: ``` expose apikey create --name default ``` ### 3. 客户端 - 登录并运行 在您想要暴露的任何机器上: ``` # 登录一次以在本地保存凭证 expose login # 将本地 HTTP 端口(例如 3000)暴露到互联网 expose http 3000 # 或将静态目录作为网站暴露 expose static ``` 打开终端中显示的 URL——就是这样。 有关完整的演练、DNS 设置指南和多路由配置,请参阅 [快速开始](docs/quick-start.md)。 ## 文档 请参阅 [docs/](docs/README.md) 文件夹获取所有指南——服务器和客户端配置、[静态站点](docs/static-sites.md)、TLS 模式、DNS 设置、部署、WAF、自动更新、故障排除等。 ## 致谢 - [ngrok](https://ngrok.com/)——HTTP 隧道的黄金标准,也是巨大的灵感来源。`expose` 的存在是因为我需要对基础设施有更多的自由度和控制权,但 ngrok 铺平了道路。 - [OpenAI](https://openai.com/) 和 [Anthropic](https://anthropic.com/)——AI 辅助开发将整个构建生命周期提升了 10 倍。 ## 许可证 MIT
标签:ACME, AppImage, CISA项目, EVTX分析, EVTX分析, HTTP/3, HTTPS, HTTP隧道, JSONLines, Ngrok替代, QUIC, SQL注入防护, WAF, WebSocket, Web应用防火墙, XSS防护, 依赖分析, 内网穿透, 反向代理, 实时仪表盘, 日志审计, 本地开发, 网络安全, 自动TLS, 自托管, 路径遍历防护, 边界网关, 隐私保护, 隧道工具, 零信任, 静态站点发布