关于 localhost-run
一项指导使用 localhost.run 的技能,面向需要从公网访问本地应用的开发者。它涵盖通过 SSH 建立 HTTP、HTTPS 或 TLS 隧道、配置自定义域名及排查连接问题。
主要功能
- 01通过 SSH 转发本地服务
- 02HTTP 隧道自动提供 HTTPS
- 03TLS 透传支持非 HTTP 协议
- 04自定义域名与稳定子域名设置
- 05隧道故障排查指南
适用场景
- 01向同事分享本地应用预览
- 02将 webhook 请求转发到本地开发服务器
- 03从其他网络或设备测试本地应用
- 04通过自定义域名隧道访问数据库
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ilteoood/ harness --skill localhost-run安装后在 Claude Code 中输入/localhost-run确认已加载。
详细介绍
localhost.run
localhost.run 是一项无需客户端的隧道服务,可让本地运行的 HTTP、HTTPS 或 TLS 应用通过公共互联网访问。无需安装客户端,也无需注册账号即可使用免费套餐——它通过普通 SSH 工作,而大多数操作系统都已支持 SSH。
何时使用此技能
当用户希望执行以下操作时,请使用此技能:
- 与他人分享本地运行的应用(预览链接、演示、QA)
- 在
localhost开发服务器上接收 Webhook(Stripe、GitHub、Twilio 等) - 在手机或其他不同网络中的设备上测试应用
- 通过自定义域名隧道传输数据库或其他非 HTTP 协议
- 在 localhost.run 上设置自定义域名
- 诊断已有的 localhost.run 隧道故障、速度慢或不稳定的问题
- 替换 ngrok、Cloudflare Tunnel 或 localtunnel 等工具
快速开始
将本地应用的 8080 端口暴露到公网:
ssh -R 80:localhost:8080 localhost.run
该命令会打印一个公共 URL(类似
https://<random>.lhr.life),将 HTTP 和 HTTPS 流量转发到
localhost:8080。请保持 SSH 会话打开;会话关闭时隧道也会断开。
其他常用端口:
ssh -R 80:localhost:3000 localhost.run # Node / React dev server
ssh -R 80:localhost:5000 localhost.run # Flask / general
ssh -R 80:localhost:8000 localhost.run # Django / general
命令结构
ssh -R [customdomain:]bindport:host:hostport localhost.run
| 字段 | 含义 |
|---|---|
customdomain | 可选。供自定义域名用户使用;在此处传入完整域名。 |
bindport | HTTP 使用 80(自动提供 HTTPS),TLS 透传使用 443。 |
host | 本地主机名。通常为 localhost。如果 IPv6 出现问题,请使用 127.0.0.1。 |
hostport | 应用监听的本地端口。 |
如果无法连接 localhost:8080,请尝试 127.0.0.1:8080——某些操作系统会将
localhost 默认解析为 IPv6 [::1],而框架仅绑定到 IPv4。
SSH 选项
转发的 ssh -o 标志会正常工作。以下选项很有用:
# Keep the tunnel alive across NAT/router timeouts
ssh -o ServerAliveInterval=60 -R 80:localhost:8080 localhost.run
# Background it with autossh for auto-reconnect
autossh -M 0 -R 80:localhost:8080 localhost.run
输出格式
服务器会打印一个或多个 URL。解析时请选择机器可读的格式:
# Human-readable (default)
ssh -R 80:localhost:8080 localhost.run -- --output text
# JSON
ssh -R 80:localhost:8080 localhost.run -- --output json
将 -- 后的所有内容传递给 localhost.run,以转发标志而非传给 ssh。
HTTP 隧道
bindport 80 是默认模式。localhost.run 会:
- 将 HTTP 流量转发到应用
- 自动生成带托管证书的
https://端点 - 注入代理标头,让框架检测原始协议/主机/IP:
X-Forwarded-ForX-Forwarded-HostX-Forwarded-ProtoForwarded(RFC 7239)
如果下游代理已设置这些标头,请禁用标头注入:
ssh -R 80:localhost:8080 localhost.run -- --no-inject-http-proxy-headers
最佳实践:将本地应用配置为要求使用 HTTPS——通过注入的标头,应用会获得正确的协议,因此受信任的客户端能看到正确的 URL 和资源。
代理协议
对于使用 HAProxy 代理协议而非 X-Forwarded-* 的应用,请选择线缆版本:
ssh -R 80:localhost:8080 localhost.run -- --proxy-protocol-header-version v2
# v1 is the default; v2 is binary and slightly faster
TLS 透传
对于 PostgreSQL、SSH-over-TLS、自定义 TCP 等非 HTTP 协议,如果应用必须接收原始 TLS 字节并自行验证证书:
ssh -R 443:localhost:8443 localhost.run
- 应用需要自行提供并验证 TLS 证书
- 目前需要自定义域名(免费的
lhr.life域名不提供透传端点)
如果不想管理证书,请改用 HTTP 隧道——localhost.run 会处理 TLS 终止。
自定义域名
免费套餐会定期轮换域名。如需固定 URL,可通过 https://admin.localhost.run 注册自定义域名套餐,价格为每月 9 美元,按年计费。可选方案有两种:
- 使用自己的域名——提供 DNS,获得固定 URL
- 使用
lhr.rocks子域名——无需配置 DNS,先到先得
使用自定义域名连接
ssh -R yourdomain.com:80:localhost:8080 [email protected]
请注意 plan@ SSH 用户名。使用默认用户名时,连接会被拒绝。
DNS 设置
- 在
_lhr.yourdomain.com添加一条 TXT 记录以证明所有权 - 任选其一:
- 根域名(
example.com):添加三条 A 记录54.161.197.24754.82.85.24935.171.254.69
- 子域名(
app.example.com):添加一条指向cd.localhost.run的 CNAME 记录
- 根域名(
- 添加一条通配符 CNAME 记录
*.yourdomain.com → cd.localhost.run,以启用 无限子域名(api.yourdomain.com、web.yourdomain.com,……)
限制:每个套餐最多支持 5 条并发隧道;子域名数量受 Let's Encrypt 证书速率限制约束。
在 https://admin.localhost.run 管理账单、添加 SSH 密钥、更改或取消域名。
永久免费套餐
短期隧道无需客户端,也无需注册。为防范网络钓鱼,特意设置了两项限制:
- 域名会定期更改(连接时显示的 URL 不稳定)
- 有速度限制
如需使用有效期更长的免费域名,请在 admin.localhost.run 注册并上传 SSH 公钥。该密钥会将稳定的子域名绑定到你的机器。
如果你还没有密钥,请生成一个:
ssh-keygen -t ed25519
# Upload ~/.ssh/id_ed25519.pub to https://admin.localhost.run
自定义域名套餐不受这两项限制。
隧道连接我的
网站上记录了常见用法:
WordPress
WordPress 会将网站 URL 存储在数据库中,因此轮换免费域名会导致网站无法正常使用。你可以:
- 使用自定义域名(推荐用于任何 WordPress 网站)
- 或者使用免费域名时,安装
relative-url,并将WP_HOME和WP_SITEURL都设置为'https://' . $_SERVER['HTTP_HOST']
Web 框架
如果浏览器开发者工具显示请求仍指向 localhost:PORT,说明框架正根据请求生成绝对 URL,并忽略代理标头。请将框架配置为“受信任代理”/“反向代理”模式,以遵循 X-Forwarded-Proto 和 X-Forwarded-Host。大多数框架(Fastify、Express、Next.js、Rails、Django、Flask)都可通过设置或中间件启用此功能。
SSH 服务端(仅限自定义域名)
要通过隧道传输 SSH,需要使用自定义域名,并在客户端安装 stunnel,以便将 TCP 封装在 TLS 中:
- 从 SSH 服务端建立 localhost.run 隧道
- 在客户端机器上安装 stunnel
- 配置 stunnel 接受本地连接,并通过 TLS 将其转发到自定义域名
- 通过本地 stunnel 端点运行 SSH 客户端
安全性
- SSH 传输:无论 HTTP/TLS 设置如何,localhost.run 与本地应用之间都采用端到端加密
- HTTP 隧道:自动签发 HTTPS 端点;localhost.run 负责证书管理。配置本地应用,使其通过注入的
X-Forwarded-Proto标头要求使用 HTTPS - TLS 直通:localhost.run 不会解密流量;由你的应用直接验证证书
故障排查
| 症状 | 解决方法 |
|---|---|
免费套餐出现 Permission denied (publickey) | 使用 nokey 用户:ssh -R 80:localhost:8080 [email protected] |
| 自定义域名连接被拒绝 | 使用 plan 用户:ssh -R yourdomain.com:80:localhost:8080 [email protected] |
| 免费隧道 URL 一直变化 | 在 admin.localhost.run 添加 SSH 密钥,并避免使用 nokey 用户 |
connect_to localhost port 8080: failed | 本地应用无法通过该端口访问 — 在同一台机器上使用 curl http://localhost:8080 验证 |
| 隧道几分钟后断开 | 添加 ssh -o ServerAliveInterval=60,或使用 autossh -M 0 -R 80:localhost:8080 localhost.run 实现自动重连 |
| IPv4 / IPv6 不匹配 | 尝试使用 127.0.0.1 代替 localhost(或反过来) |
应用看到的是 http:// 而不是 https:// | 代理标头注入已禁用 — 重新启用注入,或在上游代理中设置 X-Forwarded-Proto: https。配置框架的“信任代理”模式。 |
浏览器仍访问 localhost:PORT | 框架正在生成绝对 URL — 配置其反向代理 / 受信任代理设置,使其信任 X-Forwarded-Host |
| 想将域名迁移到新账户 | 取消旧订阅,在新账户中设置域名,使用 TXT 记录验证,付款,然后发送邮件至 [email protected] 转移剩余额度 |
参考资料
- 主要文档:https://localhost.run/docs/
- CLI:https://localhost.run/docs/cli/
- HTTP 隧道:https://localhost.run/docs/http-tunnels/
- TLS 直通:https://localhost.run/docs/tls-passthru-tunnels/
- 自定义域名:https://localhost.run/docs/custom-domains/
- 永久免费套餐:https://localhost.run/docs/forever-free/
- 安全:https://localhost.run/docs/security/
- 常见问题:https://localhost.run/docs/faq/
- 管理 / 注册:https://admin.localhost.run
- 源代码:github.com/localhost-run/site