你的家用網路沒有固定 IP,或者 ISP 直接給你 CGNAT,連動態 IP 都拿不到。但你想從外面連回家裡的 NAS、存取辦公室的測試服務,或者讓客戶看你開發中的 demo。
這個問題的解法一直都有,只是沒人用繁體中文把它講清楚過。
問題的本質
一般家庭的網路架構:
1 | 外部網際網路 → ISP → 家用路由器 (NAT) → 你的電腦 / NAS |
你的設備拿到的是路由器分配的私有 IP(例如 192.168.1.x),外面的人根本找不到你。就算設了 port forwarding,動態 IP 每次重新撥號就換一個,還是連不上。
frp(Fast Reverse Proxy)的解法很直觀:找一台有固定公網 IP 的 VPS 當中繼,讓你家的設備主動去連那台 VPS,建立一條持續的通道。外部請求打到 VPS,VPS 再透過這條通道轉進你的內網。
1 | 外部請求 → VPS (frps) ←→ 你的內網機器 (frpc) → 內部服務 |
因為連線是從內網往外發起的,不需要在路由器開任何 port,也不受 CGNAT 限制。
frp 的兩個角色
frp 只有一個執行檔,透過設定檔決定跑哪個角色:
- frps(server):跑在有公網 IP 的 VPS 上,負責接收外部流量和管理 client 連線
- frpc(client):跑在你想穿透的內網機器上,主動連回 frps,並宣告要轉發哪些服務
這個設計的好處是server 不需要知道 client 的 IP,只要 client 連得到 server 就行。
安裝
在 VPS 和內網機器上分別下載對應架構的 binary:
1 | # 查 CPU 架構 |
frp 從 v0.52 起改用 TOML 設定格式,舊的 INI 格式不再支援,網路上很多舊教學的設定檔格式已經不適用。
VPS 端(frps)設定
在 VPS 上建立 /etc/frp/frps.toml:
1 | bindAddr = "0.0.0.0" |
設定 systemd 服務,讓 frps 開機自動啟動:
1 | # /etc/systemd/system/frps.service |
1 | sudo systemctl daemon-reload |
記得在 VPS 的防火牆開放需要的 port:
1 | # UFW |
內網機器端(frpc)設定
在內網機器上建立 /etc/frp/frpc.toml:
1 | serverAddr = "你的VPS IP或網域" |
這個設定的意思:外部連線到 VPS 的 6000 port,會被轉發到這台內網機器的 22 port(SSH)。
同樣設成 systemd 服務:
1 | # /etc/systemd/system/frpc.service |
1 | sudo systemctl daemon-reload |
驗證是否成功:從外部用 SSH 連到 VPS 的 6000 port:
1 | ssh -p 6000 user@你的VPS_IP |
連上了就代表整條通道跑通了。
轉發 HTTP 服務
frp 支援 HTTP/HTTPS 的虛擬主機轉發,可以用域名區分不同的內網服務,全部走同一個 80/443 port:
VPS 端的 frps.toml 加上:
1 | vhostHTTPPort = 80 |
內網端的 frpc.toml 加上:
1 | [[proxies]] |
把 nas.你的網域.com 的 DNS A record 指向 VPS 的 IP,外部瀏覽器訪問這個網域就會被轉進內網的 192.168.1.100:5000。
如果要 HTTPS,可以在 VPS 上用 Caddy 或 Nginx 做 TLS termination,然後再轉給 frp 的 HTTP port,或者直接讓 frpc 帶上憑證:
1 | [[proxies]] |
幾個實際會踩的坑
frps 的 remotePort 需要預先開防火牆。每加一個 TCP proxy 就要記得在 VPS 防火牆補開對應的 port,這個常常被忘記,結果 frpc 日誌顯示連線成功,外部卻連不進來。
token 一定要設。裸跑沒有 token 的 frps,任何人只要知道你的 VPS IP 和 port 就能建立 proxy,把你的 VPS 當跳板用。不要跳過這步。
frpc 斷線重連是正常的。內網機器如果 IP 改變、網路重啟,frpc 會中斷,但設了 Restart=on-failure 之後會自動重連。如果需要更穩定的連線,可以搭配 transport.heartbeatTimeout 讓 server 更快偵測到 client 斷線。
NAT 類型影響延遲,但不影響連通性。frp 的流量都走 VPS 中繼,所以無論你的 NAT 有多嚴格都沒關係,代價是所有流量都要過 VPS 一趟,VPS 的頻寬和延遲會直接影響使用體驗。
跟 Cloudflare Tunnel 的差別
Cloudflare Tunnel 也能做類似的事,而且免費。但它有幾個限制:只支援 HTTP/HTTPS 和少數協定(SSH 需要走 Cloudflare Access),不支援原生 TCP/UDP 轉發,而且所有流量都走 Cloudflare 的基礎設施,你無法控制路由。
如果你需要轉發 SSH、資料庫連線、遊戲伺服器(UDP)、或者任何非 HTTP 的 TCP 服務,frp 加上自己的 VPS 是更直接的選擇。控制權也全在你手上。
要跑 frps 的 VPS 不需要很大,1 核 512MB 記憶體足以應付一般家用或小型辦公室的穿透需求。如果你需要一台臺灣本地的 VPS 來做中繼,讓內外網的延遲都低一點,NCSE Network 的方案從小規格開始就有 NVMe SSD 和臺灣是方電訊機房,細節可以到 ncse.tw 查看。