AI-Chain

我為什麼會把 frp 放進工具箱:一個把本地服務帶到外網的反向代理工具

frp 不是單純的內網穿透小工具,而是一個能把 NAT 後方服務受控暴露出去的反向代理層。這篇我用 SSH 與 Web 兩個場景,整理它的架構、上手方式、適合使用的情境,以及導入時最容易踩的坑。

分享:
我為什麼會把 frp 放進工具箱:一個把本地服務帶到外網的反向代理工具

我為什麼會把 frp 放進工具箱:一個把本地服務帶到外網的反向代理工具

如果你做過自架服務、遠端除錯、內網 Demo,或者只是想把家裡一台機器上的 Web 服務臨時分享給同事看,你大概都遇過同一個問題:服務明明已經跑起來了,卻卡在 NAT、防火牆、沒有公網 IP、公司網路限制,怎麼樣都碰不到。

我認為 frp 的價值,就在於它把這個老問題切成一個很乾淨的模型:一端放在有公網能力的伺服器上,另一端放在內網機器上,讓內網服務透過主動連線的方式被安全地暴露出去。它不是在替你「魔法般」解決網路邊界,而是提供一個簡潔、可控、可擴充的通道。

這也是我會把它放進工具箱的原因。frp 不是拿來炫技的,它是那種真的會在你需要的時候救你一命的基礎設施工具。

frp 到底是什麼

按照官方說法,frp 是一個快速的反向代理工具,可以把位於 NAT 或防火牆後面的本地服務暴露到網際網路。它目前支援 TCP、UDP、HTTP、HTTPS,另外也提供 P2P 連線模式。

如果用更白話的方式講:

  • 你的內網機器只要能主動連出去,就能把服務送到外部入口。
  • 公網伺服器負責對外接流量。
  • 內網機器負責把真正的服務端點接起來。
  • 你可以用網域、路由、埠轉發,甚至進一步做權限與加密設定。

這種設計的好處是,服務的位置和暴露方式被拆開了。你不需要為了臨時分享一個內網 Web UI,就把整台機器直接掛到公網,也不需要臨時開一堆奇怪的轉發規則。

我會怎麼理解它的架構

frp 的架構非常適合用兩個角色理解:

  • frps:服務端,通常跑在有公網 IP 的主機上。
  • frpc:客戶端,跑在內網或受限網路中的機器上。

官方文件的例子很典型:先把 frps 放到公網機器,再把 frpc 放到內網機器,然後由 frpc 主動連到 frps

我喜歡這個模型的原因有三個。

第一,它符合現實世界的網路限制。很多時候我們不是沒有服務,而是沒有辦法被外面直接打進來。主動連線的方式,剛好繞過了這個限制。

第二,它比較容易治理。入口在 frps,規則、埠、認證、觀察點都比較集中,不會散落在每一台內網機器上。

第三,它很適合漸進式擴充。今天你只想轉發 SSH,明天你可能想轉發 HTTP,後天你又想加上負載平衡、健康檢查、子網域路由,frp 都有對應的能力。

先看一個最小可行的使用方式

官方 README 給的 SSH 例子很適合拿來理解最基本流程。

1. 在公網伺服器上啟動 frps

# frps.toml
bindPort = 7000
./frps -c ./frps.toml

2. 在內網機器上設定 frpc

# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
./frpc -c ./frpc.toml

3. 從外部連回去

ssh -oPort=6000 test@x.x.x.x

這個範例很能說明 frp 的核心價值:

  • localPort 指向你內網機器真正提供服務的埠。
  • remotePort 則是公網端對外開放的入口。
  • 使用者從外部連到 remotePort,流量再被轉回內網服務。

如果你曾經用過傳統的臨時轉發、SSH 隧道或手寫 NAT 規則,你會立刻感受到差別:frp 是把這套事情變成一個正式的、可重跑的配置,而不是臨時湊出來的解法。

不只是 SSH:它真正實用的地方在 Web 與多協議轉發

很多人第一次接觸 frp 會從 SSH 開始,但我覺得它真正好用的地方,其實是在 Web 服務與多協議場景。

官方 README 明確提到它支援 TCP、UDP、HTTP、HTTPS,還有 P2P 模式。這意味著你可以把它用在很多更日常的情境:

  • 把家裡的 NAS 管理介面臨時給同事看。
  • 把內部測試站台暴露給客戶驗收。
  • 把本機的開發環境映射出去,讓手機或其他裝置直接訪問。
  • 把內網中的 API、Webhook receiver、除錯頁面接到公網入口。
  • 當你需要跨網段訪問服務時,把 frp 當成一個穩定中繼。

如果你把它當成「內網穿透」工具,會低估它。

我更傾向把它看成「受控的服務暴露層」。差別在於,內網穿透聽起來像單點技巧;服務暴露層則是一種可被長期治理的基礎設施能力。

