mcpField
L
localhost-run

localhost-run

github.com/ilteoood云与 DevOps2201 次安装4 天前更新
代码仓库

关于 localhost-run

一项指导使用 localhost.run 的技能,面向需要从公网访问本地应用的开发者。它涵盖通过 SSH 建立 HTTP、HTTPS 或 TLS 隧道、配置自定义域名及排查连接问题。

主要功能

  1. 01通过 SSH 转发本地服务
  2. 02HTTP 隧道自动提供 HTTPS
  3. 03TLS 透传支持非 HTTP 协议
  4. 04自定义域名与稳定子域名设置
  5. 05隧道故障排查指南

适用场景

  1. 01向同事分享本地应用预览
  2. 02将 webhook 请求转发到本地开发服务器
  3. 03从其他网络或设备测试本地应用
  4. 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可选。供自定义域名用户使用;在此处传入完整域名。
bindportHTTP 使用 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-For
    • X-Forwarded-Host
    • X-Forwarded-Proto
    • Forwarded (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 美元,按年计费。可选方案有两种:

  1. 使用自己的域名——提供 DNS,获得固定 URL
  2. 使用 lhr.rocks 子域名——无需配置 DNS,先到先得
使用自定义域名连接
ssh -R yourdomain.com:80:localhost:8080 [email protected]

请注意 plan@ SSH 用户名。使用默认用户名时,连接会被拒绝。

DNS 设置
  1. 在 _lhr.yourdomain.com 添加一条 TXT 记录以证明所有权
  2. 任选其一:
    • 根域名(example.com):添加三条 A 记录
      • 54.161.197.247
      • 54.82.85.249
      • 35.171.254.69
    • 子域名(app.example.com):添加一条指向 cd.localhost.run 的 CNAME 记录
  3. 添加一条通配符 CNAME 记录 *.yourdomain.com → cd.localhost.run,以启用 无限子域名(api.yourdomain.com、web.yourdomain.com,……)

限制:每个套餐最多支持 5 条并发隧道;子域名数量受 Let's Encrypt 证书速率限制约束。

在 https://admin.localhost.run 管理账单、添加 SSH 密钥、更改或取消域名。

永久免费套餐

短期隧道无需客户端,也无需注册。为防范网络钓鱼,特意设置了两项限制:

  1. 域名会定期更改(连接时显示的 URL 不稳定)
  2. 有速度限制

如需使用有效期更长的免费域名,请在 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 中:

  1. 从 SSH 服务端建立 localhost.run 隧道
  2. 在客户端机器上安装 stunnel
  3. 配置 stunnel 接受本地连接,并通过 TLS 将其转发到自定义域名
  4. 通过本地 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] 转移剩余额度

参考资料

评论

支持 Markdown