内网穿透 / 让外网访问本地服务:没有公网 IP 也能把本机服务给别人用

前言

本地跑了一个 Web 服务,想让同事、客户或者另一台电脑打开它,最常见的情况是:没有公网 IP、没有域名、也不想为了一个测试服务去申请云主机和备案。自己搭 frp 要写配置、要保活、要处理端口映射,成本比服务本身还高。

下面介绍的这个 Skill 就是把这件事压缩成一句话的事:你告诉它本机服务跑在哪个端口,它负责把这条链路打通,并在结束时验证外网确实能访问到。

这是什么

Skill 名称是「内网穿透 / 让外网访问本地服务」,坐标 @user_4643e8be/intranet-tunnel,由社区发布者 user_4643e8be 维护,当前版本 1.0.0,在 SkillHub 上属于 it-ops-security 分类,来源标记为 community。

它解决的问题很具体:让别人的电脑也能访问你本机或内网里跑着的 Web 服务。典型对象是金蝶 K3Cloud、IIS 站点、本地后台管理页、本地网站或本地接口。注意它面向的是 Web 服务,不是任意 TCP 程序的转发(资料中未提及非 HTTP 协议的支持,需要的话要先确认)。

核心功能

  1. 识别”想让别人访问我这个东西”的意图。触发词不限于术语:口语的”我想让别人的电脑也能打开我这个东西”、”让外面的人能访问我本机的 XX”、”把这个本地服务给别人用”、”远程访问我电脑上的 XX”、”没有公网 IP 怎么让朋友访问我的 XX”、”把本地后台暴露出去”,和技术说法”内网穿透”、”让外网访问我的 XX 服务”、”把本地服务暴露到公网”、”expose local service” 都在范围内。

  2. 优先走 cpolar。前提假设是用户没有公网 IP、没有域名、不想注册账号、想最快跑通,所以在默认路径下使用 cpolar:国内访问快、有免费档、能拿到一个短域名。代价是要走一次注册拿隧道地址。

  3. cpolar 不可用时兜底 TryCloudflare。当 cpolar 用不了,或者用户明确拒绝注册,就切到 Cloudflare 的 TryCloudflare 快速隧道:免注册、免域名、自带 HTTPS。这保证了在没有任何账号的前提下也能跑通。

  4. 内置国内环境踩坑处理。这是它和直接敲命令的差别所在,包含四件事:死代理诊断(先确认系统代理不是拦在中间的元凶)、GitHub 被墙时的镜像下载、后台进程保活、端到端验证(最后真的用外网地址请求一遍,而不是只报告”命令执行成功”)。

  5. 跨平台。已适配 Windows / macOS / Linux,三个平台走同一套流程,不用按平台各写一份脚本。

安装与启用

这个 Skill 基于通用 SKILL.md 格式,通过 SkillHub 分发。官方页面:

https://www.skillhub.cn/skills/user_4643e8be/intranet-tunnel
https://api.skillhub.cn/user_4643e8be/intranet-tunnel

需要说明的是,本次只拿到了 SkillHub 页面上的元数据与简介,没有抓到 SKILL.md 正文,因此安装命令和具体配置项无法从已核实资料中给出。按 SkillHub 的通用做法,是从上面的页面按坐标拉取该 Skill 并放进你的 Agent 配置目录,然后由 Agent 在会话中加载。具体路径与命令请以页面当时显示为准,不要照抄下面这类未经核实的写法。

另外,页面上该 Skill 带有 requires_api_key=true 的标签。这指的是隧道服务侧需要凭据,即 cpolar 的账号信息,而不是 Skill 本身另有一套密钥体系。启用后 Agent 会按上面的默认路径询问或读取凭据。

典型用法

下面给出基于资料的流程。实际执行时命令由 Agent 生成,你负责确认端口和隧道地址。

  1. 先确认服务本身是好的。服务还没跑起来就做穿透,后面验证一定失败,排查方向会被带偏。
# 在有公网可达性的网络里先自检
curl -I http://127.0.0.1:8080

这一步只是在确认本机服务在监听、能响应。

  1. 走 cpolar 默认路径,把本地端口映射出去。例如本地 IIS 或本地后台跑在 80 端口:
cpolar http 80

执行后 cpolar 会返回一个形如 https://xxx.r6.cpolar.cn 的短域名地址。把这个地址交给需要访问的人即可。

  1. 如果上面这一步失败,或者你不想注册 cpolar,切到 TryCloudflare 兜底:
cloudflared tunnel --url http://localhost:8080

它会打印一个 trycloudflare.com 的随机地址,自带 HTTPS,不需要域名和账号。这条路径适合临时演示和一次性验证。

  1. 端到端验证。用一个外网环境的请求去打这个域名,而不是在本机 curl 自己:
curl -I https://<拿到的隧道地址>

返回 200 才算打通。如果不通,按 Skill 内置的顺序排查:先看系统代理是不是把请求拦了,再看隧道进程是不是还活着(后台保活),最后看是不是因为依赖下载失败导致隧道根本没起。

适用场景与注意

适合的人:本地或内网跑 Web 服务、需要临时给外部人员访问权限的开发者和实施人员。金蝶 K3Cloud、IIS、本地后台、本地接口这类场景都在设计范围内。

要注意的地方:

  1. 暴露范围要自己控制。隧道一旦建立,拿到地址的人都能访问,等于把你的本地服务放进了一个半公开的入口。内部后台、未鉴权的接口不适合长期开着,验证完就关掉。

  2. 免费档的地址是共享的短域名。地址形态取决于隧道服务,稳定对外服务需要自己确认套餐与稳定性,资料中没有给出这方面的保证。

  3. 非 HTTP 协议未在资料中说明。如果你要转发的是数据库端口、远程桌面这类非 Web 流量,先确认该 Skill 是否支持,不要默认它能覆盖。

  4. 国内环境下依赖下载可能被墙。Skill 内置了镜像下载处理,但如果你所在网络对镜像也有限制,可能需要自己先准备好依赖。

结尾

这个 Skill 的价值在于把”没有公网 IP 也要让外网访问本地服务”这件事从配置 frp、写脚本、搞保活,压缩成一次对话加一次验证。默认路径用 cpolar 拿到短域名,注册受阻时自动退到 TryCloudflare 免注册隧道,并且内置了国内环境最常见的几类坑的处理方法。

官方地址:https://api.skillhub.cn/user_4643e8be/intranet-tunnel

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