內網穿透 / 讓外網訪問本地服務:沒有公網 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

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

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

小夜