我認為 frp 值得寫一篇文章的原因

原因不是它功能很多,而是它的功能分層很清楚。

1. 配置方式直接

官方文件有清楚的配置檔範例,而且還支援環境變數、拆分配置檔。這表示它不是只給你一個「能跑」的命令,而是給你一套能慢慢長大的配置結構。

2. 觀測與管理有入口

README 提到有 Server Dashboard、Client Admin UI、Monitor、Prometheus 整合。對我來說,這很重要。只要牽涉到代理、轉發、穿透,沒有可觀測性就很快會變成黑盒子。

3. 有安全相關的設計

它支援 Client Authentication、Token Authentication、OIDC Authentication、Encryption and Compression、TLS。這些功能不是裝飾品,而是你真的把服務暴露出去時一定會碰到的需求。

4. 有運維價值

Hot reloading、get proxy status、only allowing certain ports、health check、load balancing、port reuse、proxy protocol,這些都不是「新手第一天就會用」的東西,但它們決定了 frp 能不能進入正式工作流。

5. 有彈性

它不只是在做單純轉發,還有 URL routing、custom subdomain names、server plugins、client plugins、SSH tunnel gateway、VirtualNet。這讓它從單一工具慢慢變成一個平台型能力。

什麼情境下我會優先考慮 frp

如果你的需求屬於下面這幾種,我會認為 frp 很值得先看:

  • 你有一台能對外的伺服器,但內網環境不能直接開入站埠。
  • 你需要把本地服務短期或中期穩定暴露出去。
  • 你希望服務暴露流程是可重複、可版本化的。
  • 你不想依賴太多手工轉發設定。
  • 你希望 SSH、HTTP、HTTPS、UDP 等不同協議都能用同一套思路處理。

相反地,如果你的需求只是一次性的臨時分享,而且完全不想碰任何設定,那 frp 可能會顯得有點重。它不是最輕的那種工具,但它是更像正式工具的那種工具。

我會提醒你的幾個限制與坑

我不喜歡把工具講得太完美,因為這會讓人低估它的成本。

1. 你還是需要一台有公網能力的伺服器

frp 不是把網路憑空變出來。你仍然需要一個可以做入口的 frps,這通常意味著你要有一台 VPS、雲端主機,或者某種可對外的基礎設施。

2. 它不是零配置

你需要理解 frpsfrpc、埠、協議、域名、路由、認證。對工程師來說這不算高門檻,但也不是單點按鈕。

3. 安全不能偷懶

只要你把服務暴露到外部,就要面對認證、權限、TLS、可訪問範圍、白名單、日誌與監控。frp 提供能力,但不會替你做治理。

4. 防毒軟體可能誤判

官方 README 直接提醒,frpc 可能被某些防毒軟體誤判成惡意程式,因為它本質上就是會建立反向代理連線的網路工具。這點很實際,尤其在 Windows 環境。

5. 版本演進會影響你

README 也提到專案仍在持續開發中,且 v2 與 v1 不相容。這不是壞事,但代表你不能把它當成完全靜態不變的基礎模組來看待。若你準備長期使用,就要把升級和相容性放進維運考量。

frp 的功能多,但我會怎麼排序學習

如果是我自己導入,我會這樣學:

第一階段:先跑通最小鏈路

只學三件事:

  1. frps 怎麼啟動。
  2. frpc 怎麼連上去。
  3. 怎麼把一個內網服務成功映射到外部。

先不要急著碰太多高階功能。只要最基本的轉發鏈路通了,你就已經完成 80% 的導入價值。

第二階段:補上可觀測性與保護

接著再加:

  • dashboard。
  • monitor / Prometheus。
  • token 或 OIDC。
  • TLS。
  • 只允許必要埠。
  • 服務健康檢查。

這一步的目標不是讓功能變多,而是讓它能進入你真正敢長期使用的狀態。

第三階段:再碰高階功能

如果你已經確定它是你的常用工具,再去看:

  • hot reload。
  • load balancing。
  • custom subdomain names。
  • URL routing。
  • P2P 模式。
  • client/server plugins。

這些功能會讓 frp 從「能用」進化成「很好用」。

我對 frp 的總結

我會把 frp 視為一個很典型、但也很成熟的工程工具:它不是最華麗的,但它解決的是非常真實的問題。

它真正有價值的地方,不只是把內網服務送出去,而是把這件事變成一個可以治理、可以驗證、可以擴充的流程。對於做自架服務、遠端測試、內部工具暴露、臨時分享環境的人來說,這種工具的存在感非常高。

如果你只看表面,你會覺得它就是內網穿透。

如果你真的開始用,你會發現它其實是在幫你建立一個受控的服務入口。

這也是我會把 frp 放進工具箱的原因。


參考資料